题 如何在两台服务器之间快速复制大量文件


我需要在两个服务器(Ubuntu)之间传输大量的mp3。 我认为大约有一百万个平均300K的文件。 我试过了 scp 但这需要一个星期左右。 (约500 KB / s) 如果我通过HTTP传输单个文件,我得到9-10 MB / s,但我不知道如何传输所有这些文件。

有没有办法快速转移所有这些?


81
2018-06-02 19:55




您在服务器之间有什么样的网络。我在每台机器的1个NIC之间使用了GB以太网分频器。通过使用SCP进行配置,我得到了很好的表现 - Jim Blizard
你可能想调查为什么scp这么慢。由于加密,它可能比ftp更慢,但速度应该不会慢得多。 - Zoredache
我之间有100 mbps。 scp在小文件上较慢(大多数都很小) - nicudotro


答案:


我会推荐焦油。当文件树已经相似时,rsync会执行 非常 好。但是,由于rsync将对每个文件执行多次分析传递,然后复制更改,因此它比初始副本的tar慢得多。此命令可能会执行您想要的操作。它将在计算机之间复制文件,并保留权限和用户/组所有权。

tar -c /path/to/dir | ssh remote_server 'tar -xvf - -C /absolute/path/to/remotedir'

根据麦金托什的评论,这是你将用于rsync的命令

rsync -avW -e ssh /path/to/dir/ remote_server:/path/to/remotedir

109
2018-06-02 20:04



+1 tar选项对于大量小文件来说效率更高,因为scp和rsync在网络上每个文件的往返次数要多得多。 - Sekenre
rsync比tar更适合我 - nicudotro
此外,如果您有足够的CPU(两端),但(至少)主机之间的链接速度较慢,则可能需要在tar命令中启用压缩(gzip或bzip)。 - Vatine
@Jamie:如果你正在使用ssh-agent,那么应该使用它。否则,只需使用'-i'选项指定查找私钥的位置。有关详细信息,请参见手册页。 - Scott Pack
@niXar ~ 仅当SSH使用终端时,才会启用转义字符。指定远程命令时不是这种情况(除非您通过 -t 选项)。所以你的担忧是无效的。 - Gilles


外置硬盘和当天快递送货。


32
2018-06-02 20:00



嘿嘿......没有任何网络技术能够超过载有90 MPH磁带的旅行车的带宽,是吗? (窃笑)我以为他在局域网上,因为他说他用HTTP获得了9-10MB /秒。 - Evan Anderson
我在互联网上获得了那种速度,但我只是幸运地在我住的地方!如果它在局域网上,那么便宜了! - Adam
啊 - 没看你的位置。是的 - 我听说韩国的互联网连接非常壮观。被困在美国,我很高兴在网上获得900KB /秒 - Evan Anderson
是的,但是你可以在等待下载完成的同时获得美味的墨西哥卷饼,即使在首尔也只有大约三个不太合适的墨西哥餐厅...... - Adam


我使用rsync。

如果您已通过HTTP导出它们并且可以使用目录列表,那么您也可以使用wget和--mirror参数。

您已经看到HTTP比SCP更快,因为SCP正在加密所有内容(因此也会加密CPU)。 HTTP和rsync将更快地移动,因为它们不加密。

这里有一些关于在Ubuntu上设置rsync的文档: https://help.ubuntu.com/community/rsync

这些文档谈论通过SSH隧道化rsync,但如果你只是在私有局域网上移动数据,则不需要SSH。 (我假设你在私人局域网上。如果你通过互联网获得9-10MB /秒,那么我想知道你有什么样的连接!)

以下是一些其他非常基本的文档,可以让您设置相对不安全的rsync服务器(不依赖于SSH)​​: http://transamrit.net/docs/rsync/


16
2018-06-02 19:57



虽然SCP确实使用了一些CPU来加密数据,但我认为他没有100%的CPU使用率,因此CPU不是瓶颈。在快速转移时,我已经注意到很多次SCP效率低下。 - Cristian Ciupitu
鉴于他看到的是300K的SCP和9MB的HTTP,我认为与SCP相关的瓶颈(通常是CPU)正在发挥作用。不过,它当然可能是别的东西。如果不知道有问题的机器的硬件规格,很难说。 - Evan Anderson
rsync几乎肯定会使用ssh进行传输,因为这是默认行为,因此scp中加密引起的任何开销也会出现在rsync中 - Daniel Lawson
“你已经看到HTTP比SCP快,因为SCP正在加密一切”→错误。除非他有10年历史的服务器,否则他不会受到CPU限制。 - niXar
@RamazanPOLAT - 你的命令行太长了。以不同方式指定文件选择,它将适合您。通常,您只需在末尾指定没有通配符的源目录。你也可以使用 --include 和 --exclude 争论得到更多细微差别。 - Evan Anderson


没有多少讨论,使用netcat,网络swissarmy刀。没有协议开销,你直接复制到网络套接字。 例

