Rsync

lsyncd - 將多個客戶端同步到同一個目錄會中斷同步

  • July 21, 2021

背景 -

我正在嘗試將 NAS 與 DR_NAS 同步以實現 HA 目的。

不幸的是,這有一個複雜的問題。

  1. NAS在阿里雲上。他們還不支持 NAStoNAS 同步。
  2. 我知道的最好方法是在 2 個 NAS 之間安裝同步協議,但我無法直接連接到 NAS。阿里巴巴控制它。
  3. 我嘗試將它們安裝在單個系統上,並在兩個 NAS 之間使用 lsyncd/rsync。但它失敗了。
  4. lsyncd 的主要作者說 lsyncd 使用 Inotify Wait,它使用 Linux Kernel 來監視文件系統。但是 Linux Kernel 不監視 NFS 文件系統。它知道伺服器本身何時將文件寫入 NAS,但不知道其他系統何時寫入。
  5. 所以我必須在每個將文件寫入 NAS 的系統上設置 lsyncd,因為這是 Inotify Wait 知道的唯一方法。
  6. 同步已設置。如果系統將文件寫入 (PROD NAS):/data/A/,lsyncd 會檢測到它並將其報告給 rsync 伺服器。然後rsync伺服器將文件寫入對應目錄(DR NAS):/data/A/

目前狀態 -

在此處輸入圖像描述

它似乎工作得很好,直到有一天我發現同步被破壞了。

看起來作者無法同步同一個目錄。

  • 當 SystemA 在 /data/A 上寫入而 SystemB 在 /data/B 上寫入時,rsync 伺服器也會這樣做。
  • 當 SystemA 和 SystemB 同時寫入 /data/C 時,其中一個同步中斷,從那時起只有一個系統可以寫入 /data/C。

問題

  1. 多個 lsyncd 客戶端可以與 rsync 伺服器同步並使用同一目錄嗎?
  2. 有沒有更好的方法來同步兩個遠端 NFS 目錄?

我找到了在同一目錄上寫入可能導致同步斷開的原因。

Rsync 行為:

Rsyncd 是一個由 root 使用者執行的守護程序。目錄權限在 rsyncd.conf 中配置。如果配置的 UID 與目標目錄的 UID 不匹配,即使它擁有所有權限,同步也會中斷。


我的案例:文件儲存在日期滾動目錄中,例如 /data/2021/07/20、/data/2021/07/21 等。

儘管系統從不寫相同的文件,但它們注定要寫在同一個“新”目錄下。

例如,

如果其中一個 lsyncd 伺服器檢測到“source:/data/2021/07/25/A”中有一個新文件,但目錄“target:/data/2021/07/25/”尚不存在,則rsync server會先在root權限下創建目錄“target:/data/2021/07/25” ,然後復製文件A。目錄“target:/data/2021/07/25”的權限將不匹配源的直到文件“A”被完全複製。傳輸文件時,rsync 將同步目錄權限。

由於這種行為,可能會發生同步斷開連接。如果源 B 檢測到“source:/data/2021/07/25”,而源 A 仍在 root 權限的目錄下寫入,則與源 B 和目標的同步將中斷。

我試圖通過提前創建每日目錄來解決此問題,但今天其中一個同步在寫入 0 字節文件後凍結後被破壞。

問題出在“lsyncd 使用 Inotify Wait”中 - 大概在 /data 目錄級別(?),這會導致目標數據的更改觸發 lsync 程序啟動。

如果兩個源同時更新同一個目標,那麼即使它們正在更新同一個文件,您也不能依賴這些更新,即使它們是有效的。使用同一個目錄應該沒有問題。

如果 inotify 是在更細粒度的級別上指定的 - 例如文件級別,那麼如果只有一個源正在寫入文件(並且可能其他程序正在從中讀取),那麼應該沒有問題。

因此,當只有一個 SystemX 在 /data/X 上寫入時,不會發生衝突。

但是,當兩個 SystemX 正在寫入 /data/SAME 時,您將錯過一些inotify目錄級別的觸發事件,從而導致 lsync 錯過一些更新。

關於如何同步兩個 NAS 目錄的答案需要詳細了解您的系統 - 但是如果在適當的目錄中沒有重複的文件,您可以rsync(分別)對兩個 NAS 系統執行定期同步。

引用自:https://unix.stackexchange.com/questions/658449