Unison 是跨平台的双向同步工具,内置冲突检测,能智能合并两边的独有文件。
unison安装
前置准备(A、B 两台机器都要做)
1 | # CentOS 7(先装EPEL源,之前已装过可跳过) |
配置 SSH 免密登录(双向)
确保 A 能免密登录 B,B 也能免密登录 A:
1 | # 生成公钥和私钥 |
首次手动合并(解决初始文件不一致)
先执行一次全量双向同步,把 A 的 m 和 B 的 n 合并到两边:
1 |
|
执行结果:
A 的 /data 会新增文件 n(来自 B);
B 的 /data 会新增文件 m(来自 A);
最终 A 和 B 的 /data 都有 m+n,无文件丢失。
这个命令 是双向同步。如果 A 和 B 修改了同一个文件(比如 A 改了 m 的内容,B 也改了 m 的内容),-auto 会按 “最后修改时间” 自动选择最新的版本覆盖旧的;如果想避免这种情况,去掉-auto,Unison 会提示你手动选择保留哪个版本。
配置实时双向同步
Unison 本身没有实时监听功能,需配合 inotifywait 实现 “实时触发同步”,步骤如下:
安装 inotify-tools(A、B 都装)
1 | sudo yum install inotify-tools -y # CentOS |
创建实时同步脚本(以机器 A 为例,B 同理)
1 | sudo vim /usr/local/bin/unison_sync.sh |
赋予脚本执行权限
1 | sudo chmod +x /usr/local/bin/unison_sync.sh |
创建 systemd 服务(开机自启)
1 | sudo vim /etc/systemd/system/unison-sync.service |
启动并设置开机自启
1 | sudo systemctl daemon-reload |
在机器 B 上重复步骤
只需把脚本中的 TARGET 改成 root@A的IP:/data,其他完全一致,确保 B 的修改也能同步到 A。
关键验证(确保双向同步生效)
在 A 上创建文件 test1
1 | touch /data/test1 |
等待 2 秒后,登录 B 查看 /data/test1 → 能看到,说明 A→B 同步成功。
在 B 上创建文件 test2
1 | touch /data/test2 |
等待 2 秒后,登录 A 查看 /data/test2 → 能看到,说明 B→A 同步成功。
查看同步日志
1 | tail -f /var/log/unison_sync.log |
能看到每次同步的触发记录,无报错则正常。
避坑提醒
冲突处理:如果 A 和 B 同时修改同一个文件,Unison 会提示冲突(需手动确认);若想自动覆盖,可加 -force $WATCH_DIR(但不推荐,易丢数据);
删除同步:默认 Unison 会同步删除操作(A 删 m → B 也删 m),若想禁止,可加 -nodelete 参数;
性能控制:sleep 2 延迟可避免短时间多次修改触发频繁同步,根据业务调整;
日志轮转:同步日志会越来越大,建议配置 logrotate 定期切割。