rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样就可以解决同步数据的实时性问题。
一、rsync的优点与不足
rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过Linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify可以解决这个问题。
二、 初识inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
我们上面讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。
三、inotify相关参数
inotify-tools安装完成后,会生成inotifywait和inotifywatch两个指令,
inotifywait 用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。路径为/usr/bin/inotifywait
inotifywatch 用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。路径为/usr/bin/inotifywatch
/proc/sys/fs/inotify/max_queued_evnets
表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
/proc/sys/fs/inotify/max_user_instances
表示每一个real user ID可创建的inotify instatnces的数量上限。
/proc/sys/fs/inotify/max_user_watches
表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:
echo 30000000 > /proc/sys/fs/inotify/max_user_watches
四、inotifywait相关参数
Inotifywait是一个监控等待事件,可以配合shell脚本使用它,下面介绍一下常用的一些参数:
-m, 即--monitor,表示始终保持事件监听状态。
-r, 即--recursive,表示递归查询目录。
-q, 即--quiet,表示打印出监控事件。
-e, 即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等。
五、rsync+inotify应用案例
现在有两台web主机,由于没有共享存储,我们现在要实现的是对它们的根目录实现即时同步更新。
服务器主机 | IP地址 | 网页根目录 |
www1(内容发布方) | 172.16.251.50 | /www/a/ |
www2 (服务方) | 172.16.251.34 | /www/e/ |
5.1、www2主机的配置
在www2主机上安装xinetd,rsync
[root@station34 ~]# yum -y install xinetd rsync
配置/etc/rsyncd.conf
# Global Settings uid = nobody gid = nobody use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # Directory to be synced [mydata] path = /www/e/ ignore errors = yes read only = no write only = no hosts allow = 172.16.251.50 //只允许从172.16.251.50主机上同步数据过来 hosts deny = * list = false uid = root gid = root auth users =tom //用户名为tom secrets file = /etc/rsyncd.passwd //用户密码文件,需创建
创建密码文件
[root@station34 ~]# vim /etc/rsyncd.passwd
内容如下:
tom:tom
注:密码文件格式(明文):username:password
密码文件权限要设置为600
[root@station34 ~]# chmod 600 /etc/rsyncd.passwd
然后重启xinetd
[root@station34 ~]# service xinetd restart
5.2、配置www1主机
创建个/etc/rsyncd.passwd 密码文件
[root@station50 a]# echo "tom" >/etc/rsyncd.passwd
[root@station50 a]# chmod 600 /etc/rsyncd.passwd
创建个脚本rsync.sh
这个脚本的作用是通过inotify监控文件目录的变化,进而触发rsync进行同步操作。
[root@station34 ~]# vim /root/rsync.sh
内容如下:
#!/bin/bash src=/www/a/ des=mydata ip=172.16.251.34 /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src | while read file do rsync -vzrtopg --delete --progress $src tom@$ip::$des --password-file=/etc/rsyncd.passwd && echo "$src was rsynced" done
脚本相关解释如下:
--timefmt:指定时间的输出格式。
--format:指定变化文件的详细信息。
-e close_write,delete,create,attrib:表示inotify监控的事件(添加,删除,更新),close_write表示等待文件写完后再去触发rsync同步
给定可执行权限,放到后台运行:
[root@station50 a]# chmod 755 /root/rsync.sh
[root@station50 a]# /root/rsync.sh &
将此脚本加入系统自启动文件:
echo “/root/rsync.sh &”>>/etc/rc.local
5.3、测试rsync+inotify实时同步功能
在www1主机/www/a目录里创建个tom目录
查看www2主机上是否更新
在www1上创建个luxi文件,内容为“luxi is a girl"
www2上看是否同步
从上面这些图看出,/www/a目录下文件发生变化,/www/e目录下文件发生同步变化,那么我们这个系统就配置成功了。