传输15TB的小文件

我正在将数据从一台服务器归档到另一台服务器。 最初我开始了一个rsync工作。 花了2周的时间才为5TB的数据创build文件列表,另外一个星期要传输1TB的数据。

然后我不得不杀了这个工作,因为我们需要在新的服务器上停机。

我们已经达成一致意见,因为我们可能不需要再次访问它。 我正在考虑把它分成500GB大块。 之后我tar它然后我要通过ssh复制它。 我正在使用tarpigz但它仍然太慢。

有没有更好的方法来做到这一点? 我认为这两个服务器都在Redhat上。 旧服务器是Ext4,新服务器是XFS。

文件大小从几kb到几MB,在5TB中有2400万jpeg。 所以我估计大概有6千万到8千万的15TB。

编辑:在与rsync,NC,焦油,mbuffer和pigz玩了几天之后。 瓶颈将是磁盘IO。 由于数据分布在500个SAS磁盘和大约2.5亿个JPEG文件中。 但是,现在我了解了以后可以使用的所有这些好工具。

    我用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 

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

    我会坚持rsync解决scheme。 现代(3.0.0以上)rsync使用增量文件列表,所以它不必在传输之前build立完整列表。 因此重新启动它不会要求您在发生故障时再次进行整个传输。 拆分每个顶级或二级目录的传输将进一步优化。 (如果你的networking比你的驱动器慢,我会使用rsync -a -P并添加--compress 。)

    build立一个VPN(如果它的互联网),在远程服务器上创build某种格式的虚拟驱动器(使其成为ext4),将其安装在远程服务器上, 然后将其安装在本地服务器上(使用块级协议,如iSCSI ),并使用dd或其他块级别的工具来进行传输。 然后,您可以将虚拟驱动器上的文件复制到实际(XFS)驱动器上,方便您使用。

    两个原因:

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

    如果旧的服务器正在退役,并且文件可能会脱机几分钟,那么将驱动器拉出旧的服务器并将它们连接到新的服务器,挂载它们(现在恢复联机)并复制文件到新的服务器本地磁盘。

    使用mbuffer,如果它在一个安全的networking上,你可以避免encryption步骤。

    (许多不同的答案可以工作,下面是另一个答案。)

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

    你有没有考虑过sneakernet? 就这点而言,我的意思是将所有东西都转移到同一个驱动器上,然后将这个驱动器转移到其他位置

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

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

    如果在重复数据删除时有机会获得高成功率,我会使用像borgbackup或阁楼。

    如果没有,请检查netcat + tar + pbzip2解决scheme,根据您的硬件调整压缩选项 – 检查是什么瓶颈(CPU?networkingIO?)。 pbzip2将很好地跨越所有的CPU,提供更好的性能。

    您正在使用RedHat Linux,所以这不适用,但作为另一种select:

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

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

    ZFS主要是Solaris文件系统,但可以在Illumos(Sun的OpenSolaris的开放源代码叉)中find。 我知道在BSD和Linux下使用ZFS(使用FUSE?)也有一些运气 – 但我没有经验。

    在目标机器上启动一个rsync守护进程。 这将加速传输过程。

    你可以用tar和ssh来完成,就像这样:

    tar zcf - <your files> | ssh <destination host> "cat > <your_file>.tar.gz"

    或者,如果您想保留单个文件:

    tar zcf - <your files> | ssh <destination host> "tar zxf -"