cyb*_*x86 55
百万是一个很大的数字——我稍后再谈。
无论您采用哪种方法,底层机制都需要直接从一个存储桶复制到另一个存储桶 - 这样(因为您的存储桶位于同一区域)您不会产生任何带宽费用。任何其他方法都是低效的(例如下载和重新上传文件)。
存储桶之间的复制是通过使用“PUT 复制”来完成的——这是一个包含“x-amz-copy-source”标头的 PUT 请求——我相信这被归类为 COPY 请求。这将复制文件和默认关联的元数据。如果要同时设置 ACL,则必须包含具有正确值的“x-amz-acl”(否则,它将默认为私有)。您需要为 COPY 请求付费(0.01 美元/1,000 个请求)。您可以在复制不需要的文件后删除它们(不收取 DELETE 请求)。(我不太清楚的一点是 COPY 请求是否也会产生 GET 请求的费用,因为必须首先从源存储桶中提取对象 - 如果是这样,费用将是 0.01 美元/10,000 美元要求)。
上述费用似乎是不可避免的 - 对于一百万件物品,您正在查看大约 10 美元(或 11 美元)。由于最终您必须实际在目标存储桶上创建文件,因此其他方法(例如 tar-gzip 文件、Amazon 导入/导出等)将无法解决此成本。尽管如此,如果您要传输的对象超过几百万,那么联系亚马逊可能是值得的。
鉴于上述(不可避免的价格),接下来要研究的是时间,这将是复制“数百万个文件”时的一个重要因素。所有可以在存储桶之间执行直接复制的工具都将产生相同的费用。不幸的是,您需要每个文件一个请求(复制),一个删除请求,可能还有一个读取 ACL 数据的请求(如果您的文件具有不同的 ACL)。最好的速度将来自可以运行最多并行操作的任何东西。
有一些命令行方法可能非常可行:
s3fs 有可能工作 - 它非常并行,确实支持同一个存储桶之间的副本 - 不支持不同存储桶之间的副本,但可能支持不同存储桶之间的移动。
我会从 s3cmd-modification 开始,看看你是否有任何成功,或者联系亚马逊以获得更好的解决方案。
小智 12
老话题,但这适用于调查相同场景的任何人。随着我花费的时间,为 20,000 多个对象。在 AWS Linux/Centos 上运行,每个对象大部分都是图像,以及一些视频和各种媒体文件。
使用 AWS CLI 工具将文件从存储桶 A 复制到存储桶 B。
A. 创建新的bucket
$ aws s3 mb s3://new-bucket-name
Run Code Online (Sandbox Code Playgroud)
B. 将旧桶与新桶同步
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
Run Code Online (Sandbox Code Playgroud)
复制 20,000 多个对象...
17:03 开始
17:06 结束
20,000 多个对象的总时间 = 大约 3 分钟
一旦正确配置了新存储桶,即权限、策略等,并且您希望删除旧存储桶。
C. 移除/删除旧的bucket
$ aws s3 rb --force s3://old-bucket-name
Run Code Online (Sandbox Code Playgroud)
AWS CLI 提供了一种在并行进程中将一个存储桶复制到另一个存储桶的方法。摘自/sf/answers/2818924461/:
以下命令将告诉 AWS CLI 使用 1,000 个线程来执行作业(每个是一个小文件或多部分副本的一部分)并展望 100,000 个作业:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
Run Code Online (Sandbox Code Playgroud)
运行这些后,您可以使用简单的同步命令,如下所示:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
Run Code Online (Sandbox Code Playgroud)
在 m4.xlarge 机器上(AWS--4 核,16GB RAM),就我而言(3-50GB 文件),同步/复制速度从大约 9.5MiB/s 上升到 700+MiB/s,速度增加了比默认配置高 70 倍。