使用 rsync 複製大檔案的一些誤解

2019-10-02 13:40:00

有一種觀點認為,在 IT 行業工作的許多人經常從網路貼文裡複製和貼上。我們都幹過,複製貼上本身不是問題。問題是當我們在不理解它們的情況下這樣幹。

幾年前,一個曾經在我團隊中工作的朋友需要將虛擬機器模板從站點 A 複製到站點 B。他們無法理解為什麼複製的檔案在站點 A 上為 10GB,但是在站點 B 上卻變為 100GB。

這位朋友認為 rsync 是一個神奇的工具,應該僅“同步”檔案本身。但是,我們大多數人所忘記的是了解 rsync 的真正含義、用法,以及我認為最重要的是它原本是用來做什麼的。本文提供了有關 rsync 的更多資訊,並解釋了那件事中發生了什麼。

關於 rsync

rsync 是由 Andrew Tridgell 和 Paul Mackerras 建立的工具,其動機是以下問題:

假設你有兩個檔案,file_Afile_B。你希望將 file_B 更新為與 file_A 相同。顯而易見的方法是將 file_A 複製到 file_B

現在,假設這兩個檔案位於通過慢速通訊連結(例如,撥號 IP 連結)連線的兩個不同的伺服器上。如果file_A 大,將其複製到 file_B 將會很慢,有時甚至是不可能完成的。為了提高效率,你可以在傳送前壓縮 file_A,但這通常只會獲得 2 到 4 倍的效率提升。

現在假設 file_Afile_B 非常相似,並且為了加快處理速度,你可以利用這種相似性。一種常見的方法是僅通過連結傳送 file_Afile_B 之間的差異,然後使用這個差異列表在遠端端重建檔案。

問題在於,用於在兩個檔案之間建立一組差異的常規方法依賴於能夠讀取兩個檔案。因此,它們要求連結的一端預先提供兩個檔案。如果它們在同一台計算機上不是同時可用的,則無法使用這些演算法。(一旦將檔案複製過來,就不需要做對比差異了)。而這是 rsync 解決的問題。

rsync 演算法有效地計算原始檔的哪些部分與現有目標檔案的部分匹配。這樣,匹配的部分就不需要通過連結傳送了;所需要的只是對目標檔案部分的參照。只有原始檔中不匹配的部分才需要傳送。

然後,接收者可以使用對現有目標檔案各個部分的參照和原始素材來構造原始檔的副本。

另外,可以使用一系列常用壓縮演算法中的任何一種來壓縮傳送到接收器的資料,以進一步提高速度。

我們都知道,rsync 演算法以一種漂亮的方式解決了這個問題。

rsync 的介紹之後,回到那件事!

問題 1:自動精簡設定

有兩件事可以幫助那個朋友了解正在發生的事情。

該檔案在其他地方的大小變得越來越大的問題是由源系統上啟用了自動精簡設定Thin Provisioning(TP)引起的,這是一種優化儲存區域網路(SAN)或網路連線儲存(NAS)中可用空間效率的方法。

由於啟用了 TP,原始檔只有 10GB,並且在不使用任何其他設定的情況下使用 rsync 進行傳輸時,目標位置將接收到全部 100GB 的大小。rsync 無法自動完成該(TP)操作,必須對其進行設定。

進行此工作的選項是 -S(或 –sparse),它告訴 rsync 有效地處理稀疏檔案。它會按照它說的做!它只會傳送該稀疏資料,因此源和目標將有一個 10GB 的檔案。

問題 2:更新檔案

當傳送一個更新的檔案時會出現第二個問題。現在目標僅接收 10GB 了,但始終傳輸的是整個檔案(包含虛擬磁碟),即使只是在該虛擬磁碟上更改了一個組態檔。換句話說,只是該檔案的一小部分發生了更改。

用於此傳輸的命令是:

rsync -avS vmdk_file syncuser@host1:/destination

同樣,了解 rsync 的工作方式也將有助於解決此問題。

上面是關於 rsync 的最大誤解。我們許多人認為 rsync 只會傳送檔案的增量更新,並且只會自動更新需要更新的內容。但這不是 rsync 的預設行為

如手冊頁所述,rsync 的預設行為是在目標位置建立檔案的新副本,並在傳輸完成後將其移動到正確的位置。

要更改 rsync 的預設行為,你必須設定以下標誌,然後 rsync 將僅傳送增量:

--inplace               原地更新目標檔案--partial               保留部分傳輸的檔案--append                附加資料到更短的檔案--progress              在傳輸時顯示進度條

因此,可以確切地執行我那個朋友想要的功能的完整命令是:

rsync -av --partial --inplace --append --progress vmdk_file syncuser@host1:/destination

注意,出於兩個原因,這裡必須刪除稀疏選項 -S。首先是通過網路傳送檔案時,不能同時使用 –sparse–inplace。其次,當你以前使用過 –sparse 傳送檔案時,就無法再使用 –inplace 進行更新。請注意,低於 3.1.3 的 rsync 版本將拒絕 –sparse–inplace 的組合。

因此,即使那個朋友最終通過網路複製了 100GB,那也只需發生一次。以下所有更新僅複製差異,從而使複製非常高效。