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

mrt*_*mrt 15 amazon-s3 amazon-ec2 amazon-web-services 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?/*"
Run Code Online (Sandbox Code Playgroud)

还有什么我可以做的更快加速同步吗?另一种类型的EC2实例更适合这项工作吗?将作业分成多个批次是一个好主意,是否有类似"最佳" sync进程的数量可以在同一个桶上并行运行?

更新

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

str*_*gjz 12

您可以使用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"]}]
Run Code Online (Sandbox Code Playgroud)

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

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


Pru*_*Raj 11

在不到 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 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

选项 :-

--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 
Run Code Online (Sandbox Code Playgroud)

转移加速成本

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

如果桶在同一地区,他们没有提到定价 在此处输入图片说明

  • 请注意,如果存储桶名称中包含“.”,则传输加速将不起作用。如果配置中有的话,`aws` 命令行还会提供令人困惑的“:存储桶命名与 DNS 不兼容”错误 (/sf/answers/2925688881/)。 (2认同)

ana*_*six 6

作为OP正在执行的操作的一种变体。您
可以创建要同步的所有文件的列表,aws s3 sync --dryrun

aws s3 sync s3://source-bucket s3://destination-bucket --dryrun
# or even
aws s3 ls s3://source-bucket --recursive
Run Code Online (Sandbox Code Playgroud)

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

完成所有“复制”作业后--delete,如果对象可能会从“源”存储桶中删除,那么在很好的情况下,也许值得使用另一个同步。

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


Sha*_*vis 5

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
Run Code Online (Sandbox Code Playgroud)

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