一、目标
/usr/local/src/projects 目录在两台 CentOS 7 服务器之间双向实时同步
- 任何一台机器目录变化,都会自动同步到另一台
- 开机自动运行,断网重连后继续同步
二、过程
- 安装
unison
- 配置免密 SSH
- 创建 unison 配置文件
- 创建实时监控脚本
- 注册 systemd 服务并启动
三、部署
1、安装 unison
https://github.com/bcpierce00/unison/releases 下载2.48.15版本
cp ./unison /usr/local/bin/
chmod +x /usr/local/bin/unison
unison -version
2、配置免密 SSH
#1、生成 SSH 密钥对(默认采用 RSA 算法),执行后,全部按回车(Enter)使用默认值即可。生成成功后,会在 ~/.ssh/ 目录下创建两个文件:id_rsa:私钥(重要!不可泄露给他人)。id_rsa.pub:公钥(需要上传到远程服务器)。
ssh-keygen -t rsa -b 4096
#2、将本地公钥上传到远程服务器,执行后会提示输入远程服务器的密码,输入正确后,本地公钥会自动添加到远程服务器的 ~/.ssh/authorized_keys 文件中。
#ssh-copy-id -p 远程SSH端口 远程用户名@远程服务器IP
ssh-copy-id -p 22 root@192.168.1.2
#3、验证免密登录
#ssh -p 远程SSH端口 远程用户名@远程服务器IP
ssh -p 22 root@192.168.1.2
3、创建 unison 配置文件
#创建配置文件:/root/.unison/default.prf
root = /usr/local/src/projects
root = ssh://root@192.168.1.2:22//usr/local/src/projects
ignore = Name *.swp
ignore = Name *.tmp
ignore = Name *~
#recurse = true
auto = true
batch = true
prefer = newer
4、创建实时监控脚本
#创建sh脚本:/usr/local/bin/unison-realtime.sh
#!/bin/bash
# 要同步的目录
SYNC_DIR="/usr/local/src/projects"
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
log "开始检测目录:‘$SYNC_DIR’"
if inotifywait -r -e modify,create,delete,move,attrib "$SYNC_DIR" >/dev/null 2>&1; then
log "检测到目录'$SYNC_DIR'变化,触发同步..."
# 执行同步,忽略错误(避免同步失败导致脚本退出)
if unison default >/dev/null 2>&1; then
log "同步成功"
else
log "同步失败(错误码:$error_code)!请手动执行 'unison default' 查看详情"
fi
fi
5、注册 systemd 服务并启动
#1、创建service文件: /etc/systemd/system/unison-realtime.service
[Unit]
Description=Unison Realtime Sync
After=network.target
[Service]
ExecStart=/usr/local/bin/unison-realtime.sh
Restart=always
RestartSec=10 # 失败后等待 10 秒再重启(默认 0.5 秒,容易超限)
StartLimitInterval=60 # 60 秒内的重启次数限制
StartLimitBurst=10 # 60 秒内最多允许 10 次重启(默认 5 次)
User=root
StandardOutput=journal # 日志输出到 journalctl
StandardError=journal
[Install]
WantedBy=multi-user.target
2、同步systemd服务
systemctl daemon-reload
systemctl enable unison-realtime
systemctl start unison-realtime
systemctl status unison-realtime
四、注意事项
两台服务器都要部署以上脚本
第一次运行会全量同步 /usr/local/src/projects 目录
unison 默认会以修改时间新的文件为准解决冲突
如果要同步大文件,建议在低峰期首次运行