Ubuntu 文件系统数据同步方案与落地实践
一、方案总览与选型
- rsync + inotify-tools:基于事件的触发式同步,适合两台机器间的目录镜像、近实时复制,部署简单、资源占用低。
- Unison + inotify:支持双向同步,适合多机协同编辑同一目录树,需处理冲突与一致性策略。
- Syncthing:去中心化的持续文件同步,带Web 界面,适合跨公网、多设备自动同步与版本保留。
- 分布式/共享存储(如 GlusterFS、Ceph、NFS):面向集群与高可用,提供统一命名空间与自动复制/故障切换,适合多节点共享同一数据视图。
二、快速上手 rsync + inotify 触发式同步
- 适用场景:主机 A 的目录变动自动镜像到主机 B(单向)。
- 安装组件
- Ubuntu/Debian:sudo apt-get install -y rsync inotify-tools
- 建立免密登录(推荐用普通用户)
- ssh-keygen -t rsa
- ssh-copy-id user@<目标主机>
- 首次全量 + 事件触发脚本
- 建议首次执行一次全量,再用 inotify 监听增量;注意源目录是否带斜杠对同步范围的影响(见下文“关键细节”)。
- 示例脚本(保存为 sync.sh,chmod +x):
#!/usr/bin/env bash
SRC_DIR="/data/app"
DEST_HOST="user@192.168.1.20"
DEST_DIR="/data/app"
LOG_FILE="/var/log/rsync_fsync.log"
# 首次全量
echo "$(date '+%F %T') [INIT] Full sync ..." >> "$LOG_FILE"
rsync -a -z --delete -e ssh "$SRC_DIR/" "$DEST_HOST:$DEST_DIR" >> "$LOG_FILE" 2>&1
# 监听变更
echo "$(date '+%F %T') [INFO] Watching $SRC_DIR ..." >> "$LOG_FILE"
inotifywait -m -r -e create,delete,modify,move --format '%w%f' "$SRC_DIR" | while IFS= read -r file; do
echo "$(date '+%F %T') [EVENT] $file" >> "$LOG_FILE"
rsync -a -z --delete -e ssh "$SRC_DIR/" "$DEST_HOST:$DEST_DIR" >> "$LOG_FILE" 2>&1
done
- 后台运行:nohup ./sync.sh >> /var/log/fsync_run.log 2>&1 &
- 常用 rsync 选项说明
- -a(归档,保留权限/时间/属主等)、-z(压缩)、–delete(镜像删除)、-e ssh(走 SSH)、-v/-q(输出级别)、-n(演练,不真正传输)。
三、双向同步与多机扩展
- 双向同步(Unison)
- 安装:sudo apt-get install -y unison inotify-tools openssh
- 建立双机 SSH 免密后,用 inotify 监听本机目录变化,调用 unison 与对端双向同步;注意冲突文件处理策略(如以时间戳或手动为准)。
- 多机可设计“星型”拓扑:选一台作为枢纽,其他节点各自与枢纽双向同步,降低复杂度(枢纽宕机需有兜底策略)。
- 去中心化持续同步(Syncthing)
- 安装后通过 http://localhost:8384 配置节点与共享文件夹,适合跨公网、多设备自动保持一致性,无需中心服务器。
四、集群与共享存储方案
- NFS:将目录从一台服务器导出,其他节点挂载为本地目录,部署简单,但存在单点故障与性能瓶颈风险。
- GlusterFS:将多台存储节点聚合成统一卷,支持复制与故障切换,适合横向扩展与高可用。
- CephFS:提供对象/块/文件统一存储,具备强一致性与高可用,适合大规模与云原生场景。
- 选型要点:数据量、时延/吞吐、可用性目标、运维复杂度与成本。
五、关键细节与最佳实践
- 目录斜杠语义:源目录末尾带**/**表示仅同步目录内容;不带斜杠表示连同目录本身一起同步(rsync 经典约定)。
- 首次全量 + 增量守护:先用 rsync 做一次全量镜像,再用 inotify 触发增量,减少事件洪泛导致的重复同步。
- 事件去抖:高频写入场景可在脚本中对事件做合并/节流(如按时间窗口批量同步),降低 rsync 调用频率。
- 传输与认证:优先使用 SSH 并配置免密登录;非默认端口用 -e “ssh -p <端口>”;敏感数据启用加密与最小权限账号。
- 过滤与排除:用 –exclude/–exclude-from 忽略临时文件、缓存、日志等,避免无效同步与循环触发。
- 演练与回滚:上线前用 -n/–dry-run 验证;重要目录先做备份;明确 –delete 的镜像语义,防止误删。
- 日志与监控:记录同步日志与错误告警;对关键业务增加健康检查与回退策略。