在两台服务器之间复制数百万个文件的最佳方法

在两台服务器之间复制数百万个文件的最佳方法

我在一个目录中大约有 500 万个小文件 (5-30k),我想将它们复制到同一千兆网络上的另一台机器上。我尝试使用 rsync,但运行几个小时后速度就会变得非常慢,我猜是因为 rsync 每次都必须检查源文件和目标文件?

我的第二个想法是使用 scp,但想听听外界的意见,看看是否有更好的方法。谢谢!

答案1

像这样的事情应该会很好用:

tar c some/dir | gzip - |  ssh host2 tar xz

由于您使用的是千兆网络,因此也许还会省略 gzip 和用于提取的“z”标志。

答案2

我确信,如果你将所有五百万个文件都放在一个目录中,许多工具都会感到困惑。rsync 无法妥善处理这种情况,我并不感到惊讶 - 这是一个相当“独特”的情况。如果你能想出一种方法将文件组织成某种目录结构,我相信 rsync 等标准同步工具的响应速度会更快。

但是,仅给出一些实际建议 - 也许一种解决方案是暂时将驱动器物理移动到目标计算机中,以便您可以在实际服务器中复制文件(而不是通过网络)。然后,将驱动器移回并使用 rsync 保持最新状态。

答案3

netcat (or nc)要通过千兆交换机复制数百万个文件(在受信任的环境中),您还可以使用和的组合tar,正如用户 55286 所建议的那样。这会将所有文件传输为一个大文件(请参阅快速文件复制 - Linux!(39 GB))。

# requires netcat on both servers
nc -l -p 2342 | tar -C /target/dir -xzf -   # destination box
tar -cz /source/dir | nc Target_Box 2342    # source box

答案4

我更喜欢使用lz4目前最快的压缩工具。SSH 选项 -carcfour128使用比默认更快的加密算法。[1]

因此目录传输看起来像这样:

tar -c folder | lz4 -c | ssh -carcfour128 somehost 'lz4 -d | tar -x > folder'

请注意,在 Debian 上 lz4 命令是 lz4c,而在 CentOS 上它是 lz4。

相关内容