服务端安装
1、安装rsync
yum -y install rsync
2、配置/etc/rsyncd.conf文件
uid = backup
gid = backup
port = 873
use chroot = yes
read only = no
list = no
#允许登录IP
hosts allow = ip
hosts deny = *
max connections = 10
timeout = 900
fake super = yes
[backup]
comment = this is module for backup
path = /app/backup/
ignore errors
#新增用户名
auth users = backup
secrets file = /etc/rsyncd.pwd
3、新建/etc/rsyncd.pwd,写入用户名:密码
4、修改/etc/rsyncd.pwd权限为chmod 600
5、新建backup用户useradd -s /sbin/nologin -m backup
6、给目录授权chown backup:backup /app/backup
7、启动服务systemctl start rsyncd
安装客户端
yum -y install rsyncd
新建密码文件etc/rsyncd.password
rsync -avzcR --password-file=/etc/rsyncd.password /root/* 用户名@目标地址::模块名称
通过变化更新文件脚本
#!/bin/bash
src=/app/cloudreve
des=cloudreve
rsync_passwd_file=/etc/rsyncd.passwd
ip1=ip
user=cloudreve
cd ${src}
/usr/local/bin/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=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} # INO_FILE变量代表路径哦 -c校验文件内容
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
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}@${ip1}::${des}
#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
fi
#修改属性事件 指 touch chgrp chmod chown等操作
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ]
then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
fi
fi
done