使用 rsync 複製大文件的一些誤解
有一種觀點認為,在 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:自動精簡配置
有兩件事可以幫助那個朋友了解正在發生的事情。
該文件在其他地方的大小變得越來越大的問題是由源系統上啟用了 自動精簡配置 (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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive