AWS S3:有时候你应该按下10万美元的按钮

2022-02-20 16:46:13

TLDR:凡人都会实施S3读写性能的最佳实践,用他们的高性能系统创建数以百万计的S3对象,试图清理真正昂贵的混乱,发现自己处在一个空间如此广阔、无限永恒的维度中。

在BigQuery和S3'之前的日子里;它的无限对象存储,数据是有限的和可预测的。这种限制促使工程师和建筑师决定在设计时存储什么和不存储什么。严格的数据模型和模式已经到位。在拥有God模式SQL权限的专门团队后面,开发人员可以安全地保存静止的数据。

如今,托管服务已经实现了它们的巨大承诺。现在,您可以将MVP扩展到企业规模,所有事情都会为您解决。  ‍

现在,AWS Kinesis每秒可以将50万条(软限制)记录转储到S3存储桶中。如果你没有';我不知道在哪里可以找到每秒50万条记录,控制台上有一个方便的渠道合作伙伴菜单。他们只需点击几下就可以将其传送给您。(但别担心,你的bucket上可能已经启用了版本控制,一些失控的递归重影代码正在无休止地触及一些配置文件。)

‍ ‍NDJSON是流动的,数据科学家在船上,生活真的很美好,有一段时间,直到有一天;在众多状态会议中的一次会议上,领导层指出,您的团队已经完成了今年的云计算预算,而且只有5月份。在cost explorer中,来自多条消防水管的涓涓细流已经累积到了S3存储账单中,几乎每月10万美元。

... 多条消防水管的涓涓细流已累积到S3存储账单中,每月近10万美元。

这听起来像一场灾难,但它';这不是世界末日,对吗?至少这个问题是可以衡量的。毕竟,你可以删除一堆物体,然后把剩下的一堆垃圾移到AWS冰川(或者他们刚改名字的任何地方)。‍

S3对象通过其Bucket和前缀命名——对于S3对象:

名为login-123123的json文件。json和logout-436564。json实际上并不在另一个名为app的文件夹中嵌套的名为events的文件夹中。

这些文件存储在某个物理驱动器上,并通过整个字符串app/events/(称为前缀)在其他地方建立索引。/字符实际上只是一个呈现的分隔符。实际上,您可以指定任何想要作为列表/扫描API分隔符的内容。

不管怎样,在后台,这些前缀用于在物理数据中心的任何电线和金属盒上对S3存储桶中的数据进行切分和分区。由于任何字符都可以是分隔符,随着AWS发现数据的访问模式,这种情况实际上会随着时间的推移而发生。这一点很重要,因为虽然AWS将适应任何模式,但前缀设计会驱动开发人员的访问模式,并影响大规模大容量读写应用程序的性能。

这意味着您每秒最多可以进行3500次写入/5500次读取请求,以添加或查看应用程序/事件/文件。高于这个值,您可能会遇到503或429个错误,尤其是突发流量。

当面临以实用性能生产或访问大数据的挑战时,最佳实践、企业支持和您的技术客户经理(TAM)会建议您:

这些最佳实践通常在早期MVP中被忽略,对象很可能以熟悉的文件夹/文件模式存储。它没有';这件事很快就会暴露出来。当有人第一次尝试使用AWS Athena等工具进行大规模查询,并与面向客户的S3读取过程竞争时,通常会在读取时遇到第一个性能问题。

这被记为偿还技术债务,并努力使现有模式适应最佳实践。用于生成app/events/login-123123的流程。json被重构为编写app/events/dt=yyyy-mm-dd/login-123123。而是json。‍ (实际上,像app/events/dt=yyyy-mm-dd/asdfasdf.gz这样的东西,用杂乱的动态json文件构建爬虫模式来制作拼花地板是很困难的,而且你认为自己很聪明,只需在firehose中启用gzip压缩即可。)

凉的在数据目录中配置分区键dt=yyyy-mm-dd,编写一些文档,说明每个人应该如何使用日期范围来提高查询效率。一切都很好,数据科学团队可以再次进行线性回归,即“机器学习”,以找出哪些事件最赚钱,或者,你知道的“推动业务KPI”。

一段时间过去了,现在S3中有大量数据。有人已经注意到它的成本,现在你必须清理它。

希望AWS能牵着你的手——你';很明显,你是一个非常好的客户。他们会告诉你,清理东西有两种选择:

使用列表手动逐个删除对象并删除API(是的,听起来很愚蠢)

在bucket级别设置生命周期策略,根据前缀规则使对象过期(听起来很有希望!!)

按标记应用(这很好..但是没有人标记已经在其中的任何对象)

按大小阈值应用(你可能想要或不想要的东西之间没有明显的大小差异)

在没有太多研究的情况下,前缀过滤器看起来非常好。当然,就像过滤器一样,每个人都需要决定他们想要保留什么和不保留什么。这听起来像是一堆电话和会议。在这个两难问题上,AWS的合作伙伴(实际上是好的)建议-

“你的成本在不断累积,我们可以帮助你将真正古老的东西转移到冰川以阻止流血。”‍ - AWS兄弟

与冰川有明显的权衡。但由于大规模读取,尤其是对旧数据的读取并不经常进行,经过一些简短的全手讨论后,所有人都同意这一点。

你返回并按下控制台上的按钮。出现一条消息,要求您确认您意识到:

但不是';难道没有百万亿个物体吗??换个存储类怎么样?要求及;数据检索>;生命周期转换请求(每1000个请求)。尽管s3控制台在选择其他存储类时不会发出不祥的警告,但仍会收取过渡性请求费用。福乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌‍ 在AWS的帮助下,对你数十亿个json文件进行度量清点,再加上一点数学计算——确定按下这个按钮将产生大约10万美元的一次性成本。

组织中很少有人(都是非技术人员)有能力授权。没有人(或者至少不是凡人)想成为告诉这些人这个消息的人。接下来是A计划。接着是B计划:找出可以删除的内容。

在事态升级之前,你得赶紧与利益相关者召开会议。Data science表示保留所有登录,但不关心注销。应用程序团队需要这两种功能,但只需要一周左右的时间。合规部表示,有些东西可以归档,但归档必须保存一年。很复杂,但目前在状态会议上有话要说;我们';我们正在努力"

快进三个月的每周状态会议,与不同的团队合作记录数据保留要求。是的,账单已经支付,存储了更多的东西,成本也上升了,但是——终于有了一个清单!

您将在30天后对注销进行存档,并在一年后删除以符合要求,数据科学团队的登录将保留6个月,存档。。。等等等等。

现在是转折点。不知何故,通过多次会议、AWS支持电话等,前缀过滤器如何工作的故事已经演变为每个人都希望它如何工作。请与支持人员联系-您会发现app/events/*/login-*。json和app/events/*/logout-*。json实际上不会神奇地扫描通配符模式。它';这是硬币的另一面。读写性能如此之高,使得在生命周期策略中实现通配符变得不可能。

大家是怎么产生误会的?(除了不阅读文档之外)对于另一个有通配符的AWS服务,文档中可能会出现类似的语言吗?浏览关于这个主题的博客帖子?S3文档没有明确告诉您可以';你不能那样做吗?(欢迎评论)

面对这个事实,英雄们意识到,他们花了很多时间来制定这些规则,列出了清单,进行了辩论。现在不能再回到A计划了。几次冲刺之后,开发者得到了一个用户故事:“使用大屁股SageMaker抓取s3并清理”(3分)。

该组织是否仍在支付该账单已经成为历史,但legend表示,用户故事已被取消优先级。