rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
rsync功能:
1)作为命令,实现本地-远程文件同步
2)作为服务,实现本地-远程文件同步
rsync特点:
1)可以镜像保存整个目录树和文件系统
2)可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等
3)传输效率高,使用同步算法,只比较变化的
4)支持匿名传输,方便网站镜像;也可以做验证,加强安全
rsync同类服务:
1)sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。
2)async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。
3)rsync 远程同步:remote synchronous
rsync传输方式 :
rsync 的传输方式至少可以通过三种方式来运作:
1)在本机上直接运行,用法就与 cp 几乎一模一样,例如:
rsync -av /etc /tmp (将 /etc/ 的数据备份到 /tmp/etc 内)
2)通过 rsh 或 ssh 的信道在 server / client 之间进行数据传输,例如:rsync -av -e ssh [email protected]:/etc /tmp (将 rsh.server 的 /etc 备份到本地主机的 /tmp 内)
3)直接通过 rsync 提供的服务 (daemon) 来传输,此时 rsync 主机需要启动 873 port:要求如下
1.你必须要在 server 端启动 rsync,看 /etc/xinetd.d/rsync 即可;
2.你必须编辑 /etc/rsyncd.conf 配置文件;
3.你必须设定好 client 端联机的密码数据;
4.在 client 端可以利用:
rsync -av user@hostname::/dir/path /local/path
语法:
rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path]
选项与参数:
-v :查看模式,可以列出更多的信息,包括镜像的文件名等;
-q :与 -v 相反,安静模式,略过正常信息,仅显示错误讯息;
-r :递归复制!可以针对“目录”来处理。
-u :仅更新 (update),若目标文件较新,则保留新文件不会覆,即不同步;
-l :复制链接文件的属性,而非链接的目标源文件内容,也就是保留软连接。
-L :加上该选项后,同步软链接时会把源文件给同步
-p :复制时,连同属性 (permission) 也一并复制。
-g :保存源文件的拥有属组;
-o :保存源文件的属主;
-D :保存源文件的设备属性 (device)
-t :保存源文件的时间参数;
-I :忽略更新时间 (mtime) 的属性,文件比对上会比较快速;
-z :在数据传输时,加上压缩的参数!
-e :使用的信道协议,例如使用 ssh 通道,则 -e ssh
-a :相当于 -rlptgoD ,所以这个 -a 是最常用的参数了
–delete :删除DEST中SRC没有的文件
–exclude :过滤指定文件,如–exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步。
例如: 将本机 /etc 的数据备份到 /tmp 目录下:
rsync -av /etc /tmp
rsync通过ssh方式同步
推文件:把本地文件同步到远端服务器
例如把本地/tmp目录下内容复制到远端服务器192.168.100.10下的student用户家目录下。
rsync -av /tmp [email protected]:~
[email protected]'s password: <==输入对方主机的 student 密码
receiving file list ... done
拉文件:把远端的内容复制到本机
例如:利用 student 的身份登录远程主机192.168.100.10 将其目录复制到本机 /tmp
rsync -av [email protected]:~ /tmp
[email protected]'s password: <==输入对方主机的 student 密码
receiving file list ... done
使用-e “ssh -p 22” 指定端口:
rsync -av -e ssh [email protected]:~ /tmp
rsync -av -e "ssh -p 22" [email protected]:~ /tmp
rsync 通过服务(daemon)的方式同步
server端配置:
在server端主要有三个个文件rsync.conf、rsyncd.passwd和rsyncd.motd
1)编辑配置文件/etc/rsyncd.conf
2)启动服务rsync --daemon
3)格式:rsync -av test1/ [email protected]::test/
rsyncd.conf样例:
#port=873
motd file =/etc/rsyncd.motd #欢迎文件
log file=/var/log/rsync.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
#address=192.168.31.25
use chroot=no
max connections=100
read only=false
list=true
uid=rsync
gid=rsync
auth users=rsync #rsync用户与linux用户无关。
secrets file=/etc/rsyncd.passwd
hosts allow=192.168.31.0/24(多个ip以空格隔开,也可以写ip段:192.168.31.0/24)
[backup]
comment=backup by #注释信息
path=/backup #最好与模块backup名一样加粗样式
rsyncd.conf配置文件详解 :
port:指定在哪个端口启动rsyncd服务,默认是873端口。
log file:指定日志文件。
pid file:指定pid文件,这个文件的作用涉及服务的启动、停止等进程管理操作。
lock file:指定存放锁的目录
address:指定启动rsyncd服务的IP。假如你的机器有多个IP,就可以指定由其中一个启动rsyncd服务,如果不指定该参数,默认是在全部IP上启动。
[]:指定模块名,里面内容自定义。
path:指定数据存放的路径。
use chroot true|false:表示在传输文件前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,如果你的数据当中有软连接文件,阿铭建议你设置成false。
max connections:指定最大的连接数,默认是0,即没有限制。
read only ture|false:如果为true,则不能上传到该模块指定的路径下。
list:表示当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏。
uid/gid:指定传输文件时以哪个用户/组的身份传输。
auth users:指定传输时要使用的用户名。
secrets file:指定密码文件,该参数连同上面的参数如果不指定,则不使用密码验证。注意该密码文件的权限一定要是600。格式:用户名:密码
hosts allow:表示被允许连接该模块的主机,可以是IP或者网段,如果是多个,中间用空格隔开。
当设置了auth users和secrets file后,客户端连服务端也需要用用户名密码了,若想在命令行中带上密码,可以设定一个密码文件
rsync -avL [email protected]::backup /tmp/test/ --password-file=/etc/pass
#92.168.31.130::backup这个backup是模块
其中/etc/pass内容就是一个密码,权限要改为600
注意:配置文件里面不能有注释否则同步时出现以下错误:
rsync -avz /tmp/ [email protected]::data – password-file=/etc/rsyncd.passwd
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
编辑rsyncd.motd
vim /etc/rsyncd.motd
welcome to use rsync-services! #欢迎信息
编辑密码文件rsyncd.passwd
格式为:
用户名:密码(auth users设置值一样)
echo "rsync:123" >/etc/rsyncd.passwd
#用户与auth users设置值一样
授权:权限设置为600其他用户不能读取、
chmod 600 /etc/rsyncd.passwd
创建服务端共享目录backup
mkdir /backup
创建指定传输文件时所用的用户rsync
useradd rsync -s /sbin/nologin -M
#创建虚拟用户rsync
授权虚拟用户rsync对/backup目录操作权限
chown -R rsync.rsync /backup/
#改变属主
启动rsync 服务
rsync --daemon #启动rsync服务端服务
netstat --lntup|grep rsync #查看启动情况
echo "rsync --daemon" >/etc/rc.local #加入开机启动
客户端配置 :
创建密码文件:
echo "123" > /etc/pass #客户端只要写入密码即可,因为用户就是连接的用户
chmod 600 /etc/pass #改变权限
客户端rsync语法如下:
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
#拉命令
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
#推命令
例如:将/tmp/目录下的内容推到远端服务器共享目录/backup下
rsync -avzL /tmp/ [email protected]::backup --password-file=/etc/pass#第一种方法
rsync -avzL /tmp/ rsync://[email protected]/backup --password-file=/etc/pass #第二种方法
例如:将rc.local和cron内容定时备份
写一个bak.sh脚本然后放到定时任务里。
vim /server/scripts/bak.sh
#!/bin/sh
path=/backup
dir="`ifconfig eth0|awk -F '[ :]+' 'NR==2 {print $4}'`_$(date +%F)"
mkdir $path/$dir -p &&\
/bin/cp /var/spool/cron/root $path/$dir/cron_root_$(date +%F)
/bin/cp /etc/rc.local $path/$dir/rc.local_root_$(date +%F)
rsync -az $path/ [email protected]::backup/ --password- file=/etc/pass
crontab -e
0 01 * * * /bin/sh/server/scripts/bak.sh >/dev/null 2>&1 #每天一点同步
rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。
要在在客户端安装rsync软件(需要备份的服务器上安装)。
查看服务器内核是否支持inotify
ll /proc/sys/fs/inotify
安装inotify-tools
yum install make gcc gcc-c++ #安装编译工具
inotify-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
上传inotify-tools-3.14.tar.gz到/usr/local/src目录下
cd /usr/local/src
tar zxvf inotify-tools-3.14.tar.gz #解压
cd inotify-tools-3.14 #进入解压目录
./configure --prefix=/usr/local/inotify #配置
make #编译
make install #安装
设置系统环境变量,添加软连接
echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh
source /etc/profile.d/inotify.sh #使设置立即生效
echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
ln -s /usr/local/inotify/include /usr/include/inotify
修改inotify默认参数(inotify默认内核参数值太小)
在/proc/sys/fs/inotify目录下有三个文件。
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行inotifywait或inotifywtch命令进程数
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
echo “50000000” >/proc/sys/fs/inotify/max_user_watches
echo “50000000” >/proc/sys/fs/inotify/max_queued_events
echo "65535" >/proc/sys/fs/inotify/max_user_instances
例如:测试客户端/data目录变化
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib,close_write /data #代表监控的事件是属性,删除,创建修改
#实际上只要delete,create,close_write这几个就可以
创建脚本,实时触发rsync进行同步
mkdir -p /server/scripts
vim inotify.sh
#!/bin/bash
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib,close_write /data | while read file
do
cd /data &&
/usr/bin/rsync -az --progress ./ [email protected]::web_log --password-file=/etc/rsync.pass
/usr/bin/rsync -az --delete --progress ./ [email protected]::web_log --password-file=/etc/rsync.pass
echo "${file} was rsynced" >> /var/log/rsync.log 2>&1
done
添加脚本执行权限
chmod +x /server/scripts/inotify.sh
设置脚本开机自动执行
vi /etc/rc.local
/bin/sh /server/scripts/inotify.sh &