分塊大型 rsync 傳輸?
我們使用 rsync 將主文件伺服器的鏡像更新為異地託管備份伺服器。我們目前遇到的問題之一是我們的文件伺服器有 > 1TB 的大部分較小的文件(在 10-100kb 範圍內),當我們傳輸這麼多數據時,我們通常會在幾個小時內斷開連接轉移。Rsync 沒有恢復/重試功能,它只是重新連接到伺服器以從中斷的地方拾取 - 您需要完成文件比較過程,最終我們擁有的文件數量非常長。
建議繞過的解決方案是將大型 rsync 傳輸拆分為一系列較小的傳輸。我認為最好的方法是使用頂級目錄名稱的第一個字母,這並沒有給我們一個完美均勻的分佈,但已經足夠好了。
我想確認我這樣做的方法是否合理,或者是否有更簡單的方法來實現目標。
為此,我遍歷 AZ、az、0-9 以選擇一個字元
$prefix
。最初我只是想跑步rsync -av --delete --delete-excluded --exclude "*.mp3" "src/$prefix*" dest/
(–exclude “*.mp3” 只是一個例子,因為我們有一個更長的排除列表來刪除臨時文件之類的東西)
這樣做的問題是 dest/ 中不再存在於 src 上的任何頂級目錄都不會被 –delete 拾取。為了解決這個問題,我改為嘗試以下方法:
rsync \ --filter 'S /$prefix*' \ --filter 'R /$prefix*' \ --filter 'H /*' \ --filter 'P /*' \ -av --delete --delete-excluded --exclude "*.mp3" src/ dest/
我使用
show
andhide
overinclude
andexclude
,否則 –delete-excluded 將刪除任何與 $prefix 不匹配的內容。這是將 rsync 分成更小的塊的最有效方法嗎?有沒有更有效的工具,或者我錯過的標誌,可以讓這更簡單?
我對此的解決方案是一種不同的兩遍方法,我在其中權衡了一些磁碟空間。我在伺服器上執行 rsync –only-write-batch,然後將批處理文件本身 rsync 到目標,循環直到 rsync 成功。一旦批處理完全結束,目標上的 rsync –read-batch 將重新創建所有更改。
這對我來說也有一些意想不到的好處:
- 因為我更擔心備份“存在”而不是“可用”我實際上並不是每天都在接收端進行讀取批處理——大多數時候批處理相對較小
- 我一直在嘗試使用 –checksum-seed=1 …我可能誤讀了文件,但我認為它使批處理文件更加可同步(即,當我不執行任何 –read-batch 時給定一天,第二天的批次同步更快,因為前一天的批次是一個很好的基礎)
- 如果批次太大而無法通過網際網路“及時”發送,我可以在外部驅動器上通過運動鞋網將其發送出去。及時我的意思是,如果我無法在第二天的備份開始之前完成並閱讀該批次。
- 雖然我個人不這樣做,但我可以在不同的位置有兩個異地備份並將批處理髮送給他們兩個。