将 55GB 的图像传输到新服务器的最快方法

And*_*ion 71 file-transfer tar scp

我目前有两台 CentOS 服务器。我需要知道如何以及最快的方法是“tar”图像目录并对其进行 SCP 处理?

这是我刚刚建议的最快方法吗,因为 tarring 需要永远......我运行了命令:

tar cvf imagesbackup.tar images
Run Code Online (Sandbox Code Playgroud)

我打算把它scp过去。

让我知道是否有更快的方法。我可以远程/SSH 访问两台机器。

tyl*_*erl 105

您可以使用 ssh 通过网络直接写入远程服务器,而不是使用 tar 写入本地磁盘。

server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"
Run Code Online (Sandbox Code Playgroud)

“ssh”命令后面的任何字符串都将在远程服务器上运行,而不是交互式登录。您可以通过 SSH 将输入/输出通过管道传入和传出这些远程命令,就好像它们是本地的一样。将命令放在引号中可以避免任何混淆,尤其是在使用重定向时。

或者,您可以直接在其他服务器上提取 tar 文件:

server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"
Run Code Online (Sandbox Code Playgroud)

注意很少使用的-C选项。意思是“在做任何事情之前先切换到这个目录”。

或者,也许您想从目标服务器“拉”:

server2$ tar -zx -C /destination < <(ssh server1 "tar -zc -C /srcdir ./path")
Run Code Online (Sandbox Code Playgroud)

请注意,该 <(cmd) 构造对于 bash 来说是新的,并且不适用于旧系统。它运行一个程序并将输出发送到一个管道,然后将该管道替换为命令,就像它是一个文件一样。

我可以很容易地将上述内容写成如下:

server2$ tar -zx -C /destination -f <(ssh server1 "tar -zc -C /srcdir ./path")
Run Code Online (Sandbox Code Playgroud)

或如下:

server2$ ssh server1 "tar -zc -C /srcdir ./path" | tar -zx -C /destination
Run Code Online (Sandbox Code Playgroud)

或者,您可以为自己省去一些悲伤,而只需使用 rsync:

server1$ rsync -az ./path server2:/destination/
Run Code Online (Sandbox Code Playgroud)

最后,请记住,在传输之前压缩数据会减少带宽,但在非常快的连接上,它实际上可能会使操作花费更多时间。这是因为您的计算机可能无法以足够快的速度进行压缩以跟上:如果压缩100MB 所需的时间比发送100MB所需的时间长,则发送未压缩的数据会更快。

或者,您可能需要考虑通过管道自行进行 gzip(而不是使用 -z 选项),以便您可以指定压缩级别。根据我的经验,在具有可压缩数据的快速网络连接上,在大多数情况下,在级别 2 或 3(默认为 6)使用 gzip 可提供最佳的整体吞吐量。像这样:

server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"
Run Code Online (Sandbox Code Playgroud)


Cho*_*er3 69

我很想自己 rsync 它 - 它可以压缩并很好地处理链接丢失。

  • rsync 正是正确的工具。 (14认同)
  • +1 - 是的 rsync! (4认同)

pac*_*cey 12

如果您只是将它们压缩而没有其他任何事情,这将浪费大量时间,而速度增益却很小。

因此,简单地使用 cvf 开关对文件进行去皮将有效地花费读取所有 55GB 图像并将它们写回磁盘所需的时间。(实际上会浪费更多的时间,因为会有相当大的开销)。

您在这里只有一个优势,上传许多文件的开销正在减少。如果您压缩图像,您可能会获得更快的传输时间(但因为我相信它们已经是压缩格式,这不会有太大帮助)。只是更浪费计算时间。

通过网络传输巨大的 tar 档案的最大缺点是,如果出现问题,可能意味着您必须重新开始。

我会用这种方式:

md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/
Run Code Online (Sandbox Code Playgroud)

在新服务器上

md5sum /images/* > md5sum_new.txt
Run Code Online (Sandbox Code Playgroud)

然后只是diff. 由于 scp 支持动态压缩,因此不需要单独的存档。

编辑

我会保留 MD5 信息,因为它对 OP 很有用。但是一个评论让我有了新的见解。因此,一些搜索提供了这条有用的信息。 请注意,这里的主题是 SFTP 而不是直接 SCP

与 FTP 相比,SFTP 确实增加了文件传输的开销。当文件在客户端和服务器之间传输时,它被分解成称为“数据包”的更小块。例如,假设每个数据包是 32KB。SFTP 协议在发送时对每个 32KB 文件进行校验和,并将该校验和与该数据包一起包含在内。接收器获取该数据包并解密数据,然后验证校验和。校验和本身比 CRC32 校验和“更强”。(因为 SFTP 使用 128 位或更高的校验和,例如 MD5 或 SHA,并且因为这是在每个数据包上完成的,所以作为传输的一部分完成了非常精细的完整性检查。)因此,协议本身较慢(因为额外的开销),但成功完成传输意味着,事实上,

  • scp 已加密并保证线路的完整性。当然,数据在内存或磁盘中损坏的可能性仍然很小,但这种情况非常罕见。 (3认同)
  • md5sum(或 md5)对文件进行校验和。Diff 查找文件中的差异 (man diff)。校验和创建一个字符串,一个散列,如果文件在传输过程中被更改......有点翻转,一个错误......当你在另一边再次获取它时将不匹配。对于大文件,出错的机会会增加。这就是为什么当您看到允许您下载 .iso 文件的站点时,他们通常有一个 MD5 校验和供您比较下载的文件以确保它匹配且未损坏。 (2认同)

Sma*_*ger 8

在 Pacey 的 md5sum 建议之上,我将使用以下内容:

在目的地: nc -w5 -l -p 4567 | tar -xvf -

然后在源码上: tar -cvf - /path/to/source/ | nc -w5 destinationserver 4567

它仍然是 tar/untar,并且没有加密,但它直接发送到另一台服务器。将它们同时启动(-w5给你 5 秒钟的宽限期。)然后看着它运行。如果带宽紧张,请在两端的 tar 中添加 -z。