同步两个Amazon S3存储桶的最快方法

时间:2016-08-25 15:25:54

标签: amazon-web-services amazon-s3 amazon-ec2 aws-cli

我有一个S3存储桶,大约有400万个文件,总共需要500GB。我需要将文件同步到一个新存储桶(实际上更改存储桶的名称就足够了,但由于这是不可能的,我需要创建一个新存储桶,将文件移到那里,然后删除旧存储桶。)

我使用AWS CLI的s3 sync命令并完成了这项工作,但需要花费大量时间。我想减少时间,以便依赖系统停机时间最小

我试图从我的本地计算机和EC2 c4.xlarge实例运行同步,并且所花费的时间差别不大。

我注意到,当我使用--exclude--include选项分多次分割作业并从不同的终端窗口并行运行时,可以稍微减少所需的时间,即

aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "1?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "2?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "3?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "*" --include "4?/*" 
aws s3 sync s3://source-bucket s3://destination-bucket --exclude "1?/*" --exclude "2?/*" --exclude "3?/*" --exclude "4?/*"

我还能做些什么来加速同步吗?另一种EC2实例更适合这项工作吗?将工作分成多个批次是一个好主意,是否有像“最佳”这样的东西。可以在同一个存储桶上并行运行的sync个进程数?

更新

我倾向于在关闭系统之前同步存储桶的策略,执行迁移,然后再次同步存储桶以仅复制在此期间更改的少量文件。但是,即使在没有差异的存储桶上运行相同的sync命令也需要花费大量时间。

7 个答案:

答案 0 :(得分:8)

您可以使用EMR和S3-distcp。我不得不在两个桶之间同步153 TB,这需要大约9天。还要确保存储桶位于同一区域,因为您也会遇到数据传输成本。

aws emr add-steps --cluster-id <value> --steps Name="Command Runner",Jar="command-runner.jar",[{"Args":["s3-dist-cp","--s3Endpoint","s3.amazonaws.com","--src","s3://BUCKETNAME","--dest","s3://BUCKETNAME"]}]

http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-commandrunner.html

答案 1 :(得分:4)

作为OP已经在做的变种。
可以使用aws s3 sync --dryrun

创建要同步的所有文件的列表
aws s3 sync s3://source-bucket s3://destination-bucket --dryrun
# or even
aws s3 ls s3://source-bucket --recursive

使用要同步的对象列表,将作业拆分为多个aws s3 cp ...命令。这样,“aws cli”不会只是挂在那里,同时获取同步候选列表,就像当用--exclude "*" --include "1?/*"类型参数启动多个同步作业时一样。

当完成所有“复制”作业后,如果对象可能会从“源”存储桶中删除,那么另一个同步可能是值得的,可能还有--delete

如果位于不同区域的“源”和“目标”存储桶,可以在开始同步存储桶之前启用cross-region存储桶复制。

答案 2 :(得分:2)

2020年的新选择:

我们不得不在S3存储桶之间移动约500 TB(1000万个文件)的客户端数据。由于我们只有一个月的时间来完成整个项目,aws sync的最高传输速度约为120兆字节/秒...我们马上就知道这会很麻烦。

我首先找到了这个stackoverflow线程,但是当我在这里尝试大多数选项时,它们的速度还不够快。主要问题是它们都依赖于序列项列表。为了解决该问题,我想出了一种在没有先验知识的情况下并行列出任何存储桶的方法。是的,可以做到!

开源工具称为S3P。

借助S3P,我们能够使用单个EC2实例维持 8 GB /秒的复制速度和 20,000个项目/秒的列表速度。 (在EC2上与存储桶所在的区域中运行S3P的速度要快一些,但是S3P在本地计算机上的运行速度几乎一样。)

更多信息:

或者尝试一下:

# Run in any shell to get command-line help. No installation needed:

npx s3p

(要求nodejsaws-cli和有效的aws-cli凭证)

答案 3 :(得分:1)

背景:sync命令中的瓶颈是列出对象和复制对象。列表对象通常是一个串行操作,但如果指定前缀,则可以列出对象的子集。这是并行化的唯一技巧。复制对象可以并行完成。

不幸的是,aws s3 sync没有进行任何并行化,它甚至不支持按前缀列出,除非前缀以/结尾(即,它可以按文件夹列出)。这就是它如此缓慢的原因。

s3s3mirror(和许多类似工具)并行化复制。我不认为它(或任何其他工具)并行化列表对象,因为这需要先验知道如何命名对象。但是,它确实支持前缀,您可以为字母表中的每个字母(或任何适当的字母)多次调用它。

您也可以使用AWS API自行滚动。

最后,aws s3 sync命令本身(以及任何相关工具)如果在与S3存储桶相同的区域中的实例中启动它,应该会快一点。

答案 4 :(得分:0)

在不到90秒的时间内复制/同步了40100个对象160gb

请遵循以下步骤:

step1- select the source folder
step2- under the properties of the source folder choose advance setting
step3- enable transfer acceleration and get the endpoint 

AWS配置仅一次(无需每次都重复)

aws configure set default.region us-east-1 #set it to your default region
aws configure set default.s3.max_concurrent_requests 2000
aws configure set default.s3.use_accelerate_endpoint true

enter image description here

选项:-

-delete:如果源中不存在该选项,则此选项将删除目标中的文件

要同步的AWS命令

aws s3 sync s3://source-test-1992/foldertobesynced/ s3://destination-test-1992/foldertobesynced/ --delete --endpoint-url http://soucre-test-1992.s3-accelerate.amazonaws.com 

转移加速费用

https://aws.amazon.com/s3/pricing/#S3_Transfer_Acceleration_pricing

如果水桶在同一地区,他们没有提到定价 enter image description here

答案 5 :(得分:0)

正如最近(2020 年 5 月)平铺的 AWS 博客文章所述:

Once 还可以对现有对象使用 S3 复制。这需要联系 AWS 支持以启用此功能:

<块引用>

客户可以通过联系 AWS Support 将此功能添加到源存储桶,从而将现有对象复制到同一或不同 AWS 区域中的另一个存储桶

答案 6 :(得分:0)

我使用 Datasync 迁移了 95 TB 的数据。用了2天左右。具有用于网络优化、作业并行化的所有这些奇特的东西。您甚至可以检查源和目标,以确保一切按预期传输。

https://aws.amazon.com/datasync/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc