您的位置:首页 > 其它

rsync+inotify实现数据实时同步

2014-08-26 18:46 302 查看
一、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):



数据成功同步过来了!

本文出自 “恒则有成” 博客,请务必保留此出处http://hjqjk.blog.51cto.com/5970897/1545353
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: