inotify+rsync实时同步

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/s295580857/article/details/82986529
首先要分清楚服务端(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/ [email protected]::web  #加入此段内容

针对inotify的优化(可加入/etc/rc.local实现开机自动生效):

echo 50000000 >/proc/sys/fs/inotify/max_user_watches
echo 50000000 >/proc/sys/fs/inotify/max_queued_events

如文章对您有帮助,请打开支付宝扫码领取红包,就当做对作者的支持,谢谢

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/s295580857/article/details/82986529