更快的s3存储桶复制


93

我一直在尝试寻找比s3cmd更好的命令行工具来复制存储桶。 s3cmd可以复制存储分区,而不必下载和上传每个文件。我通常使用s3cmd运行以复制存储桶的命令是:

s3cmd cp -r --acl-public s3://bucket1 s3://bucket2

这可以工作,但是非常慢,因为它一次通过API复制了每个文件。如果s3cmd可以并行运行,我会很高兴。

人们是否有其他选项可以用作命令行工具或代码,人们用来复制存储桶的速度比 s3cmd吗?

编辑:看起来s3cmd-modification正是我在寻找。太糟糕了,它不起作用。还有其他选择吗?


6
不知道为什么这个问题反复被关闭,因为似乎许多开发人员都遇到了这个问题。无论如何,我以高度并行的方式解决了它,这是链接:github.com/cobbzilla/s3s3mirror 谢谢!乔纳森
cobbzilla

Answers:


166

AWS CLI似乎可以完美地完成工作,并且具有成为官方支持工具的好处。

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

默认情况下支持并发传输。看到 http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

要快速传输大量小文件,请从EC2实例运行脚本以减少延迟,并增加max_concurrent_requests以减少延迟的影响。例如:

aws configure set default.s3.max_concurrent_requests 200

4
它支持基于文件修改时间,大小等的非并发同步。当我尝试时,它的速度非常快。我相信对象可以直接复制到S3上,而无需将其下载到本地计算机上。默认情况下,它不会并行运行,但是我确定您可以同时在单独的子文件夹上运行多个同步命令。它足够快,您可能根本不需要并行运行。我只是在几分钟内复制了100GB的数据。
python1981年

10
如果文件数量多,则变慢。
PHUONG阮

14
当传输许多小文件时,延迟成为关键约束,因此从EC2实例运行此命令至关重要。
python1981

1
我用它来构建一个docker
Gordon Sun

3
现在它支持并发同步:-) docs.aws.amazon.com/cli/latest/topic/…–
python1981

70

如果您不介意使用AWS控制台,则可以:

  1. 选择第一个存储桶中的所有文件/文件夹
  2. 单击操作>复制
  3. 创建一个新的存储桶并选择它
  4. 单击操作>粘贴

它仍然相当慢,但是您可以不理会它,让它完成它的工作。


这是在将源存储桶的内容复制到目标计算机时将其复制到我的计算机吗?网络活动很多,浏览器检查器非常慢,因此很难进行分析。我的机器上以600K / s的速度输出。这样,在亚马逊网络内启动传输会更快得多。
布拉德·高斯

9
我今天才使用这种方法。它不会将文件提取到本地计算机上-它会直接复制,并且速度要快得多。
格雷格·本尼迪克特

7
它仍然获取文件列表。如果列表太长(在我的情况下为数十万个文件),那么它会变得很慢。而且超时/挂起非常可能
Ph –ng Nguygun 2014年

13
不幸的是,此过程与浏览器相关。:(来自docs:“在启动复制过程后,必须在复制进行过程中保持浏览器打开。”
David Lemayian 2014年

4
我正在尝试在其中包含800万个文件的存储桶中执行此操作。不知道需要多少个月才能选择所有复选框...
克里斯·哈里森

27

我尝试使用AWS Web控制台s3cmd和和AWS CLI 克隆两个存储桶。尽管这些方法大多数时候都有效,但它们的速度却很慢。

然后,我发现s3s3mirror:用于同步两个S3存储桶的专用工具。它是多线程的,并且比我尝试过的其他方法快得多。我迅速将千兆字节的数据从一个AWS区域移动到了另一个区域。

https://github.com/cobbzilla/s3s3mirror上进行检查,或从https://registry.hub.docker.com/u/pmoust/s3s3mirror/下载Docker容器


1
如果您有很多文件要传输,那么这是迄今为止最好的工具。真可惜,答案列表太远了……
John Chrysostom

某些人注意:需要Java 6/7进行编译。
布赖恩

1
我正在EC2实例中使用它,它的运行速度令人难以置信!我必须将<source-bucket>和<destination-bucket>替换为实际的存储桶名称(而不是终端节点或AWS CLI中的类似名称)。
ironmouse

1
大量使用的超赞工具,值得推荐。对复制线程数的控制非常出色。
Shaunak

您不认为使用aws-cli而不是第三方应用程序来完成这项工作更安全吗?毕竟,我们需要提供凭据或访问密钥才能使用这些工具。
Keet Sugathadasa

10

用于自组织溶液 aws cli,请在存储桶之间进行同步:

aws s3 sync速度取决于:
-到S3端点的API调用的延迟
-并发进行的API调用的数量

为了提高同步速度:
-运行aws s3 sync从AWS实例(在FreeBSD c3.large是OK ;-))
-更新〜/ .aws /配置有:
- max_concurrent_requests = 128
-max_queue_size = 8096

使用以下配置和实例类型,我能够在474秒内同步存储桶(309GB,72K文件,us-east-1)。

有关更通用的解决方案,请考虑-AWS DataPipeLine或S3跨区域复制。


您知道如果使用S3 cp是否可以获得相同的性能?您确定使用同步时会实际传输所有309GB吗?sync将仅同步另一个存储桶中不相同或存在的文件。
霜冻

另外,对于我有1k或更少文件但大小较大(10gb)的用例,您对此有何想法?您认为我会看到与您类似的表现吗?
霜冻

@frosty,在我的情况下,目标存储桶是空的。每个awscli文档- aws sync仅复制新文件和更新文件。也许您应该期望具有较高的性能aws cp(复制是在内部完成的,您的客户端只是发出API调用)。性能取决于以下因素:1. src和dst区域之间的延迟(例如us-east-X到us-west-X)2.客户端和AWS API端点之间的延迟(您可以多快发出API调用)3。并发请求的数量(您的客户端每秒可以发出多少个请求)。就我而言,309G是在同一区域(us-east-1)的存储桶之间复制的
Tom Lime


2

我不知道其他任何S3命令行工具,但是如果这里什么都没出现,那么编写自己的工具可能最容易。

选择您喜欢的任何语言和Amazon SDK /工具包。然后,您只需要列出/检索源存储桶内容并复制每个文件(显然是并行的)

查看s3cmd-modification的源代码(我承认我对python一无所知),看来他们还没有并行化存储桶到存储桶的代码,但是也许您可以使用标准的上载/下载并行代码作为起点做这个。


是的 我一直在玩弄这个想法,并用事件机器以事件方式或用JRuby线程化的方式用ruby编写它。但是,s3cmd已经相当完整了,我宁愿使用它。我一直在与s3cmd的开发人员交谈,他正在开发一些解决方案,可能会解决性能问题。
肖恩·麦克莱里

1

一个简单的方法aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursive很好(假设您有aws cli设置)

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.