【发布时间】:2017-01-02 02:46:20
【问题描述】:
我有一个 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 命令也需要很多时间。
【问题讨论】:
-
500gig 的数据需要很长时间才能复制,无论您做什么。磁盘只有这么多可用带宽。
-
@MarcB 是的。忘了提到我倾向于的迁移策略是在关闭系统之前同步存储桶。进行切换,然后再次运行同步以仅复制同时更改的最少量文件。看起来
sync命令需要很多时间,即使只是检查文件是否更改 - 即使实际上不需要复制文件。 -
这 500gig 中有多少个文件?即使只是比较时间戳也会很慢,因为它基本上要求对每个文件进行
stat()操作。不知道同步在后台实际做了什么,但是如果后端系统比较物理字节(以防时间戳没有改变),或者对文件进行哈希处理并比较哈希,你仍然需要读取 2x500gig 的数据来获取这些字节/哈希. -
您是否尝试在存储桶上启用加速传输?
-
@error2007s 看看我的更新。即使不进行文件传输,操作也需要很长时间。
标签: amazon-web-services amazon-s3 amazon-ec2 aws-cli