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

40 rsync scp

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

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

sth*_*sth 43

这样的事情应该运作良好:

tar c some/dir | gzip - |  ssh host2 tar xz
Run Code Online (Sandbox Code Playgroud)

也许还省略 gzip 和用于提取的“z”标志,因为您在千兆网络上。

  • 就我个人而言,我会保留 gzip:即使在千兆以太网上,瓶颈也不太可能是 CPU。 (6认同)
  • @BenjiXVI 瓶颈*肯定*是 CPU,因为`gzip` 只会在单核上执行。在默认压缩级别为 6 的情况下,您可以合理地预期大约 30 MB/s - 但这不会使千兆以太网达到最大值。 (6认同)
  • 使用 pbzip2?... (2认同)

小智 19

我敢肯定,您在一个目录中拥有所有五百万个文件这一事实会让许多工具陷入困境。我对 rsync 没有优雅地处理这个问题并不感到惊讶——这是一种非常“独特”的情况。如果您能找到一种将文件组织成某种目录结构的方法,我相信标准同步工具(例如 rsync)的响应速度会更快。

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

  • +1 用于物理移动驱动器,这样速度更快 (7认同)

小智 14

要复制数百万个文件在千兆交换机(在一个信任的环境),你也可以使用的组合netcat (or nc)tar,如已经user55286建议。这会将所有文件作为一个大文件流式传输(请参阅快速文件复制 - 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
Run Code Online (Sandbox Code Playgroud)


ihi*_*wer 5

我们在一个目录中有大约 100 万个文件(大约 4 年的文件价值)。

我们使用 robocopy 将文件移动到 YYYY/MM 目录(每月大约 35-45,000 个文件)。我们将 robocopy 脚本放在一个 .bat 文件中,如下所示:

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081201 /MINAGE:20090101 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\12
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090101 /MINAGE:20090201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\01
ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20090201 /MINAGE:20090301 /MOV H:\Cs\out\fix H:\BCK_REPORT\2009\02
Run Code Online (Sandbox Code Playgroud)

简要说明../ns /nc /nfl /np是为了避免使用附加信息使日志文件膨胀 /log+...是将摘要信息写入日志文件。

/minage and /maxage is to copy files modified with in that date range. 
Run Code Online (Sandbox Code Playgroud)

例如,文件修改时间 >= 01/Nov/2008(含)到文件修改时间 < 01/Dec/2008(不含)

ROBOCOPY /NS /NC /NFL /NP /LOG+:H:\BCK_REPORT\ROBO.LOG /MAXAGE:20081101 /MINAGE:20081201 /MOV H:\Cs\out\fix H:\BCK_REPORT\2008\11
Run Code Online (Sandbox Code Playgroud)

/mov 移动文件

然后是源目录

然后是目标目录(将在需要时即时创建目录)。

传输 1 个月(大约 35-45,000 个文件)大约需要 40 - 60 分钟我们估计传输 1 年需要大约 12 小时或更短时间。

使用 Windows Server 2003。

所有的东西都记录在日志文件中......开始时间,结束时间和复制的文件数。

Robocopy 挽救了这一天。


ins*_*der 5

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

所以目录传输看起来像:

tar -c folder | lz4 -c | ssh -carcfour128 somehost 'lz4 -d | tar -x > folder'
Run Code Online (Sandbox Code Playgroud)

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