rsync配合inotify做服务器间文件同步

由于需要添加下载服务器,现在每台服务器的流量比较大了,需要扩充,也就需要多服务器文件同步,本篇文章是在debian下操作的。

1:安装rsync

apt install rsync

2:修改配置文件(/etc/rsyncd.conf)

uid=root
gid=root
use chroot=no
max connections=10
timeout=600
strict modes=yes
port=873
#以下pid等等建议更换位置
pid file=/var/run/rsyncd.pid 
lock file=/var/run/rsyncd.lock
log file=/var/log/rsyncd.log

[apks]
path=/tmp/n2/
comment=rsync test logs
auth users=ciika
uid=root
gid=root
secrets file=/etc/rsyncd.secrets
read only=no
list=no

注意:上面[apks]如果不需要也可以不指定

3:配置用户名密码

/etc/rsyncd.secrets

ciika:ciika@2019

设置权限

chmod 600 /etc/rsyncd.secrets

4:配置客户端密码

/etc/rsync_client.pwd

ciika@2019

设置权限

chmod 600 /etc/rsync_client.pwd

以上3和4步骤分为两个端配置使用

5:启动

启动命令

/usr/bin/rsync --daemon --config=/etc/rsyncd.conf

6:同步命令

假如A向远端B同步数据

需要在A上指定/etc/rsync_client.pwd,在B上配置好apks

/usr/bin/rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd /home/files/ ciika@172.26.31.130::apks

7:安装 inotify

apt-get install inotify-tools

8:rsync组合inotify-tools完成实时同步

大概原理是inotify监控的文件发生变化,通知rsync进行同步,同时建议没固定的时间在全量同步一次

大概脚本为:

#!/bin/bash
src=/home/files/   # 需要同步的源路径
des=apks     # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsync_client.pwd    # rsync验证的密码文件
destip=172.26.31.130 # 目标服务器1
user=ciika    # rsync --daemon定义的验证用户名
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}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
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 -vlrtR --password-file=$rsync_passwd_file $(dirname $INO_FILE) $user@$destip::$des
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
    echo 'DELETE or MOVED_FROM'
    rsync -avzR --delete --password-file=$rsync_passwd_file $(dirname $INO_FILE) $user@$destip::$des
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
    echo 'ATTRIB'
    if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
    then
        rsync -avzcR --password-file=$rsync_passwd_file $(dirname $INO_FILE) $user@$destip::$des
    fi
fi
done

常见错误:

@ERROR: invalid uid

注意uid是否在远程服务器上存在,建议改成root试试

还有一种是验证失败,需要确定命令里面的用户名和远程配置的是否一致,本地和远程的密码是否一致

另外如果rsync同步速度非常慢,需要看看是否在传输列表的时候消耗的太长时间,如果是,可以直接精准的传输改变的文件。

rsync: failed to connect to 54.147.1.1 (54.147.1.1): Connection timed out (110)

需要在目标机器开始端口873

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章