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

有一種觀點認爲,在 IT 行業工做的許多人常常從網絡帖子裏複製和粘貼。咱們都幹過,複製粘貼自己不是問題。問題是當咱們在不理解它們的狀況下這樣幹。linux

幾年前,一個曾經在我團隊中工做的朋友須要將虛擬機模板從站點 A 複製到站點 B。他們沒法理解爲何複製的文件在站點 A 上爲 10GB,可是在站點 B 上卻變爲 100GB。git

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

關於 rsync

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

假設你有兩個文件,file_Afile_B。你但願將 file_B 更新爲與 file_A 相同。顯而易見的方法是將 file_A 複製到 file_Bruby

如今,假設這兩個文件位於經過慢速通訊連接(例如,撥號 IP 連接)鏈接的兩個不一樣的服務器上。若是file_A 大,將其複製到 file_B 將會很慢,有時甚至是不可能完成的。爲了提升效率,你能夠在發送前壓縮 file_A,但這一般只會得到 2 到 4 倍的效率提高。bash

如今假設 file_Afile_B 很是類似,而且爲了加快處理速度,你能夠利用這種類似性。一種常見的方法是僅經過連接發送 file_Afile_B 之間的差別,而後使用這個差別列表在遠程端重建文件。服務器

問題在於,用於在兩個文件之間建立一組差別的常規方法依賴於可以讀取兩個文件。所以,它們要求連接的一端預先提供兩個文件。若是它們在同一臺計算機上不是同時可用的,則沒法使用這些算法。(一旦將文件複製過來,就不須要作對比差別了)。而這是 rsync 解決的問題。網絡

rsync 算法有效地計算源文件的哪些部分與現有目標文件的部分匹配。這樣,匹配的部分就不須要經過連接發送了;所須要的只是對目標文件部分的引用。只有源文件中不匹配的部分才須要發送。app

而後,接收者可使用對現有目標文件各個部分的引用和原始素材來構造源文件的副本。工具

另外,可使用一系列經常使用壓縮算法中的任何一種來壓縮發送到接收器的數據,以進一步提升速度。

咱們都知道,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: fedoramagazine.org/copying-lar…

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

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

相關文章
相關標籤/搜索