rsync+inotify构建多服务器同步方案
测试环境如下:
系统:Centos 6.5 64位
软件安装
rsync安装(每台服务器上都要安装)
rpm -qa |grep rsync #查看rsync是否已安装
yum -y install rsync
inotify-tools安装(更新服务器上安装)
由于inotify特性需要Linux内核的支持,在安装inotify-tools前要先确认Linux系统内核是否达到了2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持,也可以用如下方法判断,内核是否支持
一、检查系统内核版本
[root@centos6 Music]# uname -rs
Linux 2.6.32-431.el6.x86_64
二、检查系统是否支持inotify
[root@centos6 Music]# ll /proc/sys/fs/inotify
总用量 0
-rw-r--r-- 1 root root 0 2月 15 13:38max_queued_events
-rw-r--r-- 1 root root 0 2月 15 13:38max_user_instances
-rw-r--r-- 1 root root 0 2月 15 13:38max_user_watches
有以上三项就代表系统默认是支持的,接着安装inotify-tools
yum -yinstall inotify-tools
rpm -qa |grepinotify
三、查看inotify默认参数
[root@centos6]#sysctl -a | grep max_queued_events
fs.inotify.max_queued_events =16384
[root@centos6]#sysctl -a | grep max_user_watches
fs.inotify.max_user_watches =8192
fs.epoll.max_user_watches =798863
[root@centos6]#sysctl -a | grep max_user_instances
fs.inotify.max_user_instances =128
四、修改inotify参数
4-1、命令临时生效修改
[root@centos6]# sysctl -w fs.inotify.max_user_instances=130
fs.inotify.max_user_instances = 130
4-2、文件永久生效修改
[root@centos6]#vi /etc/sysctl.conf
fs.inotify.max_user_instances=130
4-3、参数说明
max_user_instances:每个用户创建inotify实例最大值
max_queued_events:inotify队列最大长度,如果值太小,会出现错误,导致监控文件不准确
max_user_watches:同步的文件包含的目录数
五、配置rsync服务端(172.16.251.93、172.16.251.194)
port=8735
logfile=/var/log/rsync.log #指定rsync的pid存放路径
pidfile=/var/run/rsyncd.pid 指定rsync的日志存放路径
[R8] #模块配置名称
path=/Data/public/Music #同步的目录
usechroot=false
maxconnections=4
read only=no
list=no
uid=root
gid=root
auth users=R8 #认证此模块的用户名
secretsfile=/etc/rsyncd/rs.passwd #指定存放“用户名:密码”格式的文件
hosts allow=172.16.150.150 #白名单,可以访问此模块的主机
注:不同的分布式更新web节点,只需更改模块名称和path路径
rsync --daemon #启动rsync守护进程
echo "rsync --daemon" >>/etc/rc.local #将rsync服务加入到开机自启动文件
5-1、更新服务器(172.16.150.150)上创建同步目录
mkdir -p /Data/public/Music
5-2、更新服务器上添加inotify脚本:实现数据实时同步到各web节点
#!/bin/bash src=/Data/public/Music/ # 需要同步的源路径 des=R8 # 目标服务器上 rsync --daemon 发布的模块名称。 rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=172.16.251.194 # 目标服务器1 ip2=172.16.251.93 # 目标服务器2 user=R8 # rsync --daemon定义的验证用户名 cd${src} /usr/bin/inotifywait-mrq --format '%Xe %w%f' -emodify,create,delete,attrib,close_write,move ./ | while read file do INO_EVENT=$(echo $file | awk '{print$1}') INO_FILE=$(echo $file | awk '{print$2}') echo"-------------------------------$(date)------------------------------------" echo $file if [[$INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] then echo 'CREATEor MODIFY or CLOSE_WRITE or MOVED_TO' rsync -avzcR --port 8735--password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip1}::${des} && rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip2}::${des} fi if [[ $INO_EVENT =~ 'DELETE' ]] || [[$INO_EVENT =~ 'MOVED_FROM' ]] then echo 'DELETE or MOVED_FROM' rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip1}::${des} && rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip2}::${des} fi if [[ $INO_EVENT =~ 'ATTRIB' ]] then echo'ATTRIB' if [ ! -d "$INO_FILE" ] then rsync -avzcR--port 8735 --password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip1}::${des} && rsync -avzcR --port 8735--password-file=${rsync_passwd_file} $(dirname ${INO_FILE})${user}@${ip2}::${des} fi fi done
5-3、设置inotify脚本执行权限:
chmod a+x /rsync.sh
5-4、把脚本加入到开机自动启动文件
echo "/root/rsync.sh &">> /etc/rc.local
5-5、inotifywait 参数说明
inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;
inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息
从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:
语法格式:inotifywait[-hcmrq][-e][-t][--format][-timefmt][...]
-m: 即“--monitor” 表示始终保持事件监听状态。
-r: 即“--recursive” 表示递归查询目录
-q: 即“--quiet” 表示打印出监控事件
-o: 即“--outfile” 输出事情到一个文件而不是标准输出
-s: 即“--syslog” 输入错误信息到系统日志
-e: 即“--event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等,监控系统事件:创建,移动,删除,修改
-format: 指定输出格式;常用的格式符如:%w:表示发生事件的目录 %f:表示发生事件的文件 %e:表示发生的事件 %T:使用由-timefmt定义的时间格式
-timefmt:指定时间格式,用于-format选项中的%T格式
inotifywatch是收集数据的指令,它的相关参数:
语法格式:inotifywatch[-hvzrqf][-e][-t][-a][-d][...]
-fromfile:从文件中读取需要监控的文件或排除的文件,一个文件一行,排除的文件以"@"开头
-z: 即“-zero” 输出表格的行和列,即使元素为空
-r: 即“-recursive” 监视一个目录下的所有子目录
-t: 即“-timeout” 设置超时时间
-e: 即“-event” 只监听指定的事件
参考资料:http://www.ttlsa.com/web/let-infotify-rsync-fast/
http://www.it165.net/admin/html/201307/1556.html