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


64

我目前有两台CentOS服务器。我需要知道将图像目录“ tar”起来并将其SCP覆盖的最快方式是什么?

这是我刚刚建议的最快方法,因为焦油永远消耗着……我运行了命令:

tar cvf imagesbackup.tar images

我打算把它结束。

让我知道是否有更快的方法。我对两台计算机都有远程/ SSH访问权限。


12
Sneakernet?
尼克牛逼

Answers:


98

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

server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"

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

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

server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"

请注意很少使用的-C选项。这意味着“在执行任何操作之前先更改此目录”。

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

server2$ tar -zx -C /destination < <(ssh server2 "tar -zc -C /srcdir ./path")

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

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

server2$ tar -zx -C /destination -f <(ssh server2 "tar -zc -C /srcdir ./path")

或如下:

server2$ ssh server2 "tar -zc -C /srcdir ./path" | tar -zx -C /destination

或者,您可以为自己省些麻烦,而只需使用rsync:

server1$ rsync -az ./path server2:/destination/

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

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

server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"

Rsync表现出色-即时压缩,复制整个文件夹,在断开的链接上恢复。一站式命令。爱它。这些是我发现有用的选项:z:压缩r:递归=复制子文件夹v:详细。我的Rsync命令示例:rsync -azvr / src-path / username @ dest_server:/ dest / path /
堡垒

68

我很想在自己身上同步它-它可以压缩并很好地处理链接丢失。


14
rsync正是正确的工具。
丰富,

4
+1-Yay rsync!
埃文·安德森

1
+1,只是继续前进。另外,我真的很喜欢rsync。
史蒂文

1
但是,使用rsync时,无论如何,您都必须手动压缩数据(如果要存储压缩的数据)
wlk 2012年

如何使用rsync存储压缩文件?
Dolan Antenucci 2013年

12

如果您只是将它们焦油化而已,那么只会以最小的速度增益浪费大量时间。

因此,只需使用cvf开关对文件进行涂脂即可有效地花费读取所有55GB图像并将它们写回到磁盘所需的时间。(实际上,由于存在相当大的开销,这将浪费更多的时间)。

您在这里获得的唯一好处是,减少了上传许多文件的开销。如果压缩图像,可能会获得更快的传输时间(但是由于我相信图像已经是压缩格式,所以不会有太大帮助)。只是浪费了计算时间。

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

我会用这种方式:

md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/

在新服务器上

md5sum /images/* > md5sum_new.txt

然后就diff。由于scp支持动态压缩,因此无需单独的存档。

编辑

我将保留MD5信息,因为它对OP很有用。但是有一条评论使我有了新的见解。因此,进行一些搜索即可提供此有用的信息。 请注意,此处的主题是SFTP而不是SCP

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


非常感谢您,md5sum在做什么?diff是什么?谢谢你,现在表演!
Andrew Fashion

2
md5sum(或md5)对文件进行校验和。差异查找文件中的差异(man diff)。校验和会创建一个字符串(哈希),如果文件在传输过程中发生更改,则该字符串将被翻转,这是一个错误……当您将其再次放在另一侧时,它将不匹配。对于大文件,您出错的机会更大。这就是为什么当您看到允许您下载.iso文件的网站时,它们通常具有MD5校验和,供您比较下载的文件与之以确保文件匹配并且没有损坏。
巴特·

3
scp是加密的,可以保证线路的完整性。当然,内存或磁盘上的数据损坏的可能性仍然很小,但这很少见。
瑞安·拜尔

1
SFTP校验和的开销实际上在任何实际意义上是否重要?我无法想象。每32768个4字节听起来并不重要。每GB 128 kB。在无聊的理论意义上,称“慢”似乎有点夸大其词。
underscore_d 2015年

8

除了Pacey的md5sum建议,我将使用以下内容:

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

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

它仍然是tar / unar,并且没有加密,但是直接连接到另一台服务器。串联启动它们(-w5给您5秒钟的宽限期。),然后观察它。如果带宽太紧,请在两端的tar中添加-z。


1
我认为这是另一
回事,

代替目标服务器,我是否只需将root@1.1.1.1放进去?
安德鲁时尚

不,只是IP。netcat除了TCP以外没有使用其他协议:)该命令也是上面给出的所有命令中最快的。源上每个文件只有一次读取,传输文件的确切最小网络流量是,目标上每个文件只有一个写入。如果您有空闲的CPU周期,则添加-z标志(用于压缩)将进一步加快速度,因为必须传输的网络数据较少。
Jeff McJunkin 2010年

@ user36845-是的。我并不是在暗示上述顺序的时间顺序,但是您是对的,首先需要打开套接字。我将对其进行澄清。:)
SmallClanger 2010年

我不确定为什么ssh / scp的上限为125MB / s到133MB / s,但是netcat可以轻松地以380MB / s的速度传送数据(相同链接)
ThorSummoner

1

一点-并非所有主机都具有rsync,并且主机可能具有不同版本的tar。因此,可以建议使用经常被忽略的cpio作为第一个呼叫端口。

您可以通过ssh进行cpio,以在主机之间进行文件/目录结构的临时复制。这样,您就可以更好地控制需要发送的cpio nom-nom的发送内容。它还具有更多的参数可移植性,cpio并没有太大变化-如果您要在异构环境中照顾多个主机,则这一点很重要。

将/ export / home和子目录复制到远程主机的示例:

cd /export/ find . home -print | cpio -oaV | ssh 10.10.10.10 'cd /export/home; cpio -imVd'

上面的代码会将/ export / home的内容和所有子目录复制到远程主机上的/ export / home。

希望这可以帮助。


他确实提到这是两个CentOS机器,因此它们将具有rsync和tar的文件兼容版本。创建了rsync之类的工具来替换cpio :)之类的工具。至少在不知道确切要从何处开始并适当过滤搜索结果的情况下,您无法使用cpio“恢复”。这是不必要的时间开销。话虽如此,有关“旧” UNIX盒的有用信息:)
Rafiq Maniar 2010年

是的,那个cmmand让我迷失了哈哈
Andrew Fashion

1

我有ssh访问,有rsync访问。

rsync -av -e ssh /storage/images/ user@[ip or domain name]:/storage/images/

要么

rsync -av -e "ssh -l user" /storage/images/ [ip or domain name]:/storage/images/

如果收到诸如“ rsync错误:无法在main.c(977)[sender = 2.6.9]上传输某些文件(代码23)”之类的错误,请检查服务器之间的用户和组;您可能不匹配。

如果要rsync压缩传输,请使用rsync“ -z”选项。此选项将使用更多的CPU,但占用的带宽更少,因此请注意。

有一个“ --progress”选项将为您提供一定百分比的转让,如果您喜欢这种事情,那会很好。


0

它们是否在共享网络上,而不需要互联网传输文件?NFS或FTP可能比SCP的开销快很多,尽管您在传输过程中会丢失加密。


远程位置中的不同服务器
Andrew Fashion

0

或者,您始终可以使用tar管道:

(cd /path && tar -cjf - * ) | ssh user@host 'tar -xjf - -C /path'

'j'= bzip2,如果tar支持,则可以对gzip或--lzma使用'z'。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.