從定時到實時:用 inotify+rsync 實現文件高效同步
在上一篇文章:一文搞懂 rsync:原理剖析 + Rocky Linux 主機同步部署實戰
我們實現了通過 rsync + cron 的方式定時同步文件,適用于對實時性要求不高的場景。比如網站內容部署、日志備份、圖片上傳等。然而在很多實際應用中,我們希望文件一旦發生變更,馬上同步到目標位置。
這時,我們就可以用今天要介紹的組合:inotify + rsync 實時文件同步方案。
1. inotify 是什么?
inotify 是 Linux 內核提供的一種機制,可以監聽文件系統的變化,比如文件的創建、修改、刪除、移動等操作。我們可以通過工具如 inotifywait 來利用它。
實現思路:通過 inotify 實時監聽源目錄,當檢測到變化時,立即觸發一次 rsync 同步操作,極大地提升了效率和數據一致性。
inotify+rsync組合優勢:
- 實時響應:監控文件變化,立即觸發同步
- 資源占用低:相比定時輪詢更省資源
- 部署簡單:無需額外服務進程,腳本即可運行
2. 實戰部署
上一篇文章已經將rsync部署好了,這次只需要安裝inotify就行.
在源主機(10.0.0.110)上操作:
(1) 安裝 inotify-tools
Rocky Linux 默認的軟件倉庫中 沒有inotify-tools,所以我們需要啟用 EPEL源才能安裝。
# 安裝epel源
dnf install -y epel-release
# 安裝inotify-tools
dnf install inotify-tools -y
# 檢查
inotifywait --help
(2) 編寫實時同步腳本
我們編寫一個腳本 /opt/realtime_rsync.sh,實現文件變更即同步。
#!/bin/bash
# 實時同步腳本:部署在 10.0.0.110 上(源服務器)
SRC="/var/www/html" # 本地源目錄,末尾必須加斜杠
DEST="10.0.0.111:/backup/web" # 遠程目標地址
LOG="/var/log/realtime_rsync.log" # 日志文件位置
while inotifywait -r -e modify,create,delete,move "$SRC"
do
rsync -azP --delete $EXCLUDE"$SRC""$DEST" >> "$LOG" 2>&1
echo"[$(date)] 同步完成" >> "$LOG"
# 可選:避免頻繁觸發同步,稍作延遲
sleep 2
done
參數說明:
命令 | 作用 |
| 遞歸監聽目錄及其子目錄的修改/創建/刪除/移動事件 |
| 增量歸檔壓縮傳輸,顯示進度 |
| 刪除目標中源目錄已刪除的文件,實現鏡像同步 |
| 把輸出追加到日志文件中便于排查問題 |
(3) 配置SSH 免密登錄
為了實現自動同步,建議你在 10.0.0.110 上配置對 10.0.0.111 的 SSH 免密登錄
ssh-keygen -t rsa # 一路回車
ssh-copy-id root@10.0.0.111
# 輸入密碼
# 測試
ssh root@10.0.0.111
(4) 后臺運行腳本(推薦)
nohup bash /opt/realtime_rsync.sh &
(5) 測試驗證
在源主機上同步目錄創建新文件
cd /var/www/html
touch touch test1.txt
從圖片可以看到新建的文件已經自動完成了同步:
檢查日志的同步情況:
【溫馨提示】這個日志一直會生成,建議做個定時任務定時清理,不然會導致磁盤空間。
3. 應用場景推薦
- Web 服務器部署代碼實時同步
- 圖片/視頻上傳目錄備份到云服務器
- 多機共享一個工作目錄(只讀同步)
- 日志文件收集實時傳送到分析服務
本次分享結束啦,后期會更新更多技術干貨文章!