客户端运行rsync -av --deletion就是调用了rsync的工具(举个例子 vsftp是ftp的服务端 ftp工具就是客户端工具)
需求
目标服务端:192.168.68.136 备份客户端数据至目录:/backup/html/
客户端(数据源):192.168.68.137 监控数据源目录:/data/html/ 并实时同步数据至目标服务端
目标服务端部署 – 192.168.68.136
安装部署rsync
yum install -y rsync
配置同步策略
实现免密(secrets file)同步必须使用rsync的daemon模式启动服务,客户端(数据源)和目标服务端默认使用873端口进行数据传输。目标服务端需要配置/etc/rsyncd.conf文件。
创建/etc/rsyncd.conf文件,添加如下代码:
#日志文件位置,启动rsync后自动产生这个文件,无需提前创建
log file = /var/log/rsyncd.log
#pid文件的存放位置
pidfile = /var/run/rsyncd.pid
#支持max connections参数的锁文件
lock file = /var/run/rsync.lock
#用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
secrets file = /etc/rsync.pass
#rsync启动时欢迎信息页面文件位置(自己创建这个文件,内容随便自定义)
motd file = /etc/rsyncd.Motd
#设置rsync运行的uid权限。
uid = root
#设置rsync运行的gid权限。
gid = root
#默认的rsync端口
port=873
#默认为true,修改为no或false,增加对目录文件软连接的备份
use chroot = no
#设置rsync服务端文件为读写权限
read only = no
#不显示rsync服务端资源列表
list = no
#最大连接数
max connections = 200
#设置超时时间
timeout = 600
#执行数据同步的用户名,需要后面手动设置。可以设置多个,用英文状态下逗号隔开
auth users = root
#允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.68.137
#禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开(如果没有禁止,就不用设置这一行)
#hosts deny = 192.168.1.194
#自定义名称 #我们可以指定多个模块 定义多个备份路径
[web]
#rsync目标服务端数据目录路径,即同步到目标目录后的存放路径
path = /backup/html
#模块名称描述
comment = web
创建用户认证文件 (多个模块用的是这同一个认证文件)
[root@localhost ~]# vim /etc/rsync.pass
#
认证文件内容格式为
用户名
:
密码
root:w*******
设置文件权限,即rsyncd.conf和rsync.pass认证文件都是600权限!
[root@localhost ~]# chmod 600 /etc/rsyncd.conf
[root@localhost ~]# chmod 600 /etc/rsync.pass
创建rsync同步过来的目标目录
[root@localhost ~]# mkdir -p /backup/html
启动rsync服务,确认进程和端口号
# 启动rsync服务
[root@localhost backup]# systemctl restart rsyncd
# 设置开机自启动
[root@localhost backup]# systemctl enable rsyncd
[root@localhost backup]# ps -ef|grep rsync
[root@localhost backup]# netstat -nltp
在客户端(数据源)部署– 192.168.68.137
安装rsync
yum install -y rsync
创建用于连接目标服务器验证用户root的密码文件,这个文件名可以跟服务端的认证文件不一样,但是里面的密码内容必须一致!
注意:此处的密码文件格式与目标服务端的密码文件格式不同,只需保存密码信息即可,不需要用户名!切记!
[root@localhost ~]# vim /etc/rsync_root.pass
[root@localhost ~]# cat /etc/rsync_root.pass
w*******
设置rsync_root.pass密码文件为600权限
[root@localhost ~]# chmod 600 /etc/rsync_root.pass
第一次全量同步
rsync -av --delete /data/html/ root@192.168.68.136::web --password-file=/etc/rsync_root.pass
安装inotify
yum install -y inotify-tools
注:如果没有inotify-tools
,重新安装下
yum
包,
wget -O /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel* -y
测试inotify监控
inotifywait:用于持续监控,实时输出结果
inotifywatch:用于短期监控,任务完成后再出结果
客户端打开两个终端,终端1执行创建删除等操作,终端2执行inotify-tool工具,测试inotify-tool监控是否正常。
# 终端1:开启inotify监控
inotifywait -mrq -e modify,create,move,delete /data/html/
# 终端2:进行/data/目录下的操作
# 终端1上会显示事件记录:
编写触发式脚本
vim /root/rsync_nginx_html_inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /data/html"
# ::web是模块名,不写模块名,我们可以执行一个绝对路径
RSYNC_CMD="rsync -av --delete /data/html/ root@192.168.68.136::web --password-file=/etc/rsync_root.pass"
$INOTIFY_CMD | while read file
do
$RSYNC_CMD
echo " ${file} was rsynced"
done
# 给脚本添加x权限:
[root@localhost ~]# chmod +x /root/rsync_nginx_html_inotify.sh
-rwxr-xr-x 1 root root 268 5月 11 11:43 rsync_nginx_html_inotify.sh
测试脚本
客户端打开两个终端,终端2执行创建删除等操作,终端1运行脚本,查看脚本是否触发同步。
目标服务端查看目标文件夹是否同步。
# 客户端终端1:运行脚本
[root@localhost ~]# ./rsync_nginx_html_inotify.sh
# 客户端终端2:进行/usr/local/nginx/html/目录下的操作
# 客户端终端1:脚本运行输出
# 目标服务端确认同步是否完成
把脚本加入开机自启动
# 打开/etc/rc.d/rc.local文件,在末尾增加如下内容
/root/rsync_nginx_html_inotify.sh
# 给rc.local增加x权限
chmod +x /etc/rc.d/rc.local
衍生文档
rsync+inotify实时同步(服务端:多目录,分别同步多个客户端):https://mp.youkuaiyun.com/console/editor/html/106067018
rsync+inotify实时同步(文件多备份,服务端:多目录,客户端:一目录):https://mp.youkuaiyun.com/console/editor/html/106066998
参考文献
rsync+inotify实时同步文件:https://blog.youkuaiyun.com/wc1695040842/article/details/90747195
Rsync+Inotify远程实时同步:https://blog.51cto.com/13444271/2113632
CENTOS7开机自启动脚本:https://www.cnblogs.com/longchengruoxi/p/11451062.html