一、rsync的不足
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过crontab方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
二、inotify简介
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
三、安装inotify工具inotify-tools
1、检测系统内核能否支持inotify特性
[root@webserver ~]# uname -r2.6.32-504.el6.i686[root@webserver ~]# ll /proc/sys/fs/inotify总用量 0-rw-r--r-- 1 root root 0 8月 4 21:35 max_queued_events-rw-r--r-- 1 root root 0 8月 4 21:35 max_user_instances-rw-r--r-- 1 root root 0 8月 4 21:35 max_user_watches验证机器是否能支持inotify特性只要内核版本在2.6.13之上,同时在查看系统中有上面三个文件就可以说明该系统默认支持inotify,之后就可以安装inotify-tools工具了。
2、关于/proc/sys/fs/inotify目录内文件说明
/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可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。
3、安装inotify工具
[root@webserver ~]# yum install inotify-tools
inotify-tools安装完成后,会生成inotifywait和inotifywatch两个指令,可以用 rpm -ql inotify-tools 来查询安装命令的路径及相关文件。其中,inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。 inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。
4、inotifywait命令常用选项简单说明及举例
-m,即--monitor,表示始终保持事件监听状态。
-r, 即--recursive,表示递归查询目录。
-q, 即--quiet,表示打印出监控事件。
-e,即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等。
--timefmt:指定时间的输出格式。
--format:指定变化文件的详细信息
持续监听/tmp目录及其子目录的文件变化,监听事件包括文件被修改、删除、创建、移动、属性更改,显示到屏幕:
[root@webserver ~]# /usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \> -e modify,delete,create,move,attrib /tmp/2015/08/05-19:46:17 /tmp/ a2015/08/05-19:46:17 /tmp/ a2015/08/05-19:46:39 /tmp/ a2015/08/05-19:47:14 /tmp/ a
上述输出信息是另开一个终端,然后在/tmp目录下做些文件被修改、删除、创建、移动、属性更改的操作后的输出结果。
四、rsync+inotify应用举例
1、应用描述
为了保证内容发布节点即主节点的机器的文件和服务节点1和服务节点2的数据是一至的,这里使用rsync来进行文件同步,为了保证能达到实时同步的效果,这里就需要inotify,即:使用inotify监视/data目录内文件的变化,如果文件有变动,那么就启动rsync,将文件实时同步到两个服务节点。
2、实验环境介绍
hostname | IP | 系统版本 | 数据目录 | |
主节点 | webserver | 192.168.1.20 | CentOS 6.6 | /data/web |
服务节点1 | web1 | 192.168.1.110 | CentOS 6.6 | /data/web |
服务节点2 | web2 | 192.168.1.8 | CentOS 6.6 | /data/web |
3、配置服务节点的rsyncd.conf文件
web1节点rsyncd.conf配置如下:
[root@web1 ~]# cat /etc/rsyncd.confuid = nobadygid = nobadyuse chroot = nomax connections = 10strict modes = yes pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.log[web1]path = /data/web/comment = web1 fileignore errorsread only = noweite only = nohosts allow = 192.168.1.20hosts deny = *list = falseuid = rootgid = rootauth users = web1usersecrets file = /etc/web1.passwd[root@web1 ~]# cat /etc/web1.passwdweb1user:redhat[root@web1 ~]# chmod 600 /etc/web1.passwd
web2节点rsyncd.conf配置如下:
[root@web2 ~]# cat /etc/rsyncd.conf uid = nobadygid = nobadyuse chroot = nomax connections = 10strict modes = yes pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.log[web2]path = /data/web/comment = web2 fileignore errorsread only = noweite only = nohosts allow = 192.168.1.20hosts deny = *list = falseuid = rootgid = rootauth users = web2usersecrets file = /etc/web2.passwd[root@web2 ~]# cat /etc/web2.passwdweb2user:redhat[root@web2 ~]# chmod 600 /etc/web2.passwd
4、安装守护进程xinetd并启动rsync后台服务
首先直接在两个从节点yum安装xinetd软件包,然后在修改xinetd关于rsync的配置文件:
[root@web1 ~]# vim /etc/xinetd.d/rsync# default: off# description: The rsync server is a good addition to an ftp server, as it \# allows crc checksumming etc.service rsync{ disable = no //默认的为yes将其改为no flags = IPv6 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID}[root@web1 ~]# /etc/init.d/xinetd start正在启动 xinetd: [确定][root@web1 web]# ss -tnl |grep 873LISTEN 0 64 :::873 :::*
由于两台从节点的机器都需要执行上述操作,这里就只写一个,同时也可以使用别的方法启动rsync后台服务这里就不在介绍了。
5、创建内容发布节点脚本
配置内容发布节点的主要工作是将生成的静态网页实时的同步到集群中两个个服务节点,这个过程可以通过一个shell脚本来完成,脚本内容大致如下:
[root@webserver ~]# cat rsync.sh #!/bin/bashhost1=192.168.1.110host2=192.168.1.8src=/data/web/dst1=web1dst2=web2user1=web1useruser2=web2user/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \| while read filesdo /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $src $user1@$host1::$dst1 /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $src $user2@$host2::$dst2 echo "${files} was rsynced" >>/tmp/rsync.log 2>&1done[root@webserver ~]# mv rsync.sh /data/web/[root@webserver ~]# chmod +x /data/web/rsync.sh [root@webserver ~]# cat /etc/rsync.passwd redhat[root@webserver ~]# chmod 600 /etc/rsync.passwd
6、测试rsync+inotify组合是否能实时同步
[root@webserver web]# /data/web/rsync.sh &[root@webserver web]# ps aux |grep rsync.shroot 1178 0.0 0.0 6676 816 pts/0 S 21:24 0:00 /bin/bash /data/web/rsync.shroot 1275 0.0 0.0 5976 748 pts/0 S+ 22:05 0:00 grep rsync.sh
通过上面可以看到rsync.sh以在后台运行了,下面可以将文件复制到/data/web/目录下了来进行测试。
[root@webserver ~]# ls /tmp/shell/cpcmd.sh cpcom.sh jingxiang.sh[root@webserver ~]# cp /tmp/shell/* /data/web/
查看两台从节点机器/data/web/目录:
[root@web1 web]# lscpcmd.sh cpcom.sh jingxiang.sh rsync.sh [root@web2 web]# lscpcmd.sh cpcom.sh jingxiang.sh rsync.sh
通过上面的验证可以得到搭建的rsync+inotify组合进行文件实时同步环境以OK,然而有时会遇到这样的情况:向inotify监控的目录(这里是/web/web/)写入一个很大文件时,由于写入这个大文件需要一段时间,此时inotify就会持续不停的输出该文件被更新的信息, 这样就会持续不停的触发rsync去执行同步操作,占用了大量系统资源,那么针对这种情况,最理想的做法是等待文件写完后再去触发rsync同步。 在这种情况下,可以修改inotify的监控事件,即:“-e close_write,delete,create,attrib”。
参考:高俊峰《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》