引领潮流: MinIO 针对现代数据工作负载的条件写入功能

引领潮流: MinIO 针对现代数据工作负载的条件写入功能

当 AWS S3 说话时,人们会倾听。上周,他们宣布了条件写入功能。但这对我们 MinIO 来说并不是突发新闻——我们最初在 2023 年 2 月合并了对条件写入的支持,从那时起,我们的许多客户一直在使用它。鉴于 AWS 最近的公告及其带来的浓厚兴趣,我们认为现在是重新审视这一强大功能并解释它如何使您受益的好时机。

具体化:什么是 MinIO 的条件写入功能?

MinIO 的条件写入功能利用乐观并发控制,使用 If-Match 和 If-None-Match HTTP 标头进行与 S3 兼容的上传。如果在发生对象命名空间冲突时满足以下两个条件之一,则可能会发生写入操作:

  • 该对象存在,并且与 Client 端要写入的内容匹配。
  • 对象存在,但与客户端要写入的对象不匹配。

If-Match 标头指示仅当正在写入的对象具有与现有对象匹配的 ETag/MD5 校验和时,PUT 才应成功。相反,If-None-Match 标头指示仅当正在写入的对象具有与现有对象不同的 ETag/MD5 校验和时,PUT 才应成功。虽然 AWS 仅支持 If-None-Match 条件,但 MinIO 同时支持 If-None-Match 和 If-Match,从而提供更完整的 RFC 7232 实现。这种额外的支持使 MinIO 用户能够更好地控制在分布式环境中处理对象更新的方式。

过程

1 . 检索对象:首先,从 MinIO 中检索对象。响应包括一个 HTTP ETag Header 值,该值唯一标识对象的当前版本。

2 . 准备更新:准备上传或更新对象时,请将您收到的 ETag 值包含在上传请求的 If-Match 条件标头中。MinIO 会将此 ETag 值与对象的当前 ETag 进行比较。

3 . 检查更改:如果 MinIO 检测到对象的当前 ETag 值与 If-Match 标头中指定的 ETag 不同,则不会执行上传。相反,它将返回 HTTP 状态代码 412 (Precondition Failed)。此响应表示自您上次检索对象以来,另一个进程修改了该对象,建议您应再次获取该对象以获取最新版本。

4 . 继续进行 更新:如果对象的当前 ETag 值与 If-Match 标头中的 ETag 匹配,则 MinIO 将继续上传,成功更新对象及其 ETag 值。此确认可确保对象的状态保持一致并防止意外覆盖。

通过使用 If-Match 和 If-None-Match 标头,MinIO 提供了可靠且安全的并发上传处理。此功能可确保仅对对象应用一致和预期的更新,从而有效地管理分布式系统中的并发挑战。

条件写入的用例

在 AI 和数据湖仓一体时代,多个客户端或进程经常尝试同时更新同一对象。MinIO 的条件写入功能在这些高并发环境中特别有利。AI 训练模型和机器学习工作流依赖于数据的一致性和准确性来提供可靠的结果,这使得写入按预期运行至关重要。在这些高并发方案中,多层控制和保护非常有价值。虽然所有三种开放表格式(Apache Iceberg、Apache Hudi 和 Delta Lake)都提供并发控制,但 MinIO 的条件写入功能增加了另一个关键层。它确保数据管道保持可靠,防止可能影响训练结果的意外修改。以下是实际操作中的样子:

if-none-match 以防止丢失更新:If-None-Match 的一个特定用例是保存可能存在也可能不存在的文件,确保在更新之前没有其他进程上传相同的对象,否则可能会覆盖以前的数据。此技术直接解决了丢失更新问题,即客户端可能会覆盖另一个客户端所做的更改,而没有意识到这些更改已进行。使用 If-None-Match 时,如果另一个客户端在您更新之前上传了同名的对象,则您的上传将失败,从而确保之前上传的数据完整性保持不变。当多个进程同时运行上传或写入时,这尤其有用。

if-match 用于仅元数据更新:If-Match 标头对于对对象执行仅元数据更新变得非常有价值,从而允许您保证基础数据未更改。例如,当您想在不修改对象本身的情况下更新对象的元数据(例如,添加或更新标签)时,If-Match 仅在对象的 ETag 与您指定的 ETag 匹配时继续更新,从而确保维护数据完整性。这可以防止在其他进程可能已更新数据时意外覆盖。

MinIO 对条件写入的早期实施展示了我们对创新和客户需求的承诺。随着对象存储日益成为所有类型数据工作负载的首选,MinIO 继续引领潮流,提供确保可靠性、可扩展性和性能的尖端功能。

上一篇 下一篇