介绍

部署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
文章作者: hzbb
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 运维小记
Linux Rsync
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