我的目的是保持兩個遠端目錄(例如 dir1 和 dir2)同步。因此,只要 dir1 的內容發生變更(可以新增或刪除新檔案或目錄,或修改目錄中的檔案內容),則變更應該會傳播到 dir2,反之亦然。
我能想到的簡單方法是在兩台機器上透過 cron 定期運行 rsync。但這種方法存在謬誤:-
- 可能會出現前面的rsysnc沒有完成,而前面的rysnc還在繼續的時候,cron又執行了一次rsync。
- 在 dir1 中新增一個文件,然後在 dir2 上執行 rsync 之前在 dir1 上執行 rsync,然後新新增的檔案可能會從 dir1 中刪除,因為它不存在於 dir2 中
- 而且這也不是即時的。
有人可以建議一些更好的方法嗎?我正在尋找開源的,它將更容易設定和開始。
答案1
在沒有競爭視窗的情況下提供「硬實時」保證的唯一方法是確保寫入僅在寫入雙方後才得到確認。實現此目的的常用方法是在共用區塊裝置上使用叢集檔案系統(例如 OCFS2 或 GFS2)。使用 DRBD 可以輕鬆且廉價地建造這樣的共享區塊設備。
與任何同步機制一樣,您的叢集內網路必須能夠以可接受的延遲承載變更率。
備忘錄大約是
- 在兩側保留區塊設備(磁碟、分割區、LV、..)
- 安裝和設定 DRBD (apt-get install drbd-utils),使用以下優良文檔他們的網站
- 安裝您選擇的叢集堆疊:成熟的 Red Hat(如果您需要的不僅僅是共用檔案系統)或極簡但非常簡單的 O2DLM(包含在 OCFS2 中)。
- 使用 GFS2(僅限 Red Hat 堆疊)或 OCFS2(可能同時使用兩個堆疊)格式化 DRBD 設備並將其安裝在兩側
您現在沒有一對同步目錄:您有一個目錄,在兩個節點上都可用。這在功能上是相同的,但沒有比賽視窗。
答案2
如果位於同一台電腦上,請考慮使用檔案系統連結。這意味著 dir2 “指向” dir1 或反之亦然,同時它是透明的。為了做到這一點,請使用ln
例如ln -s /path/to/dir1 /path/to/dir2
或替代地使用相對路徑。這-s
意味著它是一個符號鏈接,因此它僅引用路徑而不是 的 inode dir1
。
編輯:抱歉,錯過了「兩台機器」部分。
也許考慮使用網路共享,(接近)即時同步兩個位置總是很困難。