使用 rsync 複製大文件的一些誤解

使用 rsync 複製大文件的一些誤解

這位朋友認為 rsync 是一個神奇的工具,應該僅“同步”文件本身。但是,我們大多數人所忘記的是瞭解 rsync 的真正含義、用法,以及我認為最重要的是它原本是用來做什麼的。

-- Daniel Leite De Abreu(作者)

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

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

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

關於 rsync

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

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

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

現在假設 file_A 和 file_B 非常相似,並且為了加快處理速度,你可以利用這種相似性。一種常見的方法是僅通過鏈接發送 file_A 和 file_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,那也只需發生一次。以下所有更新僅複製差異,從而使複製非常高效。


via: https://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/

作者: Daniel Leite de Abreu 選題: lujun9972 譯者: wxy 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出


分享到:


相關文章: