随机哈希前缀如何提高S3大规模GET性能?

时间:2018-04-05 01:21:03

标签: amazon-web-services amazon-s3

我将继续并指出已经在Add a random prefix to the key names to improve S3 performance?询问并回答了我的问题 - 在我看来不够充分。

有人可以用更多外行人的术语解释如何在大规模访问的对象中添加随机哈希前缀有助于提高性能吗?

一个场景可能有助于说明我缺乏理解:

1000个客户端都在尝试(使用适当的权限)对存储桶[((targetClass *) self) methodForSelector:selector] 中的对象foo执行GET请求,那么如何制作bar - > foo有助于缓解系统压力?客户端在GET请求中是否仍然需要相同的对象?

我显然错过了一些可能很愚蠢的东西,但我真的很想知道为什么这会有所帮助 - 我猜我的误解源于S3处理索引和分区的方式,但是我们会非常感谢一些进一步的指导

1 个答案:

答案 0 :(得分:4)

我建议你的直觉是正确的:对象键前缀中的熵不会改善对同一个对象的重复读取。

这不是正在考虑的性能类型(尽管如果你有这种工作负载,你应该考虑在S3前面使用CloudFront,将工作负载分成几十个边缘位置的节点,并将缓存副本保存在任何地方附近你的观众碰巧是)。

随机前缀会影响水平扩展潜力,这可以直接提高潜在的写入容量 - 即可实现的对象创建和覆盖率,以每秒请求数为单位¹ - 通过降低索引中热点的发生率。

通过为S3的分区拆分逻辑提供可靠的工作,可以提高潜在的写入容量。如果你有(例如)十六进制对象密钥前缀,S3可能会在对象密钥的第一个八位字节上分割最多16个不同的分区,第二个字节为256,第三个字节为4096 ......所以看似这样 - 简单的更改,您可以为服务提供一种简单的方法,将每个分区的工作负载一次又一次地减少。

如果要创建具有不断递增的键(特别是时间戳)的对象,则无法通过将其拆分为两个来减少一个分区上的负载,因为无论在何处进行拆分,新对象始终都是将位于右侧(>分割点)新分区,而左侧(<分割点)将处理很少或没有新对象创建。

¹每秒请求数,而不是有效负载带宽,因为带宽似乎不是一个问题,因为S3显然会独立于对象键 - 对象索引和对象对其后备存储进行分片有效载荷似乎是单独存储的,否则分区拆分在机器方面会非常昂贵,更不用说是一个更精细的操作,因为必须将持久存储的对象移动到新的存储位置。