srv1$ tar cfv - *mp3 | nc -w1 remote.server.net 4321

srv2$ nc -l -p 4321 |tar xfv -

14
2018-06-02 20:17



不幸的是,从我注意到netcat是非常低效的,即使它不应该。 - Cristian Ciupitu
我贬低你,因为这是非常非常糟糕的建议。有一个正确的答案:rsync。我可以列出为什么它更好但它不适合这个页面的所有原因,更不用说这个小评论框了。 - niXar
@niXar:如果您只想进行单个文件传输(无需进一步同步),那么tarpipe就是您所需要的。 - Witiko
如果您在私有vlan和/或VPN等安全环境中执行此操作,@ niXar netcat就可以了。 - Lester Cheung


如果你使用rsync,有很多文件, 我会尝试在两端获得版本3或更高版本。原因是较小的版本将在开始传输之前枚举每个文件。新功能被称为 增量递归

一种新的增量递归算法   现在在rsync说话时使用         到另一个3.x版本。这样可以更快地开始转移         (在找到所有文件之前),并且需要更少的内存。         有关某些限制,请参阅联机帮助页中的--recursive选项。


8
2018-06-02 20:41





rsync,像其他人一样已经推荐过。如果加密的CPU开销是瓶颈,请使用另一种CPU密集度较低的算法,如blowfish。例如。就像是

rsync -ax -e 'ssh -c blowfish' /local/path user@host:/remote/path


7
2018-06-02 20:56



有关更改密码的+1点 - Daniel Lawson
除非你有10G以太网和10年的CPU,否则CPU不会成为瓶颈。 - niXar
只是评论:密码“-c arcfour”更快。 - Arman
@niXar:但是如果您的计算机上已经有CPU消耗任务,那么这是一个问题。 - Isaac


复制大量文件时,我发现像tar和rsync这样的工具效率低于它们需要的效率,因为打开和关闭许多文件的开销很大。我写了一个名为fast-archiver的开源工具,它比这些场景中的tar更快: https://github.com/replicon/fast-archiver;它通过执行多个并发文件操作更快地工作。

以下是超过200万个文件备份的快速归档程序与tar的示例;快速存档需要27分钟存档,而焦油需要1小时23分钟。

$ time fast-archiver -c -o /dev/null /db/data
skipping symbolic link /db/data/pg_xlog
1008.92user 663.00system 27:38.27elapsed 100%CPU (0avgtext+0avgdata 24352maxresident)k
0inputs+0outputs (0major+1732minor)pagefaults 0swaps

$ time tar -cf - /db/data | cat > /dev/null
tar: Removing leading `/' from member names
tar: /db/data/base/16408/12445.2: file changed as we read it
tar: /db/data/base/16408/12464: file changed as we read it
32.68user 375.19system 1:23:23elapsed 8%CPU (0avgtext+0avgdata 81744maxresident)k
0inputs+0outputs (0major+5163minor)pagefaults 0swaps

要在服务器之间传输文件,可以使用带有ssh的fast-archiver,如下所示:

ssh postgres@10.32.32.32 "cd /db; fast-archive -c data --exclude=data/\*.pid" | fast-archiver -x

4
2017-08-26 20:51





在移动80 TB的数据(数百万个小文件)昨天,从 rsync 至 tar  事实证明要快得多,因为我们停止尝试

# slow
rsync -av --progress /mnt/backups/section01/ /mnt/destination01/section01

并切换到 tar 代替...

# fast
cd /mnt/backups/
tar -cf - section01 | tar -xf - -C /mnt/destination01/ 

由于这些服务器位于同一个LAN上,因此目标是在源系统上安装NFS,而该系统正在进行推送。没有让它更快,我们决定不保留 atime 文件:

mount -o remount,noatime /mnt/backups
mount -o remount,noatime /mnt/destination01

下图描绘了从rsync到tar的变化之间的差异。这是我的 老板 想法和我的 同事 两人都执行了它并且做得很好 在他的博客上写文章。我只是喜欢 漂亮的照片。 :)

rsync_vs_tar


3
2018-04-04 10:32



我信任的黑客告诉我“tar over tc而不是nfs甚至可能更快”。即 tar cf - directory | ttcp -t dest_machine 从 ftp.arl.mil/mike/ttcp.html - Philip Durbin
无关的问题,但该图表来自何处? - CyberJacob


我用tar通过 netcat 方法,除了我更喜欢使用 socat  - 为您的情况优化更多功能 - 例如,通过调整mss。 (另外,如果你想要笑,但我发现 socat 参数更容易记住,因为它们是一致的)。所以对我而言,最近这种情况非常普遍,因为我一直在向新服务器移动:

host1$ tar cvf - filespec | socat stdin tcp4:host2:portnum

host2$ socat tcp4-listen:portnum stdout | tar xvpf -

别名是可选的。


3
2018-06-03 06:38