Linux下rsync + inotify 实时文件同步方案
一、核心组件概述
1. inotify
inotify是 Linux 内核提供的文件系统变化监控机制,inotify-tools是用户态工具,用于持续监控文件或目录的数据变化(增删改)。
监控事件:create、delete、modify、move、attrib 等
常用命令:
inotifywait特点:事件驱动,无需轮询,性能高
2. rsync
rsync是一款高效的文件数据同步与传输工具。
对比项 | cp | rsync |
|---|---|---|
跨节点 | ❌(需 scp) | ✅ 原生支持远程同步 |
数据传输 | 全量拷贝 | 差异(增量)同步 |
压缩传输 | ❌ | ✅ 默认/可选压缩 |
断点续传 | ❌ | ✅ |
权限/软链保留 | 有限 | ✅ 丰富参数支持 |
rsync 默认采用差异同步算法:只传输源与目标之间发生变化的数据块。
二、rsync 差异同步原理简述
假设源文件 A、目标文件 B,rsync 会:
比对文件块 checksum
仅传输存在差异的数据块
在目标端重组文件
纯文本
纯文本
A 文件(源) B 文件(目标) a 1 a 1 b 7 b 7 c 3 ──差异同步──▶ 仅同步 c/e/f 变更块 d 4 d 4 e 99 ← 修改 f 66 ← 修改结果:不需要全量拷贝,仅同步变动部分,节省带宽与时间。
三、rsync + inotify 组合原理
text
text
inotify 监控目录变化 │ ▼ 事件触发 │ ▼ rsync 增量同步 │ ▼ 目标端数据保持一致Shell 脚本逻辑:
bash
bash
inotifywait -mrq --format '%w%f' -e modify,create,delete,move /src \ | while read file; do rsync -az --delete /src/ remote:/dst/ doneinotifywait:阻塞监听文件事件一旦触发 → 调用
rsync执行增量同步实现准实时、跨节点数据同步
四、rsync 清空目录的特殊用法
rsync 的同步目标是“使目标 == 源”,因此可利用空目录快速清空目标目录:
bash
bash
# 创建一个空目录 mkdir /tmp/empty # 将空目录同步到 /data ,达到清空 /data 的效果 rsync -a --delete /tmp/empty/ /data/⚠️ 生产环境慎用
--delete,建议先--dry-run测试
五、rsync 常见使用场景示例
1. 本地同步
bash
bash
rsync -avz /data/logs/ /backup/logs/2. 跨节点同步(SSH)
bash
bash
rsync -avz /data/ root@node2:/data/3. 作为守护进程(rsync server)
bash
bash
rsync -avz /data/ rsync_backup@backup::data_module4. 结合 inotify 实时同步脚本示例
bash
bash
#!/bin/bash SRC=/data/wwwroot/ DEST=root@node2:/data/wwwroot/ INOTIFY_CMD="inotifywait -mrq -e modify,create,delete,move $SRC" $INOTIFY_CMD | while read dir event file; do rsync -az --delete $SRC root@node2:/data/wwwroot/ done六、rsync 常用参数说明
参数 | 含义 |
|---|---|
| 归档模式(递归+保留权限/时间/软链等) |
| 显示过程 |
| 传输时压缩 |
| 递归 |
| 目标比源多出的文件删除(镜像同步) |
| 排除指定文件 |
| 限速(KB/s) |
| 显示进度 + 断点续传 |
| 模拟运行 |
七、典型应用场景总结
✅ 网站代码实时同步(发布机 → 业务节点)
✅ 日志集中收集
✅ 灾备数据增量同步
✅ 替代 scp 做大数据传输
✅ 配合 inotify 实现准实时文件分发
