inotify-tools + rsync增量同步文件

利用 inotify-tools 实时监控文件变化,再配合 rsync 做目录/文件的实时同步,常用于多机文件同步、热备份、甚至网站内容分发。


实现思路

  1. inotify-tools 提供命令行工具 inotifywaitinotifywatch

    • inotifywait:实时监听文件事件,阻塞输出。
    • inotifywatch:统计事件次数。
  2. 核心逻辑

    • 在源服务器上用 inotifywait -mrq 监听目录。
    • 当有新增/修改/删除事件时,触发 rsync 将变化同步到目标服务器。
    • rsync 建议配合 -az --delete --exclude 参数,支持压缩、增量和删除同步。
  3. 常见使用场景

    • Web 服务器多机内容一致性(例如上传的图片、静态资源)。
    • 应用日志/数据文件实时同步到备份机。
    • 简单的分布式文件推送。

示例脚本

假设要把 /data/www/ 目录同步到 10.0.0.2:/data/www/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

SRC="/data/www/"
DEST="user@10.0.0.2:/data/www/"
LOG="/var/log/rsync_inotify.log"

# 先做一次全量同步
rsync -az --delete $SRC $DEST

# 持续监听
inotifywait -mrq --timefmt '%F %T' --format '%T %w%f %e' \
-e modify,delete,create,move $SRC | while read file
do
echo "$file" >> $LOG
# 增量同步(只同步变化的文件)
rsync -az --delete --exclude='.git/' $SRC $DEST
done

优化点

  • 排除文件:用 --exclude 排除 .git/、缓存目录等没必要同步的内容。
  • 性能:大量小文件变动时,可以在 while read 里加上 sleep 1 聚合触发,避免频繁 rsync。
  • 安全:目标机器可以配置 rsync + SSH key,避免密码输入。
  • 多目标同步:如果要同步多台服务器,可以把 rsync 部分改成循环。
  • 守护进程:结合 supervisordsystemdnohup 保证脚本后台运行。

流程图

8be70929e6dac3e382d149442ae7ce5d.png