Rsync+inotify自动同步数据
一、简介
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。
首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。
其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。
基于以上两种情况,可以使用rsync+inotify的组合来解决,可以实现数据的实时同步。inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。在使用rsync首次全量同步后,结合inotify对源目录进行实时监控,只有有文件变动或新文件产生,就会立刻同步到目标目录下,非常高效使用!
二、部署rsync
操作系统: CentOs 7
Rsync Server: 172.16.200.160
Rsync Client : 172.16.200.143
2.1 Rsync Server安装rsync服务
centos7上默认已经安装了xinetd和rsync
1 2 3 4 5 6 | # rpm -qa | grep xinetd xinetd - 2.3 . 15 - 13.el7 .x86_64 # rpm -qa | grep rsync rsync - 3.0 . 9 - 18.el7 .x86_64 |
vim /etc/rsync
1 2 3 4 5 6 7 8 9 10 11 | service rsync { disable = no flags = IPv6 socket_type = stream wait = no user = root server = / usr / bin / rsync server_args = - - daemon log_on_failure + = USERID } |
vim /etc/rsyncd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | log file = / var / log / rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建 pidfile = / var / run / rsyncd.pid #pid文件的存放位置 lock file = / var / run / rsync.lock #支持max connections参数的锁文件 secrets file = / etc / rsync. pass #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件 motd file = / etc / rsyncd.Motd #rsync启动时欢迎信息页面文件位置(自己创建这个文件,内容随便自定义) [backup] #自定义名称 path = / data / backup / rsync #rsync服务端数据目录路径,即同步到目标目录后的存放路径 comment = backup #模块名称与[backup]自定义名称相同 uid = rsync #设置rsync运行的uid权限。这个要保证同步到目标目录后的权限和源目录一致,即都是nobody! gid = rsync #设置rsync运行的gid权限。 port = 873 #默认的rsync端口 use chroot = no #默认为true,修改为no或false,增加对目录文件软连接的备份 read only = no #设置rsync服务端文件为读写权限 list = no #不显示rsync服务端资源列表 max connections = 200 #最大连接数 timeout = 600 #设置超时时间 auth users = RSYNC_USER #执行数据同步的用户名,需要后面手动设置。可以设置多个,用英文状态下逗号隔开 hosts allow = 172.16 . 200.143 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开 hosts deny = 172.16 . 200.150 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开(如果没有禁止,就不用设置这一行) |
创建用户认证文件
vim /etc/rsync.pass
1 | RSYNC_USER: 123 @rsync |
设置文件权限
1 2 | # chmod 600 /etc/rsyncd.conf # chmod 600 /etc/rsync.pass |
创建备份目录
1 2 3 4 | # mkdir -p /data/backup/rsync # groupadd -g 1011 rsync # useradd -g 1011 -u 1011 rsync # chown -R rsync.rsync /data/backup/rsync |
启动rsync服务
1 2 | # systemctl start xinetd # lsof -i:873 |
2.2 Rsync_Client安装rsync
安装rsync和xinetd
1 | # yum -y install rsync xinetd |
vim /etc/rsync
1 2 3 4 5 6 7 8 9 10 11 | service rsync { disable = no flags = IPv6 socket_type = stream wait = no user = root server = / usr / bin / rsync server_args = - - daemon log_on_failure + = USERID } |
设置认证文件
vim /etc/rsync.pass
1 | 123 @rsync |
启动
1 | # systemctl start xinetd |
2.3 测试
在Rsync_Client虚拟机上新建一个文件
1 2 3 | # cd /data/test # touch test1.txt # rsync -avz /data/test/test1.txt RSYNC_USER@172.16.200.160::backup --password-file=/etc/rsync.pass |
在Rsync_Server虚拟机上同步过来了
三、安装inotify
1 2 3 4 5 6 7 8 9 10 11 12 13 | # wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz # mkdir -p /data/inotify # tar -zxvf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure --prefix=/data/inotify # make && make install # ll /data/inotify |
设置环境变量
1 2 3 | # echo 'export PATH=$PATH:/data/inotify/bin' > /etc/profile.d/inotify.sh # source /etc/profile.d/inotify.sh |
添加库文件
1 2 3 4 | # vim /etc/ld.so.conf.d/inotify.conf # vim /etc/ld.so.conf include ld.so.conf.d / * .conf<br><br> # ldconfig |
修改inotify默认参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 查看系统默认参数值 [root@static - img ~] # sysctl -a | grep max_queued_events fs.inotify.max_queued_events = 16384 [root@static - img ~] # sysctl -a | grep max_user_watches fs.inotify.max_user_watches = 8192 [root@static - img ~] # sysctl -a | grep max_user_instances fs.inotify.max_user_instances = 128 修改参数: [root@static - img ~] # sysctl -w fs.inotify.max_queued_events="99999999" [root@static - img ~] # sysctl -w fs.inotify.max_user_watches="99999999" [root@static - img ~] # sysctl -w fs.inotify.max_user_instances="65535" 参数说明: max_queued_events: inotify队列最大长度,如果值太小,会出现 "** Event Queue Overflow **" 错误,导致监控文件不准确 max_user_watches: 要同步的文件包含多少目录,可以用:find / Data / xqsj_upload - type d | wc - l 统计这些源目录下的目录数,必须保证max_user_watches值大于统计结果(这里 / Data / xqsj_upload为同步的源文件目录) max_user_instances: 每个用户创建inotify实例最大值 |
四、编写自动同步脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash SRCDIR = "/data/test" # 需要备份的文件夹 USER = "RSYNC_USER" IP = "172.16.200.160" # server地址 DSTDIR = "backup" cd / data / data / inotify / bin / inotifywait - mrq - - timefmt '%d/%m/%y %H%M' - - format '%T %w%f%e' - e close_write,modify,delete,create,attrib,move $SRCDIR | while read file do / usr / bin / rsync - avz - - delete $SRCDIR $USER@$IP::$DSTDIR - - password - file = / etc / rsync. pass echo " ${file} was rsynced" >> / tmp / rsync.log 2 >& 1 done |
后台运行
1 | # nohup sh rsync.sh & |
经测试新建文件和目录、修改和删除都能同步
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)