Rsync+Inotify 配置全解
 
以前一直用unison进行双向同步,今天突然想用一个源对所有其它服务器进行同步,并保持高度一致,自然就想到了rsync+inotify,google搜索一通,发现大家发的技术文档大致都差不多,就照同是51cto上的king_819兄的配置开始来了一遍,不动手不知道,一动手还问题不少,现把步骤写下来,以便其它同学少走歪路,也提醒自已。
Rsync+inotify的工作原理是,源机器上的inotify实时监控主机上的某目录,如果发现有增删改的操作就把相应文件使用rsync推送到相应服务器上。
 
、安装 rsync,inotify
      Yum install rsync  inotify-tools –y
2 、配置需要同步的机器,即被推送接受同步文件的机器 , 这里称为服务器
2.1 目录配置
mkdir /log/access
useradd -s /sbin/nologin logan
chown  logan.logan -R /log/access
chmod  777 -R /log/access
 
2.2 rsync配置项
vim /etc/rsyncd.conf 
#global
uid = logan
gid = logan
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
 
[logdata]
path = /log/access
ignore errors  
read only = no 
list = no
hosts allow = 192.168.1.0/255.255.0.0 
auth users = logan
secrets file = /etc/rsyncd.pwd
 
2.3服务端密码文件:
echo "logan:123" > /etc/rsyncd.pwd
chmod 600  /etc/rsyncd.pwd
 
2.4启动服务:
rsync --daemon /etc/rsyncd.conf
 
 
2.5 xinetd启动
   vim /etc/xinetd.d/rsync
   disable = no
   service xinetd restart
 
注:
这里有个重要的问题大家都没有提,就是 uid,gid, 这里用户和组必须与 path 目录的用户与组保持一致,否则会出错各种权限错误。源机器推送过来的各种权限文件都会被改为 uid,gid 指定的用户和组。
  其次是认证文件,这里用户名与密码要都写进去。并改
权限,chmod 600 /etc/rsyncd.pwd

2.6 客户端同步
2.6.1 
rsync -vzrtopg --delete --progress --progress /root/install.log [email protected]::logdata --password-file=/etc/rsyncd.pwd
 
2.6.2变量
rsync_module=logdata
rsync_pass=/etc/rsyncd.pwd
rsync_user=logan
dst_ip=192.168.1.20
rsync -vzrtopg --delete --progress --progress /root/install.log ${rsync_user}@${dst_ip}::${rsync_module}/ --password-file=$rsync_pass
 
出错解决:
1)rsync: mkstemp ".install.log.PMSV3b" (in logdata) failed: Permission denied
 解决:在服务器目录加777权限:chmod 777 access/
3 、inotify源机器配置
  #!/bin/bash
dst_ip=192.168.1.20
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}@${dst_ip}::${des1} --password-file=/etc/rsyncd.pwd &&
        echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
        #echo "---------------------------------------------------------------------------" 
    done
 
源机器主要是一个inotify的监控脚本,这个脚本如同一个守护进程,会一直运行监控着相应目录的增删减动作,一经发现,立即运行rsync进行同步(推送),不要担心源目录下的文件权限与客户机的不一致,只要源机能读取到,推送过去的文件或目录,客户机都会根据rsyncd.conf文件配置的uid,gid进行重置。
另一例子:
cat rsync.sh 
#!/bin/bash
host1=10.12.36.69
src=/data/www/
des1="ftpdata"
user1="ftprsync"
rsync -vzrtopg --delete --progress ${src} ${user1}@${host1}::${des1} --password-file=/etc/www1.pwd 
 
注:rsync可以在远程服务器自动建一个一级目录,如:
rsync -vzar --partial --timeout=15 --stats --progress $i/tmp/3.txt $rsync_user@$dst_ip::${rsync_module}/tmp/ --password-file=$rsync_pass
中{rsync_module}/tmp/的tmp目录可以在远程没有,同步时可以自动建立.但再多一级不可以了,如/tmp/tmp/就会出错.