歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 高效的大文件拷貝

高效的大文件拷貝

日期:2017/2/28 14:35:37   编辑:Linux教程

當你要兩台機器之間拷貝一些大文件的時候,把nc(netcat)和pigz(parallel gzip)組合起來會是一個簡單和高效的選擇。不過,如果要把這些文件同時分發到多台機器,有什麼好法子嗎?在Tumblr,這還算蠻常見的需求,比如我們要快速的同時增加幾台MySQL Slave的時候。

你可以從源機器逐個拷貝到逐台目標機器,但是往往時間也是成倍的。或者你也可以同時從源機器同時拷貝到多個目標機器,但是受制於源機器的帶寬等因素,速度並不見得真的很快。

還好,借助一些UNIX工具可以做的更好。把tee和FIFO組合起來,可以形成一個文件快速分發鏈:處於分發鏈中的每台機器會保存文件,同時還分發給它的下一環。

首先,選定一台目標機器做為分發鏈的最後一環,在這台機器上只需要用nc監聽(假定端口是1234),再通過管道由pigz解壓縮,繼續通過管道把數據交由tar來分解。

  1. nc -l 1234| pigz -d | tar xvf -

然後,再從分發鏈的末端往上走,設置其它目標機器,同樣要經過監聽、解壓、分解,不過在解壓之前我們通過tee命令將數據輸出到命名管道(FIFO),另外的一條shell管道會將這些未解壓的數據同時分發到分發鏈的下一環:

  1. mkfifo myfifo
  2. nc hostname_of_next_box 1234 nc -l 1234| tee myfifo | pigz -d | tar xvf -

最後,在源機器上啟動分發鏈,讓數據傳輸到分發鏈的第一環:

  1. tar cv some_files | pigz | nc hostname_of_first_box 1234

在我的測試中,分發鏈中的每台機器大概損失了3%-10%的性能(相對於1對1的拷貝而言),但是相對逐個逐個的拷貝或者單台機器向多台機器同時分發,效率提升是很明顯的。

Copyright © Linux教程網 All Rights Reserved