Rsync+Inotify文件夹实时同步
介绍
部署rsync+inotify,实时同步本地的/home/client/目录至目标服务器的/home/server/目录。
部署环境
本地服务器 系统:CentOS7 IP:192.168.102.16
目标服务器 系统:CentOS7 IP:192.168.102.15
1 目标服务器配置 rsync
测试环境可以关闭防火墙,正式环境请放行873端口
1.1 关闭防火墙和selinux
$ systemctl stop firewalld
$ systemctl disable firewalld
$ setenforce 0
1.2 安装rsync,设置rsyncd.conf配置文件
$ yum install -y rsync
$ vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsync.pass
[etc_from_client]
path = /home/server/
comment = sync etc from client
uid = root
gid = root
port = 873
ignore errors
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = hzbb
hosts allow = 192.168.102.0/24
1.3 编辑用户密码文件
$ vim /etc/rsync.pass
hzbb:123456
1.4 启动rsync服务
$ systemctl start rsyncd
$ systemctl enable rsyncd
2 本地服务器配置rsync
2.1 关闭防火墙和selinux
$ systemctl stop firewalld
$ systemctl disable firewalld
$ setenforce 0
2.2 安装rsync,配置密码
$ yum install rsync
$ vim /etc/rsync.pass
123456
$ chmod 600 /etc/rsync.pass
2.3 测试能否手动同步
$ rsync -avH --port 873 --delete /home/client/ hzbb@192.168.102.115::hzbb_rsync --password-file=/etc/rsync.pass
sending incremental file list ./ test sent 126 bytes received 46 bytes 344.00 bytes/sec total size is 6 speedup is 0.03
2.4 显示已成功同步,查看一下目标服务器的/home/server1目录下是否有test文件
$ cd /home/server1/
$ ls
test
2.5 本地服务器安装inotify-tools工具对文件夹进行监控,当有文件改动时实时触发rsync进行同步
CentOS官方源默认不带intotity-tools工具安装包,需要先更换成阿里源再安装
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum clean all
$ yum makecache
$ yum install -y epel-release
$ yum install -y inotify-tools
2.6 编写同步脚本
$ mkdir /scripts
$ vim /scripts/backup.sh
#!/bin/bash
src=/home/client # 需要同步的源路径
des=hzbb_rsync # 目标服务器上 rsync --daemon 发布的名称
rsync_passwd_file=/etc/rsync.pass # rsync验证的密码文件
ip1=192.168.102.115 # 目标服务器1
user=hzbb # rsync --daemon定义的验证用户名
cd ${src}
# 必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致
/usr/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}') # 把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 -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${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}@${ip1}::${des}
fi
#修改属性事件
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ]
# 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
# rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des}
fi
fi
done
2.7 设置权限启动脚本
$ cd /scripts/
$ chmod 755 backup.sh
$ ./backup.sh &
$ nohup /bin/bash /scripts/backup.sh &
2.8 同步测试
本地服务器在/home/clent目录里新建文件,测试目标服务器是否会实时同步
- client
$ cd /home/client/
$ touch test1
- server
$ cd /home/server1/
$ ls
2.9 本地服务器创建计划任务,每两小时进行一次完整同步,防止遗漏
$ crontab -e
* */2 * * * rsync -avH --port 873 --delete /home/client/ hzbb@192.168.102.115::hzbb_rsync --password-file=/etc/rsync.pass
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
运维小记!
喜欢就支持一下吧
打赏
微信
支付宝