引领行业:MinIO 的条件写入功能助力现代数据工作负载

当 AWS S3 发声时,人们都会倾听。上周他们宣布了 条件写入功能。但这对 MinIO 来说并不是什么新鲜事——我们最初在 2023 年 2 月就合并了对条件写入的支持,并且许多客户从那时起一直在使用它。鉴于 AWS 最近的公告及其带来的浓厚兴趣,我们认为现在是重新审视这一强大功能并解释它如何使您受益的好时机。
明确说明:什么是 MinIO 的条件写入功能?
MinIO 的条件写入功能利用了乐观并发控制,使用与 S3 兼容的上传的 If-Match 和 If-None-Match HTTP 标头。如果在对象命名空间冲突的情况下满足以下两种条件之一,则可以进行写入
- 对象存在且与客户端想要写入的内容相匹配。
- 对象存在但与客户端想要写入的内容不匹配。
If-Match 标头表示只有当写入的对象具有与现有对象匹配的 ETag/MD5 校验和时,PUT 操作才能成功。相反,If-None-Match 标头表示只有当写入的对象具有与现有对象不同的 ETag/MD5 校验和时,PUT 操作才能成功。虽然 AWS 只支持 If-None-Match 条件,但 MinIO 支持 If-None-Match 和 If-Match,提供了更完整的 RFC 7232 实现。这种额外的支持使 MinIO 用户可以更好地控制在分布式环境中如何处理对象更新。
流程
- 检索对象:首先,您从 MinIO 检索对象。响应包含一个 HTTP ETag 标头值,该值唯一标识对象的当前版本。
- 准备更新:在准备上传或更新对象时,将您收到的 ETag 值包含在上传请求的 If-Match 条件标头中。MinIO 将此 ETag 值与对象的当前 ETag 进行比较。
- 检查更改:如果 MinIO 检测到对象的当前 ETag 值与 If-Match 标头中指定的 ETag 不同,它将不会执行上传。相反,它将返回 HTTP 状态代码 412(先决条件失败)。此响应表示另一个进程已修改自您上次检索对象以来的对象,建议您再次获取对象以获取最新版本。
- 继续更新:如果对象的当前 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 继续引领潮流,提供确保可靠性、可扩展性和性能的尖端功能。请告诉我们您在 hello@min.io 或 Slack 频道上使用 MinIO 功能构建的内容。