题 传输15TB的小文件


我正在将数据从一台服务器归档到另一台服务器。最初我开始了 rsync 工作。它花了2周的时间来构建仅5 TB数据的文件列表,并在另一周内传输1 TB的数据。

然后我不得不杀死这份工作,因为我们需要在新服务器上停机一段时间。

我们已经同意将它们放在一边,因为我们可能不需要再次访问它。我想把它分成500 GB的块。在我之后 tar 然后,我打算将它复制过来 ssh。我在用 tar 和 pigz 但它仍然太慢。

有没有更好的方法呢?我认为两台服务器都在Redhat上。旧服务器是Ext4,新服务器是XFS。

文件大小从几kb到几mb,在5TB中有2400万jpeg。所以我猜测15TB大约有600-8000万。

编辑:玩rsync,nc,tar,mbuffer和pigz几天后。瓶颈将是磁盘IO。由于数据是在500个SAS磁盘和大约2.5亿个jpeg上划分的。但是,现在我了解了将来可以使用的所有这些好工具。


73
2017-09-09 15:23




可能重复 linux到linux,10TB转移? - D34DM347
一种选择是在外部驱动器上创建压缩的tar文件并将其移动到新系统。额外的磁盘将加速创建tar文件(不会写入系统中的现有磁盘,可能在尝试从它们读取15TB时)并且不会占用新服务器。 - Brian
有没有更好的方法呢?  - 是的,Windows Server 2012 R2 DFS复制 会在大约10个小时内准备好。它会同步更改,并在重新启动后从中断处继续。 - TessellatingHeckler
@TessellatingHeckler:所以你建议OP在归档之前从Redhat迁移到Windows? - Thomas Weller
@ThomasWeller他们问“有更好的方法吗?”,并且有。我不建议他们使用更好的方法。他们可以自由地在管道中使用命令,无法从中断中恢复,不会验证文件内容,无法报告复制状态,不能使用以前复制的块来避免复制部分文件,没有隐含支持低优先级复制,无法暂停,没有提及复制ACL,并且需要有人保持登录才能运行它。然而,其他任何人都可能会感兴趣 - 或者提示说“x在Linux上做了”。 - TessellatingHeckler


答案:


我用得非常好 tarpigz (并行gzip)和 nc

源机器:

tar -cf - -C /path/of/small/files . | pigz | nc -l 9876

目的地机器:

提取:

nc source_machine_ip 9876 | pigz -d | tar -xf - -C /put/stuff/here

保存档案:

nc source_machine_ip 9876 > smallstuff.tar.gz

如果你想看到传输速率只是通过 pv 后 pigz -d


62
2017-09-09 16:29



仅供参考,你可以更换 pigz 同 gzip 或完全删除它,但速度会明显变慢。 - h0tw1r3
如果OP已经尝试过,如何接受这一点 tar 和 pigz?我不明白...... - Thomas Weller
@ThomasWeller你在哪里得到了他的尝试 pigz?从问题看起来他只是尝试过 rsync到目前为止,是 考虑 运用 tar 分割和捆绑数据。特别是如果他没有使用过 -z/--compress rsync选项, pigz 理论上可以帮助显着。 - Doktor J
@ThomasWeller是的确我已经尝试了tar和pigz但不是nc。我使用ssh所以它增加了更多的开销。 - lbanz
@lbanz就是这个意思 tar 没有足够快地生成数据 pigz 使用大量CPU进行压缩。读取大量的小文件涉及更多的系统调用,更多的磁盘搜索,以及比读取相同数量的大文件字节更多的内核开销,看起来你只是在基本层面上的瓶颈。 - hobbs


我坚持使用rsync解决方案。 Modern(3.0.0+)rsync使用增量文件列表,因此它不必在传输之前构建完整列表。因此,重新启动它不会要求您在发生故障时再次进行整体转移。拆分每个顶级或二级目录的传输将进一步优化这一点。 (我会用 rsync -a -P 并添加 --compress 如果您的网络比您的驱动器慢。)


20
2017-09-09 18:44



