首先要分清楚服务端(server端)和客户端(client端)的概念
(服务端配置 | 服务端IP173.36.17.71)
rsync以daemon模式启动
新建rsync配置文件/etc/rsyncd.conf加入以下内容:
uid = root
gid = root
use chroot = no
max connections = 100 #最大连接数可自行调整
strict modes = yes
port = 873
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
[web]
path = /data/wwwroot/ #客户端同步过来的文件存放的位置可自定义
ignore errors = yes
read only = no
write only = no
hosts allow = 173.36.17.105 #允许IP173.36.17.105进行通讯,设置为'*'表示允许所有服务器通讯,但必须注释hosts deny选项
hosts deny = * #拒绝其他任意IP访问
uid = root
gid = root
auth users = root #验证用户,可自行定义
secrets file = /etc/rsyncd.pwd #密码文件存放位置
新建密码文件/etc/rsyncd.pwd并加入以下内容(注意服务端密码文件必须为username:password格式):
root:123456
将密码文件权限修改为600
$ chmod 600 /etc/rsyncd.pwd
到此服务端配置基本完毕,防火墙记得开放873端口给客户端IP173.36.17.105访问,然后以daemon模式启动服务器端的rsync服务
$ rsync --daemon
(客户端配置 | 客户端IP173.36.17.105)
新建密码文件/etc/rsyncd.pwd并加入以下内容(客户端密码文件只需填入密码即可):
123456
将密码文件权限修改为600
$ chmod 600 /etc/rsyncd.pwd
安装inotify-toos同步服务
$ cd /usr/local/src
$ wget http://oxnuioltn.bkt.clouddn.com/inotify-tools-3.14.tar.gz #如果服务器无法连网可自行用工具下载此压缩包后上传到服务器
$ tar -zxvf inotify-tools-3.14.tar.gz
$ cd inotify-tools-3.14
$ ./configure --prefix=/usr/local/inotify-tools
$ make && make install
$ cd /usr/local/inotify-tools/bin
$ ln -s /usr/local/inotify-tools/bin/inotifywait /usr/bin/ #做个软链方便系统调用命令
编写同步脚本/home/shell/inotify.sh
#!/bin/bash
#Author:Benson
#Blog:http://blog.csdn.net/gbenson
#Name:inotify.sh
#Version:V1.0
#Description:
src=/data/wwwroot/html/ #需要同步的源路径
des=web #目标服务器上 rsync --daemon 发布的名称
rsyncPasswdFile=/etc/rsyncd.pwd #密码文件存放路径
remoteIp=173.36.17.71 #目标服务器IP
user=root #rsync用户
cd ${src}
inotifywait -mrq --format '%Xe %w%f' -e modify,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 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -avzcR --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ]
then
rsync -avzcR --password-file=${rsyncPasswdFile} $(dirname ${INO_FILE}) ${user}@${remoteIp}::${des}
fi
fi
done
在客户端服务器中启动此脚本并输出日志同时保持后台运行
$ /home/shell/inotify.sh &>/home/shell/inotify.log &
另外因为inotify只在启动时会监控目录,他没有启动期间的文件发生更改,他是不知道的,所以这里每2个小时做1次全量同步,防止各种意外遗漏,保证目录一致。
$ crontab -e
* */2 * * * rsync -avz --password-file=/etc/rsyncd.pwd /data/wwwroot/html/ root@173.36.17.71::web #加入此段内容
针对inotify的优化(可加入/etc/rc.local实现开机自动生效):
echo 50000000 >/proc/sys/fs/inotify/max_user_watches
echo 50000000 >/proc/sys/fs/inotify/max_queued_events