喵星之旅-狂奔的兔子-双机高可用、实时备份(unison)

Unison 是跨平台的双向同步工具,内置冲突检测,能智能合并两边的独有文件。

unison安装

前置准备(A、B 两台机器都要做)

1
2
3
4
5
6
# CentOS 7(先装EPEL源,之前已装过可跳过)
sudo yum install epel-release -y
sudo yum install unison -y

# Ubuntu/Debian
sudo apt install unison -y

配置 SSH 免密登录(双向)
确保 A 能免密登录 B,B 也能免密登录 A:

1
2
3
4
5
6
# 生成公钥和私钥
ssh-keygen -t rsa

# 3个回车后生成成功,然后将公钥拷贝到要免密登录的目标机器上(包括自己)
ssh-copy-id 192.168.1.10
ssh-copy-id 192.168.1.11

首次手动合并(解决初始文件不一致)

先执行一次全量双向同步,把 A 的 m 和 B 的 n 合并到两边:

1
2
3
4
5

# 在机器A上执行(同步A的/data和B的/data)
unison /data ssh://root@B的IP//data \
-auto -batch \
-ignore "Name {.tmp,.swp,~}" # 忽略临时文件

执行结果:
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
2
sudo yum install inotify-tools -y  # CentOS
# sudo apt install inotify-tools -y # Ubuntu

创建实时同步脚本(以机器 A 为例,B 同理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sudo vim /usr/local/bin/unison_sync.sh

粘贴以下内容:
bash
运行

#!/bin/bash
# 监控的目录
WATCH_DIR="/data"
# 目标机器地址
TARGET="root@B的IP:/data"

# 首次同步(确保初始一致)
unison $WATCH_DIR ssh://$TARGET -auto -batch -ignore "Name {.tmp,.swp,~}"

# 实时监听目录变化(CloseWrite:文件写入完成后触发)
inotifywait -m -r -e CloseWrite,Delete,Create,Modify $WATCH_DIR | while read dir events file; do
# 触发同步(避免短时间多次触发,加2秒延迟)
sleep 2
unison $WATCH_DIR ssh://$TARGET -auto -batch -ignore "Name {.tmp,.swp,~}"
echo "[$(date)] 同步触发:$dir$file → $TARGET" >> /var/log/unison_sync.log
done

赋予脚本执行权限

1
sudo chmod +x /usr/local/bin/unison_sync.sh

创建 systemd 服务(开机自启)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo vim /etc/systemd/system/unison-sync.service

粘贴内容:
ini

[Unit]
Description=Unison Bidirectional Sync
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/unison_sync.sh
Restart=on-failure
RestartSec=5s
StandardOutput=append:/var/log/unison_sync.log
StandardError=append:/var/log/unison_sync.log

[Install]
WantedBy=multi-user.target

启动并设置开机自启

1
2
3
4
5
6
sudo systemctl daemon-reload
sudo systemctl start unison-sync
sudo systemctl enable unison-sync

# 检查状态
sudo systemctl status unison-sync

在机器 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 定期切割。

文章目录
  1. unison安装
  2. 首次手动合并(解决初始文件不一致)
  3. 配置实时双向同步
  4. 关键验证(确保双向同步生效)
  5. 避坑提醒
|