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