更有效的复制一个文件到多台机器

从tumblr那儿发现的,原文:
http://engineering.tumblr.com/post/7658008285/efficiently-copying-files-to-multiple-destinations

从原服务器拷贝一个文件到多个服务器,串行方式浪费时间,并行则会受限于自己网络流量上限。
解决思路是将所有目标服务器形成一个“链”,每个节点向下一个节点传递数据。将单个服务器网卡流量限制问题,分摊到了每个节点上。

在最后一台服务器上:
[bash toolbar=”false”]
$ nc -l 1234 | pigz -d | tar xvf –
[/bash]

在之前的服务器上:
1) 建立有名管道:
[bash toolbar=”false”]$ mkfifo myfifo [/bash]
2) 将有名管道中的数据传到后续的节点
[bash toolbar=”false”]$ nc hostname_of_next_box 1234 <myfifo & [/bash]
3) 用过nc接受数据,并用tee同时传递给有名管道
[bash toolbar=”false”]$ nc -l 1234 | tee myfifo | pigz -d | tar xvf – [/bash]

对源文件进行压缩传输:
[bash toolbar=”false”]$ tar cv some_files | pigz | nc hostname_of_first_box 1234 [/bash]

注释:
pigz命令,用来替代gzip的多线程版本,在多核机器上会更充分利用CPU
eg:
[bash toolbar=”false”]$ pigz -kK a.jpg
[/bash]
(大K表示压缩,小k表示保留原始文件,否则处理完原始文件将被删除)