一、目標
/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 默認會以修改時間新的文件為準解決沖突
如果要同步大文件,建議在低峰期首次運行