根本原因是inotify监控粒度粗,MODIFY事件不保证文件写入完成;须监听CLOSE_WRITE、过滤临时文件、用--size-only+每日--checksum校验、-a--delete-delay、单向主从架构、双进程检查、分段时间戳定位瓶颈。
rsync + inotify 实时同步为什么总丢文件
根本原因是 inotify 监控粒度太粗,inotifywait 默认只捕获事件类型(如 create、modify),但不保证文件写入完成。大文件写入时,modify 可能在 close_write 前多次触发,导致 rsync 拷贝到一半的临时状态。
实操建议:
- 必须等待
CLOSE_WRITE事件,用inotifywait -m -e close_write,move_self,attrib,去掉modify - 加
--exclude='.*.swp' --exclude='*.tmp'过滤编辑器临时文件,避免误同步 - 同步命令末尾加
--size-only或--checksum:前者快但依赖 mtime/size,后者准但慢;生产环境建议先用--size-only,再每日凌晨跑一次全量--checksum校验 -
rsync必须带-a --delete-delay:防止删除动作在传输中途发生,--delete-delay把删操作放到所有传输完成后统一执行
多台服务器间怎么避免 rsync 形成环形同步
典型错误是 A→B、B→C、C→A 这类配置,rsync 本身无拓扑感知,一旦某台机器时间不同步或网络抖动,就会反复覆盖、丢失更新。
实操建议:
- 强制单向主从:只允许
push(源主动推)或pull(目标定时拉),禁止双向脚本共存 - 每台机器加角色标识文件,比如
/etc/sync-role内容为master或slave,同步脚本开头先读取并校验,不匹配直接退出 - 使用
rsync的--rsync-path="rsync --server --daemon"配合rsyncd.conf限制模块可写权限,比如 master 的配置里read only = yes,slave 里read only = no - 所有 rsync 命令加
--timeout=30和--contimeout=10,防止某台挂起阻塞整个链路
集中界面监控 rsync 状态时,哪些字段真有用
很多 Web 界面堆砌 last_run、exit_code 这类字段,实际运维中真正要盯的是三件事:是否运行中、最近一次是否完整、有没有静默失败。
实操建议:
- 不要信
pidfile是否存在——进程可能僵死;改用pgrep -f "inotifywait.*close_write"+pgrep -f "rsync.*--delete-delay"双进程检查 - 校验完整性不能只看
rsync返回码:0 表示执行完,不代表数据一致;必须解析日志里的sent [0-9]+ bytes和received [0-9]+ bytes,两者都非零才算有效传输 - 加一个轻量级校验点:每次同步后,在目标机生成
/var/run/sync-checksum-$(hostname),内容为源目录find /data -type f -exec stat -c "%n %s %Y" {} \; | sha256sum,集中界面定期比对各节点该文件的 hash - 监控脚本里避开
df -h类命令——它在 NFS 或某些 overlayfs 上会卡住;改用stat -f -c "%b %f" /data获取 block 总数和空闲数
Web 界面里显示 “同步延迟 120s” 是不是真的慢了
不是。这个数字通常只是上一次 rsync 启动时间戳与当前时间的差值,完全没考虑传输耗时、锁等待、磁盘 I/O 堵塞等真实瓶颈。
实操建议:
- 延迟指标必须拆解:采集三个时间戳——
start_time(inotify 触发瞬间)、rsync_start(rsync 进程 fork 时间)、rsync_end(waitpid 返回时间),三者差值才能定位卡点 - 用
systemd-run --scope -p IOWeight=100包裹 rsync,避免同步任务吃光磁盘带宽影响线上服务;同时在界面里加一列io_wait_ms(从/proc/PID/io里取read_delayed和write_delayed) - 如果用 Nginx 反代监控页面,别用
proxy_cache缓存状态接口——会导致看到的永远是旧数据;加add_header Cache-Control "no-cache, no-store" - 注意时区陷阱:所有时间戳统一用
date +%s%3N(毫秒级 Unix 时间戳),别用strftime输出本地时间再解析
真正难的是跨网络、跨存储类型的校验一致性——比如一台是 ext4,一台是 xfs,硬链接、扩展属性、ACL 的处理逻辑不同,rsync --archive 也救不了。这时候得接受“最终一致”,并在应用层做幂等设计,而不是指望同步工具兜底。

















