S3 - 前缀究竟是什么?什么Ratelimits适用?

dm0*_*514 44 amazon-s3 amazon-web-services

我想知道是否有人知道s3前缀是什么以及它如何与亚马逊发布的s3速率限制相互作用:

Amazon S3会自动扩展到高请求率.例如,您的应用程序可以在一个存储桶中实现每个前缀每秒至少3,500个PUT/POST/DELETE和5,500个GET请求.存储桶中的前缀数量没有限制.

虽然这很清楚,但我不确定前缀是什么?

前缀是否需要分隔符?

如果我们有一个存储桶,我们将所有文件存储在"根"级别(完全平坦,没有任何前缀/分隔符),这是否算作单个"前缀"并且是否受上面公布的速率限制的约束?

我正在解释亚马逊的文档的方式告诉我,情况就是这样,并且扁平结构将被视为单个"前缀".(即它将受上述公布的费率限制)

假设您的存储桶(admin-created)有四个对象,其中包含以下对象键:

开发/ Projects1.xls

财务/ statement1.pdf

私人/ taxdocument.pdf

S3-dg.pdf

s3-dg.pdf密钥没有前缀,因此其对象直接显示在存储桶的根级别.如果打开Development /文件夹,则会在其中看到Projects.xlsx对象.

在上面的例子中,s3-dg.pdf是否会受到与其他每个前缀(开发/财务/私人)不同的5500 GET请求/秒速率限制?

更令人困惑的是,我已经阅读了几篇关于亚马逊的博客,使用前N个字节作为分区键并鼓励使用高基数前缀,我只是不确定它是如何与具有"平面文件结构"的桶交互的.

Ore*_*ren 25

没错,该公告似乎与自己矛盾。只是写的不正确,但是信息是正确的。简而言之:

  1. 每个前缀每秒最多可以实现3,500 / 5,500个请求,因此出于许多目的,假设您不需要使用多个前缀。
  2. 前缀被视为对象位置的整个路径(直到最后一个“ /”),并且不再仅由前6-8个字符进行哈希处理。因此,仅在任何两个“文件夹”之间拆分数据就足以实现每秒最多x2个请求。(如果请求在两者之间平均分配)

作为参考,以下是AWS支持人员对我的澄清请求的回复:

你好奥伦,

感谢您联系AWS支持。

我了解您阅读了有关提高S3请求率性能的AWS帖子,并且对本公告还有其他疑问。

在此升级之前,S3支持每秒100个PUT / LIST / DELETE请求和每秒300个GET请求。为了获得更高的性能,必须实现随机哈希/前缀架构。从去年开始,请求速率限制增加到每秒3500个PUT / POST / DELETE和5500个GET请求。这种增加通常足以使应用程序减轻503 SlowDown错误,而不必随机化前缀。

但是,如果新的限制还不够,则需要使用前缀。前缀没有固定数量的字符。它是存储区名称和对象名称之间的任何字符串,例如:

  • 桶/文件夹1 /子1 /文件
  • 桶/文件夹1 /子2 /文件
  • 桶/ 1 /文件
  • 桶/ 2 /文件

