Rsync+inotify实现实时同步

2019年2月14日 作者 陈益

一、安装Rsync(Server端)

yum install rsync

二、配置Rsync(Server端,要同步过去的服务器)

vi /etc/rsyncd.conf
创建日志目录
mkdir -pv /tmp/rsyncd/
创建要同步的文件目录
mkdir -pv /rsyncd/data
创建身份文件
touch /rsyncd/rsyncd.passwd
auth users = rsyncd定义用户名所以下面的用户名是:rsyncd
echo rsyncd:111111
chmod 600 /rsyncd/rsyncd.passwd


uid = root
gid = root
use chroot = yes
max connections = 4
pid file = /tmp/rsyncd/rsyncd.pid
log file = /tmp/rsyncd/rsyncd.log
lock file = /tmp/rsyncd/rsyncd.lock
hosts allow = node2.summer.com
list = false

[web]
path = /rsyncd/data
read only = no
auth users = rsyncd
secrets file = /rsyncd/rsyncd.passwd
transfer logging = yes
timeout = 900
三、字段说明
1.uid和gid表示以什么身份运行
2.hosts allow 表示可以同步的服务器
3.list表示不列出客户端的文件列表
3.secrets file 表示定义身份验证信息
4.read only=no 如果为no那么客户端是无法进行同步的
4.[web] 表示定义端,当客户端连接同步的时候需要指定这个名称
四、启动server端
rsync --daemon --config=/etc/rsyncd.conf 

netstat -tunpl |grep rsync

tail -f /tmp/rsyncd/rsyncd.log 
五、安装Rsync和用户配置(Client端)
1.安装Rsync
yum install rsync

2.创建要同步的文件目录
mkdir -pv /rsyncd/data

3.创建密码文件
touch /rsyncd/rsyncd.passwd

4.设置密码和server端中的密码一样
echo 111111 > /rsyncd/rsyncd.passwd
chmod 600 /rsyncd/rsyncd.passwd
六、启动和测试
1.在client端创建一个文件用于测试同步到服务器端

touch /rsyncd/data/summer.txt
echo `date` > /rsyncd/data/summer.txt

2.执行同步命令

rsync -avz /rsyncd/data/ rsyncd@node1.summer.com::web --password-file=/rsyncd/rsyncd.passwd

注意:如果要删除服务器端没有的文件那么需要加入选项 --progress --delete

rsync -avz --progress --delete /rsyncd/data/ rsyncd@node1.summer.com::web --password-file=/rsyncd/rsyncd.passwd

3.查看服务器端的日志然后查看/etc/rsyncd/data/目录看文件是否已经同步过来了
七、安装inotify-tools
wget --no-check-certificate http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

mkdir /usr/local/inotify-tools

tar -xvf inotify-tools-3.14.tar.gz 

cd inotify-tools-3.14

./configure --prefix=/usr/local/inotify-tools

make && make install
 
移除源文件目录
rm -rf inotify-tools-3.14
八、编写脚本
cd /rsyncd/ 

vi inotify.sh


#!/bin/bash
src=/rsyncd/data/
des=rsyncd@node1.summer.com::web
/usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' \
-e modify,delete,create,attrib ${src} \
| while read x
    do
        /usr/bin/rsync -avz --delete --progress $src $des --password-file=/rsyncd/rsyncd.passwd &&
        echo "$x was rsynced" >> /var/log/rsync.log
    done
九、测试
sh inotify.sh
然后在要同步的目录中创建文件或者修改文件来查看服务器端文件是否已经更新

注意:生产环境要后台运行
1.不输出日志信息
nohup sh inotify.sh >/dev/null 2>&1 &
2.输出到对应目录/rsyncd/inotify.log
nohup sh inotify.sh >/rsyncd/inotify.log 2>&1 &
十、加入开机自启动
chmod +x /etc/rc.d/rc.local
vi /etc/rc.d/rc.local

服务器的端
nohup /usr/bin/rsync --daemon --config=/etc/rsyncd.conf >>/dev/null 2>&1 &

客户端
nohup /rsyncd/inotify.sh >>/rsyncd/inotify.log 2>&1 &