以前一直用unison进行双向同步,今天突然想用一个源对所有其它服务器进行同步,并保持高度一致,自然就想到了rsync+inotify,google搜索一通,发现大家发的技术文档大致都差不多,不动手不知道,一动手还问题不少,现把步骤写下来,以便其它同学少走歪路,也提醒自已。
Rsync+inotify的工作原理是,源机器上的inotify实时监控主机上的某目录,如果发现有增删改的操作就把相应文件使用rsync推送到相应客户机上。
1 、安装rsync,inotify
Yum install rsync inotify-tools –y
2、配置需要同步的机器,即被推送接受同步文件的机器,这里称为客户机
uid = std01
gid = std01
use chroot = no
max connections = 100
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[web1]
path = /data/www1/
ignore errors
read only = no
list = no
hosts allow = 192.168.42.0/255.255.255.0
auth users = www1
secrets file = /etc/www1.pwd
这里有个重要的问题大家都没有提,就是uid,gid,这里用户和组必须与path目录的用户与组保持一致,否则会出错各种权限错误。源机器推送过来的各种权限文件都会被改为uid,gid指定的用户和组。
其次是认证文件,echo “www1:123” > /etc/www1.pwd,这里用户名与密码要都写进去。并改
权限,chmod 600 /etc/www1.pwd
3、源机器配置
#!/bin/bash
host1=192.168.42.8
src=/data/www/
des1="web1"
user1="www1"
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib \
${src} \
| while read file
do
rsync -vzrtopg --delete --progress ${src} ${user1}@${host1}::${des1} --password-file=/etc/www1.pwd &&
echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
#echo "---------------------------------------------------------------------------"
done
源机器主要是一个inotify的监控脚本,这个脚本如同一个守护进程,会一直运行监控着相应目录的增删减动作,一经发现,立即运行rsync进行同步(推送),不要担心源目录下的文件权限与客户机的不一致,只要源机能读取到,推送过去的文件或目录,客户机都会根据rsyncd.conf文件配置的uid,gid进行重置。