使用 Rsync + inotify-tools实时同步文件

发布于2023-11-29  166次阅读


一、基本介绍

Rsync 全称为:Remote Sync(远程同步),是一款开源的快速备份工具,可以在不同主机间镜像同步整个目录树,支持增量备份,保持链接和权限,采用优化的同步算法,传输前执行压缩,适用于异地备份,镜像服务器等应用(Linux 系统默认安装)

背景: 某服务有两台服务器,主服务器:存在jar包主程序。静态资源服务器:放前端静态资源的服务器,web访问服务器。

图片资源都在主服务器上。不想把请求图片压力都给到主服务器。静态资源服务器的贷款大,所以需要实时同步主服务器上的图片到静态资源服务器。

服务器身份区分:

  • 主服务器: 可以理解为源服务器,向web服务器发送要同步的数据(需要有同步端提供目录的读权限)
  • web服务器: 可以理解为服务端web访问端,专用于存放同步文件;类似于远程备份中心(通过提供目录,来使客户端进行同步)

二、使用 Rsync 实现远程同步

准备工作:

 

主机名 操作系统 IP地址 担任角色
A-Server CentOS7.4 192.168.1.1 主服务器
B-Server CentOS7.4 192.168.1.2 web服务器

rsync安装:yum install -y rsync    两台服务器都安装

1.配置web服务器

1.修改 Rsync 主配置文件


[root@B-Server ~]# vim /etc/rsyncd.conf
use chroot = yes      													# 禁锢在源目录
address = 192.168.1.2    										 		# 监听地址
port = 873    													 		# 监听端口
log file = /var/log/rsyncd.log   								 		# 日志文件
pid file = /var/run/rsyncd.pid   								 		# 进程文件
hosts allow = 192.168.1.0/24	 								 		# 允许访问的客户端地址

[PengYuYan]      														# 共享模块名
path = /app/backup   											 		# 需要同步的实际路径
comment = This is Test	       											# 描述信息. 随便写
read only = no       			 								 		# 读写权限
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  	 		# 同步时不再压缩的文件类型
auth users = zhangsan      												# 授权同步的账户
secrets file = /etc/rsync_users.db   							 		# 账户所在的数据文件

你们要是复制我上面的话,是没问题的,但是要把 # 去掉,这是个坑,需要注意。


[root@B-Server ~]# sed -i 's/#.*//g' /etc/rsyncd.conf

创建备份目录

[root@B-Server ~]# mkdir -p /app/backup && chmod 777 /app/backup

创建备份账户密码文件

[root@B-Server ~]# echo "zhangsan:123123" > /etc/rsync_users.db			# zhangsan 是用户名. 123123 是密码
[root@B-Server ~]# chmod 600 /etc/rsync_users.db     		 			# 对用户的数据文件进行权限保护

记得防火墙开放 873端口  或者关闭防火墙

1.配置主服务器

vi /etc/rsyncd.conf

uid = root
gid = root
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
read only = false
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = *

写入认证密码文件和创建文件夹

[root@B-Server ~]# echo '123123' > /etc/rsync_users.db			
chmod 600 /etc/server.pass
mkdir /app/backup
echo "Hello World" > /app/backup/Hello.sql   # 创建测试文件

同步文件测试

[root@B-Server ~]# rsync -avH --port 873 --progress --delete /app/backup/ zhangsan@192.168.1.2::PengYuYan --password-file=/etc/rsync_users.db	
sending incremental file list
./
Hello.sql
             17 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/4)

sent 184 bytes  received 46 bytes  153.33 bytes/sec
total size is 46  speedup is 0.20

三、安装inotify-tools工具,实现实时触发rsync进行同步

1、主服务器上安装inotify-tools

yum -y install inotify-tools

2、调整 Inotify 内核参数 (监控事件队列);最多监控实例数;每个实例最多监控文件数:

[root@A-Server ~]# cat /proc/sys/fs/inotify/max_queued_events
16384
[root@A-Server ~]# cat /proc/sys/fs/inotify/max_user_instances
128
[root@A-Server ~]# cat /proc/sys/fs/inotify/max_user_watches
8192

把三个参数数值加大: 监控的目录、文件数量较多或变化频繁

[root@A-Server ~]# cat <> /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
END
[root@A-Server ~]# sysctl -p

验证: 监控 /opt 目录的变化

[root@A-Server ~]# inotifywait -mrq -e modify,create,move,delete  /app/backup
监控选项 作用
-m 表示持续监控
-r 表示递归整个目录
-q 简化输出消息
-e 指定监控哪写事件
modify 修改
create 创建
move 移动
delete 删除
attrib 属性变化

3、创建目录/scripts,并在此目录上编写脚本文件inotify.sh,(设置755权限)内容如下:

[root@B-Server ~]# mkdir /scripts
[root@B-Server ~]# cd /scripts
[root@B-Server ~]# vi inotify.sh

#!/bin/bash
#监控路径
SRC="/app/backup"   

/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %f%e' -e modify,delete,create,attrib ${SRC} | while read files
do
  /usr/bin/rsync rsync -avH --port 873 --progress --delete /app/backup/ zhangsan@192.168.1.2::PengYuYan --password-file=/etc/rsync_users.db

  echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

4、启动脚本(以后台方式运行),并查看是否启动成功,创建日志文件

[root@B-Server ~]# touch /tmp/rsync.log
[root@B-Server ~]# nohup bash /scripts/inotify.sh & ps -ef|grep inotify
[1] 89789
nohup: 忽略输入并把输出追加到"nohup.out"
root      89789  78623  0 17:15 pts/7    00:00:00 bash /scripts/inotify.sh
root      89791  78623  0 17:15 pts/7    00:00:00 grep --color=auto inotify

5、去同步目录下添加一个文件试试

[root@B-Server ~]# echo '989865323' > /app/backup/65656.txt

6、去web服务器的同步目录下是否有该文件

[root@beautiful-baud-19 /] cd /app/backup
[root@beautiful-baud-19 backup]# ls
111.txt  65656.txt  Hello.txt  kk.txt

7、 看到文件已经同步过来,结束


  • 微信或支付宝

道,可道,非常道;名,可名,非常名。