我有一个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
命令也需要花费大量时间。
答案 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
答案 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
选项:-
-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
答案 5 :(得分:0)
正如最近(2020 年 5 月)平铺的 AWS 博客文章所述:
Once 还可以对现有对象使用 S3 复制。这需要联系 AWS 支持以启用此功能:
<块引用>客户可以通过联系 AWS Support 将此功能添加到源存储桶,从而将现有对象复制到同一或不同 AWS 区域中的另一个存储桶。
答案 6 :(得分:0)
我使用 Datasync 迁移了 95 TB 的数据。用了2天左右。具有用于网络优化、作业并行化的所有这些奇特的东西。您甚至可以检查源和目标,以确保一切按预期传输。