rsync + inotify 实现主机间数据实时同步的原理
一、rsync实现两台服务器数据同步的原理:
Rsync 是基于rsync算法校验源(SRC)与目标(DEST)之间的差异实现数据同步的。也就是说,当使用rsync工具同步数据时候,只复制源(SRC)发生改变的文件,到目标(DEST),这类似于增量备份。所以rsync同步数据的速度是很快的。但是rsync的传输性能有点差,在海量小文件需要同步时,表现很差劲。因为rsync是基于文件同步的(不是块级别的),在传输之前还要进行校验。
Rsync的工作模式有多中,使用rsync的服务模式来构建:主/从服务器的数据同步。此时rsync工作为守护进程监听在:TCP/873, 能接收客户端的数据同步请求。
客户端发出的数据同步请求方式有两种:
1、 从远程rsync服务器拉取数据到本地
例:
从远程rsync服务器拉取数据(把rsync导出的存储空间中的所有文件镜像到本地)到本地的/web目录
2、往远程服务器推送数据
例:
往远程rsyn服务器导出的存储空间(web)推送数据(文件fstab)
使用rsync协议向远程rsync服务器导出的存储空间(web)推送数据(镜像目录/etc)
二、那么如何实现:实现两台服务器的数据同步呢?
要点:只要当数据改变时,rsync客户端往rsync服务器推送数据或从主服务器拉取数据,就可以实现两台服务器数据同步了。
1、选择rsync客户端的工作模式:
因为:rsync客户端向服务端发出的数据同步请求命令的方式有两种(推送数据/拉取数据):那么,Rsync客户端是从rsync服务器拉取数据(镜像数据)还是rsync客户端推送(上传)数据,这要视,同步数据源放在rsync服务器端还是放在rsync客户端?
说明:本实验的同步数据源存放在rsync客户端192.168.60.40所在文件系统的:/web目录中,所以
使用“推送模式”。
2、选择触发rsyc客户端从rsync服务器端拉取数据或推送数据的方式?
说明:
第1种方式,不能保证两台服务器的数据是实时同步的,因为数据发生改变与rsync客户端发出同步请求命令不能联运起来。如果,我们的数据更新频度很快的话,往往会造成某台服务器的数据落后很多另一台服务器的。而第2种解决方案,只要数据发生改变就会发生数据同步请求,它是实时的。
Rsync + inotify 机制实现的两台服务器数据同步如下图如示:
三、在192.168.60.99主机搭建rsync服务器
Rsync工作于服务模式,要为其提供配置文件,配置文件如下:
四、在192.168.60.40安装inotifywatch工具;
要使用inotifywatch工具定义inotify监控的对象和监控事件。Inotify工作在内核空间。
Inotifywatch会把inotify监控到的事件输出到标准输出来。
安装步骤:
五、在客户端192.168.60.40设置inotify 与 rsync联动;
联动原理:
可以通过管道,把innotify监控到的事件送到while循环,由read读取到有监控事件发生,就执行while循环体内的rsync同步数据请求命令。这样就实现了inotify与rsync的联运。代码如下:
六、测试;
1、启用服务
说明:这里选择rsync由超级守护进行xinetd管理。所以,要启用xinetd服务。
启动 xinetd服务
开启rsync服务
2、在rsync服务端运行inotify.sh脚本
说明:在后台运行。
注意:rsync服务器监听的端口为:TCP/873
3、查看rsync服务器192.168.60.99输出的存储空间的数据文件
4、在rsync客户端192.168.60.40,复制一些文件到被inotify监控的目录/web中
5、查看rsync服务器输出的存储空间/web是否有对应的文件
OK!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了