我有两个来自不同供应商的大型存储arrays,每个大约有10Gb / s的带宽供读/写。 我需要将多个TB文件从一个移动到另一个。 每个说NFS和CIFS。 目前使用cp或scp或rsync,中间主机的GbE接口成为瓶颈,因为我必须读取一个数组并写入另一个数组。 这两个arrays上都没有主机,我可以login切断中间人。 我有一堆主机,可以提供额外的带宽,只要我可以做这样的事情:
rsync [src] [dest] --parallel-hosts=host1,host2,host3,host4
有没有一个简单的解决scheme呢?
我使用的一个技巧是并行处理这样的事情,就是通过两遍 – 首先生成一个要传输的文件列表,然后拆分该列表,然后把这个工作放到多台机器上。
你可以用rsync来做到这一点:
这大大有助于networking文件系统(NFS,Lustre等),通常无法从单个rsync进程/机器获得足够的性能。
拖曳文件系统来比较它们仍然需要一段时间,但是实际的数据移动可能非常快。 而且,像cpio和cp这样的东西往往比原始数据移动的rsync性能更好。
我经常使用的另一个选项是做一个简单的find -type f /src ,然后拆分该文件列表并将其提供给多个主机上的cpio。
我很想知道一个更简单/更快的方法来做到这一点…
如果两个存储arrays不能直接对话,那么最好的办法是用高带宽连接构build一个特制的机器。 即使是相对便宜的带有一对10GbE NIC的新型工作站,如果支持的networking和存储arrays能够承受,也可以抽出大量的带宽。
您应该与您的存储供应商联系,确定控制器是否可以直接对话。 如果不build立或租用高带宽的中间节点。 我的猜测是,有两种方法可以使两个arrays发挥出色,并在控制器上运行完整的克隆。
如果你找不到控制器互相交stream的方式(就像其他人所说的那样),你可以尝试这样做:
在您的目标服务器上,运行以下命令:
$ nc -l -p 9999 | tar xvzf -
然后,在源服务器上运行以下命令:
$ tar cvzf - <SOURCEFILES> | nc -q 1 <DST_SERVER> 9999
这样做的好处是避免了SSH / rsync提供的任何encryption开销,所以你会得到一些提升的速度。 这也会在源和目标服务器上进行压缩和解压缩,因此它会以一些CPU周期为代价加速传输过程。
祝你好运!