对象“文件”的前缀是: /folder1/sub1//folder1/sub2//1//2/。在此示例中,如果将读取平均分布在所有四个前缀中,则每秒可以实现22,000个请求。

  • @Chris,我很乐意用新信息更新答案,但该链接听起来和该主题的其他 AWS 通信一样模糊(如果不是更糟的话)。- “文件夹结构*可能不一定*表明什么被认为是支持请求率的分区前缀”。我逐字发布的支持答案与我得到的可靠答复一样接近。 (3认同)
  • 对于 SES S3 操作,“对象键前缀”不需要有前导斜杠:`folder1/sub1/` (2认同)
  • 这似乎与 [STG343 的演示者](https://www.youtube.com/watch?v=54AhwfME6wI) 相矛盾,他说斜线被像任何其他字符一样对待,并且分区是自动的。 (2认同)
  • 与 [AWS 官方文档](https://aws.amazon.com/premiumsupport/knowledge-center/s3-prefix-nested-folders-difference/) 相矛盾。 (2认同)

dm0*_*514 10

亚马逊发布通讯中似乎模糊地解决了这个问题

https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased-request-rate-performance/

性能按前缀扩展,因此您可以并行使用任意数量的前缀以实现所需的吞吐量。前缀数量没有限制。

S3请求速率性能的提高消除了任何先前的指南,即可以随机化对象前缀以实现更快的性能。这意味着您现在可以在S3对象命名中使用逻辑或顺序命名模式,而不会影响性能。现在,所有AWS区域都可以使用此改进。有关更多信息,请访问Amazon S3开发人员指南。

  • 只会引发更多问题!大声笑。这些陈述似乎是相反的。该引用似乎是说限制取决于前缀,但是前缀不再重要...?但该限制仍然适用于前缀。但是前缀不再重要(猜测它们是否在内部散列以获得真实分区?)。:困惑: (4认同)
  • @CoryMawhorter如果您深入了解(或做到了),可以告诉我们。我也会这样做。 (4认同)
  • 我认为通过前缀,您现在应该只阅读“文件夹”,即使从技术上讲文件夹不是存储桶中的东西。我认为关于随机化的说明是因为以前前缀基于存储桶键的前 8 个字符,而现在它们基于完整的“文件夹”路径。 (2认同)

Tag*_*gar 9

S3前缀过去是由前6-8个字符决定的;

这在 2018 年年中发生了变化 - 请参阅公告 https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased-request-rate-performance/

但那是半真半假。实际上前缀(在旧定义中)仍然很重要。

S3 不是传统的“存储”——每个目录/文件名都是键/值对象存储中的一个单独对象。而且数据必须被分区/分片以扩展到数以亿计的对象。所以是的,这个新的分片有点“自动”,但如果你创建了一个新进程,它以疯狂的并行性向不同的子目录写入它,就不是真的。在 S3 从新的访问模式中学习之前,您可能会遇到 S3 节流,然后才会相应地重新分片/重新分区数据。

学习新的访问模式需要时间。数据的重新分区需要时间。

事情在 2018 年年中确实有所改善(对于没有统计数据的新存储桶,吞吐量约为 10 倍),但如果数据分区正确,情况仍然不是这样。尽管公平地说,如果您没有大量数据,或者您访问数据的模式不是非常并行(例如,在 S3 中的许多 Tbs 数据上运行 Hadoop/Spark 集群,其中数百+并行访问同一存储桶的任务)。

TLDR :

“旧前缀”仍然很重要。将数据写入存储桶的根目录,那里的一级目录将确定“前缀”(例如使其随机)

“新前缀”确实有效,但最初无效。需要时间来适应加载。

附注。另一种方法 - 如果您预计很快就会有大量数据涌入,您可以联系您的 AWS TAM(如果您有的话)并要求他们对新的 S3 存储桶进行预分区。

  • 我们刚刚进行了详细调查,并直接与 S3 内部团队进行了联系。截至 2022 年 3 月,这是唯一正确的答案。AWS 意识到他们的文档不正确/具有误导性;希望他们能在某个时候解决这个问题。 (5认同)
  • @MicheleGargiulo,是的,有与我们的客户合作的经验。 (2认同)

Mat*_*t D 5

为了使AWS每秒处理数十亿个请求,他们需要分拆数据,以便优化吞吐量。为此,他们根据对象键的前6到8个字符将数据划分为多个分区。请记住,S3不是分层文件系统,它只是键值存储,尽管键通常像组织数据的文件路径(前缀+文件名)那样使用。

现在,如果您希望每秒少于100个请求,那么这不是问题,但是如果您对此有严格的要求,则需要考虑命名。

为了获得最大的并行吞吐量,您应该考虑如何使用数据,并在密钥的开头使用变化最大的字符,甚至对于密钥的前8个字符生成8个随机字符。

例如,假设前6个字符定义了分区:

files/user/bob因为所有对象都放在一个分区上是不好的files/

2018-09-21/files/bob如果仅从分区读取今天的数据,将会几乎一样糟糕2018-0。但是,如果从过去的几年中读取对象,则稍微好一些

bob/users/files如果不同的用户可能同时使用分区中的数据,那将是很好的bob/us。但是如果Bob是迄今为止最繁忙的用户,那还不是很好。

3B6EA902/files/users/bob会是最好的表现,但更具挑战性的参考,其中第一部分是一个随机字符串,这将是非常均匀涂抹。

根据您的数据,您需要考虑任何时间点,谁在读取内容,并确保键以足够的变化开头以适当地进行分区。


对于您的示例,假设分区是从键的前6个字符中选取的:

对于键Development/Projects1.xls,分区键将是Develo

对于键Finance/statement1.pdf,分区键将是Financ

对于键Private/taxdocument.pdf,分区键将是Privat

对于键s3-dg.pdf,分区键将是s3-dg.

  • `每个前缀每秒 3,500 个 PUT/POST/DELETE 和 5,500 个 GET 请求`指的是分区。您不确定为您的数据创建了多少个分区,但通过改变前几个字符,您可以获得最大的请求吞吐量。 (3认同)
  • 本指南已过时。现在是否放置随机前缀都没关系,因为S3现在将在内部对其进行哈希处理:https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased -request-rate-performance /“此S3请求速率性能提高消除了任何先前的指南,即随机化对象前缀以实现更快的性能。这意味着您现在可以在S3对象命名中使用逻辑或顺序命名模式,而不会影响性能。” (3认同)
  • 前缀实际上只是文件名前面的密钥位。实际上,是整个密钥用于形成分区结构。 (2认同)
  • 我们不确定该公告的含义,这是自相矛盾的......“每个前缀的性能可扩展,因此您可以并行使用任意数量的前缀来实现所需的吞吐量。” 和“此 S3 请求速率性能提升消除了任何先前的指导,即随机化对象前缀以实现更快的性能。”。那么如何添加更多前缀呢?寻找实践经验。 (2认同)
  • 据我了解,这意味着完整路径(不带文件名)是“前缀”,因此我们应该尽量不要使用相同的前缀:/ bob / users-而是/bob/users/21rlkfjrijRandom/file.jpg (2认同)

小智 5

对此的赞成答案对我来说有点误导。如果这些是路径

存储桶/文件夹1/子1/文件
存储桶/文件夹1/子2/文件
存储桶/1/文件
存储桶/2/文件

您的文件前缀实际上是
folder1/sub1/
folder1/sub2/
1/file
2/file

https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html 请参阅文档。当我尝试使用气流 s3hook 列出键时,我遇到了前导“/”的问题。

  • 我认为示例中的最后两个路径不应以“/file”结尾。 (15认同)