Backup

我可以使用同一個文件列表同步到多個目的地嗎?

  • April 30, 2020

我想知道 rsync 是否可以一次性將一個目錄複製到多個遠端目標,甚至可以並行複制。(不是必需的,但會很有用。)

通常情況下,類似以下的內容就可以正常工作:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

如果這是唯一的選擇,我會使用它。然而,/junk 位於一個包含大量文件的慢速驅動器上,與實際傳輸/更新相比,每次重建大約 12,000 個文件的文件列表非常慢(約 5 分鐘)。是否可以做這樣的事情來完成同樣的事情:

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

這是 rsync 手冊頁中有關批處理模式的資訊。

批處理模式

批處理模式可用於將同一組更新應用於許多相同的系統。假設一個人有一棵樹,它在多個主機上複製。現在假設已經對此源樹進行了一些更改,並且這些更改需要傳播到其他主機。為了使用批處理模式執行此操作,rsync 使用 write-batch 選項執行,以將對源樹所做的更改應用到目標樹之一。write-batch 選項使 rsync 客戶端將針對其他相同目標樹重複此操作所需的所有資訊儲存在“批處理文件”中。

在更新多個目標樹時,一次生成批處理文件無需多次執行文件狀態、校驗和和數據塊生成。多播傳輸協議可用於一次將批量更新文件並行傳輸到許多主機,而不是單獨向每個主機發送相同的數據。

要將記錄的更改應用到另一個目標樹,請使用 read-batch 選項執行 rsync,指定同一批處理文件的名稱和目標樹。Rsync 使用儲存在批處理文件中的資訊更新目標樹。

為方便起見,使用 write-batch 選項時還會創建一個腳本文件:它的名稱將與附加“.sh”的批處理文件相同。此腳本文件包含適用於使用相關批處理文件更新目標樹的命令行。它可以使用 Bourne(或類似 Bourne)的 shell 執行,可選擇傳入備用目標樹路徑名,然後使用該路徑名代替原始目標路徑。噹噹前主機上的目標樹路徑與用於創建批處理文件的路徑不同時,這很有用。

  Examples:

         $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/
         $ scp foo* remote:
         $ ssh remote ./foo.sh /bdest/dir/

         $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
         $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo

在這些範例中,rsync 用於從 /source/dir/ 更新 /adest/dir/,重複此操作的資訊儲存在“foo”和“foo.sh”中。然後使用進入目錄 /bdest/dir 的批處理數據更新主機“遠端”。這兩個範例之間的差異揭示了您在處理批次方面的一些靈活性:

  • 第一個範例表明初始副本不必是本地的——您可以根據需要使用 remote-shell 語法或 rsync 守護程序語法將數據推送到遠端主機或從遠端主機拉取數據。
  • 第一個範例在遠端主機上執行 read-batch 命令時使用創建的“foo.sh”文件來獲取正確的 rsync 選項。
  • 第二個範例通過標準輸入讀取批處理數據,因此不需要先將批處理文件複製到遠端電腦。此範例避免使用 foo.sh 腳本,因為它需要使用修改後的 –read-batch 選項,但如果您希望使用它,可以編輯腳本文件(只要確保沒有其他選項試圖使用標準輸入,例如“–exclude-from=-”選項)。

注意事項:

read-batch 選項期望它正在更新的目標樹與用於創建批量更新文件集的目標樹相同。當遇到目標樹之間的差異時,可能會丟棄更新並發出警告(如果文件似乎已經是最新的),或者可能會嘗試文件更新,然後,如果文件驗證失敗,更新因錯誤而被丟棄。這意味著如果命令被中斷,重新執行批量讀取操作應該是安全的。如果您希望無論文件的大小和日期如何都希望始終嘗試批量更新,請使用 -I 選項(在讀取批處理時)。如果發生錯誤,目標樹可能會處於部分更新狀態。在這種情況下,

所有目標上使用的 rsync 版本必須至少與用於生成批處理文件的版本一樣新。如果批處理文件中的協議版本對於批處理讀取的 rsync 來說太新而無法處理,rsync 將因錯誤而死。另請參閱 –protocol 選項,了解如何讓創建 rsync 生成一個較舊的 rsync 可以理解的批處理文件。(請注意,批處理文件在 2.6.3 版本中更改了格式,因此無法將舊版本與新版本混合使用。)

讀取批處理文件時,如果您沒有將某些選項的值設置為與批處理寫入命令相同,則 rsync 將強制某些選項的值與批處理文件中的數據匹配。可以(並且應該)更改其他選項。例如,–write-batch 更改為–read-batch,–files-from 被刪除,並且不需要–filter/–include/–exclude 選項,除非指定了–delete 選項之一.

創建 BATCH.sh 文件的程式碼將任何過濾器/包含/排除選項轉換為單個列表,該列表作為“here”文件附加到 shell 腳本文件中。如果需要更改 –delete 刪除的內容,高級使用者可以使用它來修改排除列表。普通使用者可以忽略這個細節,而只是使用 shell 腳本作為一種簡單的方法來為批處理數據執行適當的 –read-batch 命令。

rsync 中的原始批處理模式基於“rsync+”,但最新版本使用了新的實現。

我想你可以試試

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup

引用自:https://serverfault.com/questions/137119