我在旧服务器上使用rsync 2.6.8。因为它是我们不允许安装/更新供应商所声明的任何东西的盒子之一,或者它使保修失效。我可能会更新它,看看它是否更快。 - lbanz
查找(或构建)静态链接的rsync二进制文件,然后从您的家中运行它。希望这不会破坏不保证。 - Fox


设置VPN(如果是互联网),在远程服务器上创建一些格式的虚拟驱动器(使其成为ext4),将其安装在远程服务器上, 然后 在本地服务器上安装(使用像iSCSI这样的块级协议),并使用dd或其他块级工具进行传输。然后,您可以根据自己的方便将文件从虚拟驱动器复制到真实(XFS)驱动器。

两个原因:

  1. 没有文件系统开销,这是主要的性能元凶
  2. 没有寻求,你正在寻找双方的顺序读/写

15
2017-09-09 16:17



绕过文件系统很好。复制读写挂载文件系统的块级是一个非常糟糕的主意。首先卸载或挂载只读。 - JB.
拥有15TB副本也很糟糕。这意味着新服务器至少需要30个。 - Arthur Kay
如果服务器使用LVM,则可以执行文件系统的只读快照并复制它。仅在读取快照时发生的文件系统更改的空间开销。 - liori


如果旧服务器正在退役且文件可以离线几分钟,那么通常最快将驱动器拉出旧盒子并将它们连接到新服务器,安装它们(现在重新联机)并复制文件到新服务器本机磁盘。


9
2017-09-10 03:14



它大约是1PB的2TB驱动器,所以它太多了。 - lbanz


使用mbuffer,如果它在安全网络上,则可以避免加密步骤。


3
2017-09-09 15:39





(许多不同的答案都可以。这是另一个答案。)

使用生成文件列表 find -type f (这应该在几个小时内完成),将其分成小块,然后使用传输每个块 rsync --files-from=...


3
2017-09-10 23:34





你考虑过sneakernet吗?有了它,我的意思是将所有内容转移到同一个驱动器上,然后将该驱动器物理移动。

大约一个月前,三星推出了16 TB的驱动器(技术上,它是15.36 TB),这也是一款SSD: http://www.theverge.com/2015/8/14/9153083/samsung-worlds-largest-hard-drive-16tb

我认为这个驱动器就是这样做的。您仍然需要复制所有文件,但由于您没有网络延迟并且可能使用SATA或类似的快速技术,因此它应该快得多。


3
2017-09-12 17:56





如果在重复数据删除时有任何机会获得高成功率,我会使用类似的东西 borgbackup 或阁楼。

如果没有,请检查netcat + tar +pbzip2 解决方案,根据您的硬件调整压缩选项 - 检查瓶颈是什么(CPU?网络?IO?)。 pbzip2可以很好地跨越所有CPU,从而提供更好的性能。


2
2017-09-09 20:38



lzma(xz)比bzip2更快地解压缩,并且在大多数输入上表现良好。不幸, xz多线程选项尚未实现。 - Peter Cordes
通常压缩阶段比解压缩需要更多的功率,因此如果CPU是限制因素,pbzip2将导致更好的整体性能。如果两台机器相似,则减压不应影响过程。 - neutrinus
是的,我的观点是,没有单流多线程lzma是一种耻辱。虽然对于这个用例,传输整个文件系统的数据, pigz 可能会。是你想要使用的最慢的压缩器。甚至 lz4。 (有个 lz4mt 可用于多线程的单流。它没有非常高效的线程(非常频繁地生成新线程),但它确实获得了稳定的加速) - Peter Cordes


您正在使用RedHat Linux,因此这不适用,但作为另一种选择:

我使用ZFS来保存数百万个文件非常成功,因为inode不是问题。

如果这是您的选项,则可以拍摄快照并使用zfs发送增量更新。我使用这种方法传输以及存档数据已经取得了很大的成功。

ZFS主要是一个Solaris文件系统,但可以在illumos(Sun的OpenSolaris的开源分支)中找到。我知道在BSD和Linux下使用ZFS也很幸运(使用FUSE?) - 但我没有尝试过这方面的经验。


2
2017-09-10 18:49



很长一段时间以来,ZFS已经有一个非FUSE本机Linux端口了: zfsonlinux.org - EEAA