rsync+inotify实时同步
!!!在安装前要先确保,rsync daemon服务配置成功,在安装inotify-tools前先确认你的linux内核是否达到了2.6.13,并且在编译时开启CONFIG_INOTIFY选项,也可以通过以下命令检测。
一、rsync + inotify 组合的起源
Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。
【客户端】
rsync版本:3.0.6,inotify版本:inotify-tools-3.14.tar
二、编译安装
1)确认内核版本
1 2 3 4 5 6 7 8 | [root@weiwei ~] # uname -r 2.6 . 32 - 573.el6 .x86_64 [root@weiwei ~] # ls -l /proc/sys/fs/inotify/ total 0 - rw - r - - r - - 1 root root 0 Aug 16 15 : 13 max_queued_events - rw - r - - r - - 1 root root 0 Aug 16 15 : 13 max_user_instances - rw - r - - r - - 1 root root 0 Aug 16 15 : 13 max_user_watches 显示这三项就说明支持 |
2)编译安装inotify
1 2 3 | [root@weiwei inotify - tools - 3.14 ] # ./configure --prefix=/usr/local/inotify-tools-3.14 [root@weiwei inotify - tools - 3.14 ] # make && make install [root@weiwei local] # ln -s /usr/local/inotify-tools-3.14 /usr/local/inotify |
3)本地测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 测试create [root@weiwei ~] # /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /backup 16 / 08 / 17 19 : 01 / backup / a.txt 16 / 08 / 17 19 : 02 / backup / test_dir 测试delete [root@weiwei ~] # /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /backup 16 / 08 / 17 19 : 04 / backup / a.txt 16 / 08 / 17 19 : 04 / backup / nini.txt 测试close_write [root@weiwei ~] # /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete,close_write /backup 16 / 08 / 17 19 : 06 / backup / nima 16 / 08 / 17 19 : 06 / backup / nima 上面的create,close_write如果是创建文件则会重复了监控,如果仅仅写入则只会有close_write的监控 没有时间的监控,简化事件的输出 [root@weiwei ~] # /usr/local/inotify/bin/inotifywait -mrq --format ' %w%f' -e create /backup / backup / jij.txt |
三、下面用列表详细解释一下各个参数的含义
inotifywait参数 | 含义说明 |
-r --recursive | 递归查询目录 |
-q --quiet | 打印很少的信息,仅仅打印监控事件的信息 |
-m,--monitor | 始终保持事件监听状态 |
--exclude | 排除文件或目录时,不区分大小写 |
--timefmt | 指定时间输出的格式 |
--format | 打印使用指定的输出类似格式字符串 |
-e,--event | 通过此参数可以指定需要监控的事件,如下一个列表所示 |
-e :--event的各种事件含义
Events | 含义 |
---|---|
access | 文件或目录被读取 |
modify | 文件或目录内容被修改 |
attrib | 文件或目录属性被改变 |
close | 文件或目录封闭,无论读/写模式 |
open | 文件或目录被打开 |
moved_to | 文件或目录被移动至另外一个目录 |
move | 文件或目录被移动到另一个目录或从另一个目录移动至当前目录 |
create | 文件或目录被创建在当前目录 |
delete | 文件或目录被删除 |
umount | 文件系统被卸载 |
四、实时监控的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/sh path = "/backup" cmd = "/usr/local/inotify/bin/inotifywait" $cmd - mrq - - format ' %w%f' - e create,close_write,delete / backup |\ while read line do if [ ! - e "$line" ];then 如果此时执行了删除操作,则推送整个目录 cd $path &&\ rsync - az - - delete . / - - delete rsync_backup@ 192.168 . 222.140 ::oldboy - - password - file = / etc / rsync.password else 如果只是创建文件或者目录,则只需要推送文件或目录 rsync - az - - delete $line rsync_backup@ 192.168 . 222.140 ::oldboy - - password - file = / etc / rsync.password fi done |
五、参数优化
1 2 3 4 5 6 7 8 9 10 | [root@weiwei ~] # cd /proc/sys/fs/inotify/ [root@weiwei inotify] # ll total 0 - rw - r - - r - - 1 root root 0 Aug 16 15 : 13 max_queued_events = = = 关键参数,可以搞大点, 5000000 - rw - r - - r - - 1 root root 0 Aug 16 15 : 13 max_user_instances - rw - r - - r - - 1 root root 0 Aug 16 15 : 13 max_user_watches = = = 关键参数, 327679 [root@weiwei inotify] # cat * 16384 128 8192 |
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
修改参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@weiwei data] # cat /proc/sys/fs/inotify/max_ max_queued_events max_user_instances max_user_watches [root@weiwei data] # cat /proc/sys/fs/inotify/max_user_watches 8192 [root@weiwei data] # echo "50000000" > /proc/sys/fs/inotify/max_user_watches [root@weiwei data] # cat /proc/sys/fs/inotify/max_user_watches 50000000 [root@weiwei data] # cat /proc/sys/fs/inotify/max_queued_events 16384 [root@weiwei data] # echo "326790" > /proc/sys/fs/inotify/max_queued_events [root@weiwei data] # cat /proc/sys/fs/inotify/max_queued_events 326790 [root@weiwei data] # sysctl -p |
六、inotify优缺点
优点:监控文件系统事件变化,通过同步工具实现实时数据同步。
缺点:
1)并发如果大于200个文件(10-100k),同步就会有延迟
2)我们前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化的文件,不变化的不理。
3)监控到事件后,调用rsync同步是单进程的,而sersync为多进程同步。既然有了inotify-tools,为什么还要开发sersync?
七、参考文档
https://github.com/rvoicilas/inotify-tools/wiki
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用