一、rsync
1、rsync介绍
Rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync本来是用以取代rcp的一个工具,它当前由 rsync.samba.org维护。Rsync使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。
Rsync可以搭配rsh或ssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方Rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
2、rsync特点
(1)可以镜像保存整个目录树或文件系统;
(2)较高的数据传输效率;
(3)可以借助于ssh实现安全数据传输;
(3)支持匿名传输;
3、rsync命令的工作模式:
第一种模式:shell模式,也称作本地模式;
第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;
第三种模式:列表模式,仅列出源中的内容,-nv
第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求;
4、rsync命令的语法
rsync命令的选项: -n: 同步测试,不执行真正的同步过程; -v: 详细输出模式 -q: 静默模式 -c: checksum,开启校验功能 -r: 递归复制 -a: 归档,保留文件的原有属性; -p: 保留文件的权限; -t: 保留文件的时间戳; -l: 保留符号链接 -g: 保留属组 -o: 保留属主 -D:保留设备文件 -e ssh: 使用ssh作为传输承载; -z: 压缩后传输; --progress: 显示进度条 --stats: 显示如何执行压缩和传输
注意:rsync命令中,使用-r选项时,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;
二、rsync+inotify实现数据实时同步更新
1、rsync+inotify组合的必要性和好处(以下原理内容来源于网络)
(1)rsync
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
(2)inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。
2、实验拓扑图:
注意:做数据的实时同步时,一般是从客户端同步到服务端。
3、rsync服务端(172.16.140.1)配置
rsync没有自己的配置文件,要手动创建rsync的配置文件/etc/rsyncd.conf,该配置文件分为两部分全局配置段和共享配置段,共享配置段可以有多个。
[root@localhost ~]# vim /etc/rsyncd.conf # Global Settings #全局配置段 uid = nobody #以哪个用户的身份获取数据,nobody是最小权限的用户 gid = nobody use chroot = no #服务运行时,要不要锁定在家目录下 max connections = 10 #服务器端可允许的最大并发连接数 strict modes = yes #是否工作在严格模式下 pid file = /var/run/rsyncd.pid #rsync的pid文件路径 log file = /var/log/rsyncd.log #rsync的日志文件路径 # Directory to be synced #共享配置段 [rsync_data] #同步的共享目录名称,多个共享目录名称不能重名 path = /rsync_mydata #共享目录的实际路径,要同步的数据存放的位置 ignore errors = yes #表示在复制文件的过程中,若发生错误,是继续复制(yes)还是终止复制(no) read only = no #是否限定客户端以只读的方式从服务端拉取数据。若服务端共享的数据只用于下载,则设为yes。若允许客户端向服务端推送数据,则设为no。 write only = no #设为no表示只允许客户端往里写数据,不能拉取数据。 hosts allow = 172.16.0.0/16 #允许哪些主机来访问,做白名单的。 hosts deny = * # 做黑名单的。 list = false #是否允许用户列出文件列表 uid = root #以哪个用户的身份来获取数据 gid = root auth users = hjq #允许哪些用户来拉取数据,做身份验证 secrets file = /etc/rsyncd.passwd #存放用户验证的信息
编辑用户验证文件,其中用户名和密码都是明文的,所以该文件的权限要设为600。
[root@localhost ~]# vim /etc/rsyncd.passwd hjq:hjq [root@localhost ~]# chmod 600 /etc/rsyncd.passwd
rsync是依赖于超级守护进程xinetd工作的,要把xinetd也启动起来。
[root@localhost ~]# yum -y install xinetd [root@localhost ~]# chkconfig rsync on [root@localhost ~]# service xinetd start [root@localhost ~]# ss -tnl #rsyncd服务监听于873/tcp端口上
4、rsync客户端(172.16.40.1)配置
(1)安装inotify-tools
由于inotify特性需要Linux内核的支持,在安装inotify-tools前要先确认Linux系统内核是否达到了2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持。
也可以用如下方法判断,内核是否支持inotify。如果有以下三项,表示系统已经默认支持inotify。
三个参数的简单解析:
max_queued_evnets:表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
max_user_instances:表示每一个real user ID可创建的inotify instatnces的数量上限。
max_user_watches:表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches
若查明内核支持inotify,就可以使用yum安装inotify-tools,这里使用的版本是inotify-tools-3.14-1.el6.x86_64
# yum install -y inotify*
inotify-tools安装完成后,会生成inotifywait和inotifywatch两个指令。
inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。
inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。
(2)inotifywait命令参数解析
参数说明
inotifywait
语法:
inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
参数:
-h,--help
输出帮助信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
--fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, --monitor
接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-d, --daemon
跟--monitor一样,除了是在后台运行,需要指定--outfile把事情输出到一个文件。也意味着使用了--syslog。
-o, --outfile
输出事情到一个文件而不是标准输出。
-s, --syslog
输出错误信息到系统日志
-r, --recursive
监视一个目录下的所有子目录。
-q, --quiet
指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
--exclude
正则匹配需要排除的文件,大小写敏感。
--excludei
正则匹配需要排除的文件,忽略大小写。
-t , --timeout
设置超时时间,如果为0,则无限期地执行下去。
-e , --event
指定监视的事件。
-c, --csv
输出csv格式。
--timefmt
指定时间格式,用于--format选项中的%T格式。
--format
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X"分隔
%T 使用由--timefmt定义的时间格式
(3)配置inotify
创建一个共享目录,用于存放要同步的数据
# mkdir /inotify_data
提供一个脚本
# vim /tmp/inotify_rsync.sh #!/bin/bash host=172.16.140.1 #rysnc服务端的地址 src=/inotify_data/ #rsync客户端的用于同步数据的目录 dst=rsync_data #rysnc服务端导出的共享目录名 username=hjq #rysnc服务端上/etc/rsyncd.passwd这个文件中定义的用户名 /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $src $username@$host::$dst echo "${files} was rsynced" >> /var/log/rsync.log 2>&1 #将信息写入日志 done
在rsync客户端提供/etc/rsyncd.passwd密码文件,在rsync客户端中只要提供rsync同步的密码就行了,不用提供用户名。
#vim /etc/rsyncd.passwd hjq # chmod 600 /etc/rsyncd.passwd #密码文件的权限应为600
赋予该脚本执行的权限
# chmod +x /tmp/inotify_rsync.sh
把脚本添加到开机启动的文件中
# echo "/tmp/inotify_rsync.sh" >> /etc/rc.d/rc.local
5、实验操作
rsync服务端(172.16.140.1):
刚开始rsync服务端的/mydata共享目录,没有文件
rsync客户端(172.16.40.1):
运行脚本
复制文件到rsync客户端的共享目录上
rsync服务端(172.16.140.1):
数据成功同步过来了!