文档

存储桶版本控制

概述

MinIO 支持在一个存储桶中保留对象的多个“版本”。

启用后,版本控制允许 MinIO 保留同一对象的多个迭代。通常会覆盖现有对象的写入操作,而是导致创建新的版本化对象。MinIO 版本控制可以防止意外覆盖和删除,同时支持“撤消”写入操作。存储桶版本控制是配置对象锁定和保留规则的先决条件。

对于版本化存储桶,更改对象的写入操作会生成该对象的新版本,并具有唯一的版本 ID。MinIO 会标记客户端默认检索的对象的“最新”版本。然后,客户端可以选择显式列出、检索或删除特定对象版本。

定义对象过期规则以删除不再需要的对象版本,例如根据版本数或版本的日期。

版本化对象上的读取操作

查看此系列中的四个图像中的每一个,以了解 MinIO 如何在版本化存储桶中检索对象。使用图像两侧的箭头在图像之间导航。

在版本 MinIO 中更改: 服务器 RELEASE.2023-05-04T21-44-30Z

MinIO 不会为显式目录对象(“前缀”)的创建、变异或删除创建版本。在该显式目录对象内创建的对象保留正常的版本控制行为。

MinIO 从对象路径隐式确定前缀。显式前缀创建通常仅在 Spark 和类似工作负载中发生,这些工作负载在 S3 上下文中应用传统的 POSIX/HDFS 目录创建行为。

版本控制是针对每个命名空间的

MinIO 使用对象的完整命名空间(存储桶和对象路径)来确定对象的唯一性。例如,以下所有命名空间都是“唯一”的对象,其中每个对象的变异都会导致在该命名空间创建新的对象版本

databucket/object.blob
databucket/blobs/object.blob
blobbucket/object.blob
blobbucket/blobs/object.blob

虽然object.blob在所有命名空间中可能都是相同的二进制文件,但 MinIO 仅在特定命名空间中强制执行版本控制,因此将上述每个object.blob视为不同的和唯一的。

版本控制和存储容量

MinIO 不执行增量或差异类型的版本控制。对于变异密集型工作负载,这可能会导致旧版或已过时对象版本占用大量驱动器使用空间。

例如,考虑一个包含日志数据的 1GB 对象。应用程序将 100MB 的数据追加到日志中并上传到 MinIO。然后,MinIO 将包含该对象的 1GB 和 1.1GB 版本。如果应用程序每天重复此过程 10 天,则存储桶最终将包含超过 14GB 与单个对象关联的数据。

MinIO 支持配置对象生命周期管理规则来自动到期或转换已过时的对象版本并释放存储容量。例如,您可以配置规则以在对象版本变成非当前版本(即不再是该对象的“最新”版本)后 90 天自动到期。有关更多信息,请参阅MinIO 对象过期

或者,您可以使用以下命令手动删除对象版本

RELEASE.2024-04-18T19-09-19Z 版本新增功能: 如果任何单个对象的版本累积大小超过 1TiB,MinIO 将发出警告。

版本 ID 生成

MinIO 为每个版本化的对象生成一个唯一且不可变的标识符,作为写入操作的一部分。每个对象版本 ID 由一个 128 位固定大小的UUIDv4组成。UUID 生成具有足够的随机性,以确保在任何环境中都具有很高的唯一性可能性,并且在计算上难以猜测,并且不需要集中式注册流程和权限来保证唯一性。

Object with Multiple Versions

MinIO 不支持客户端管理的版本 ID 分配。所有版本 ID 生成都由 MinIO 服务器进程处理。

对于在禁用或暂停版本控制时创建的对象,MinIO 使用null版本 ID。您可以通过在 S3 操作中指定null作为版本 ID 来访问或删除这些对象。

版本化删除操作

对版本化对象执行DELETE操作会创建一个 0 字节的DeleteMarker作为该对象的最新版本。对于最新版本为DeleteMarker的对象,客户端必须指定版本控制标志或标识符才能对该对象的先前版本执行GET/HEAD/LIST/DELETE操作。默认服务器行为会忽略DeleteMarker对象,使其不适用于非版本化操作。

MinIO 可以利用生命周期管理过期规则来自动永久删除版本化对象。否则,请使用手动DELETE操作永久删除非当前版本化对象或DeleteMarker对象。

MinIO 实现幂等删除标记

RELEASE.2022-08-22T23-53-06Z 版本已更改。

标准 S3 实现可以在处理没有版本标识符的简单DeleteObject请求时为同一对象创建多个连续的删除标记。有关管理删除标记的详细信息,请参阅 S3 文档。

MinIO 与标准 S3 实现的不同之处在于它避免了这种潜在的删除标记重复。在处理没有版本标识符的Delete请求时,MinIO 最多为指定的对象创建一个删除标记。MinIO **不会**像 S3 一样创建多个连续的删除标记。

要永久删除对象版本,请执行DELETE操作并指定要删除的对象的版本 ID。版本化删除操作是**不可逆的**。

以下mc命令对DeleteMarkers或版本化对象进行操作

教程

启用存储桶版本控制

您可以使用 MinIO 控制台、MinIO mc CLI 或使用兼容 S3 的 SDK 来启用版本控制。

选择 MinIO 控制台的存储桶部分以访问存储桶创建和管理功能。您可以使用 搜索栏来过滤列表。

MinIO Console Bucket Management

每个存储桶行都有一个管理按钮,用于打开该存储桶的管理视图。

MinIO Console Bucket Management

切换版本控制字段以在存储桶上启用版本控制。

MinIO 控制台还支持在存储桶创建过程中启用版本控制。有关使用 MinIO 控制台管理存储桶的更多信息,请参阅存储桶

使用mc version enable命令在现有存储桶上启用版本控制

mc version ALIAS/BUCKET
  • ALIAS替换为已配置的 MinIO 部署的别名

  • BUCKET替换为要启用版本控制的目标存储桶

在启用版本控制之前创建的对象具有null版本 ID

从版本控制中排除前缀

您可以使用MinIO 客户端从版本控制中排除某些前缀。这对于 Spark/Hadoop 工作负载或其他最初使用临时前缀创建对象的负载很有用。

复制和对象锁定需要版本控制

MinIO 需要版本控制来支持 复制。排除前缀中的对象不会复制到任何对等站点或远程站点。

对于启用了 对象锁定 的存储桶,MinIO 不支持从版本控制中排除前缀。

--excluded-prefixes 前缀列表匹配前缀或名称中包含指定字符串的所有对象,类似于 prefix* 形式的正则表达式。要仅按前缀匹配对象,请使用 prefix/*

例如,以下命令从版本控制中排除前缀或名称中包含 _test_temp 的任何对象

mc version enable --excluded-prefixes "_test, _temp" local/my-bucket

每个存储桶最多可以排除 10 个前缀。要添加或删除前缀,请使用更新的列表重复 mc version enable 命令。新的前缀列表将替换之前的列表。

要查看当前排除的前缀,请使用带有 --json 选项的 mc version info

mc version info ALIAS/BUCKET --json

命令输出类似于以下内容,其中 ExcludedPrefixes 属性中包含排除的前缀列表

$ mc version info local/my-bucket --json
{
 "Op": "info",
 "status": "success",
 "url": "local/my-bucket",
 "versioning": {
  "status": "Enabled",
  "MFADelete": "",
  "ExcludedPrefixes": [
   "prefix1, prefix2"
  ]
 }
}

要禁用前缀排除并恢复所有前缀的版本控制,请在没有 --excluded-prefixes 的情况下重复 mc version enable 命令

mc version enable ALIAS/BUCKET

从版本控制中排除文件夹

您可以使用 MinIO 客户端 从版本控制中排除文件夹。

复制和对象锁定需要版本控制

MinIO 需要版本控制来支持 复制。排除的文件夹中的对象不会复制到任何对等站点或远程站点。

对于启用了 对象锁定 的存储桶,MinIO 不支持从版本控制中排除文件夹。

对象锁定

启用了 对象锁定 的存储桶需要版本控制,并且不支持排除文件夹。

  • 使用带有 --exclude-folders 选项的 mc version enable 来从版本控制中排除名称以 / 结尾的对象。

    mc version enable --exclude-folders ALIAS/BUCKET
    
    • ALIAS替换为已配置的 MinIO 部署的别名

    • BUCKET 替换为您要排除 文件夹存储桶 的名称。

要检查存储桶的文件夹是否已启用版本控制,请使用带有 --json 选项的 mc version enable 命令。如果 ExcludeFolders 属性为 true,则该存储桶中的文件夹未启用版本控制。

mc version enable --excluded-prefixes ALIAS/BUCKET --json

命令输出类似于以下内容

$ mc version info local/my-bucket --json
{
 "Op": "info",
 "status": "success",
 "url": "local/my-bucket",
 "versioning": {
  "status": "Enabled",
  "MFADelete": "",
  "ExcludeFolders": true
 }
}

要禁用文件夹排除并恢复所有文件夹的版本控制,请在没有 --exclude-folders 的情况下重复 mc version enable 命令

mc version enable ALIAS/BUCKET

暂停存储桶版本控制

您可以随时使用 MinIO 控制台、MinIO mc CLI 或 S3 兼容的 SDK 来暂停存储桶版本控制。

选择 MinIO 控制台的存储桶部分以访问存储桶创建和管理功能。您可以使用 搜索栏来过滤列表。

MinIO Console Bucket Management

每个存储桶行都有一个管理按钮,用于打开该存储桶的管理视图。

MinIO Console Bucket Management

选择 版本控制 字段并按照说明暂停存储桶中的版本控制。

有关使用 MinIO 控制台管理存储桶的更多信息,请参阅 存储桶

使用 mc version suspend 命令在现有存储桶上启用版本控制

mc version suspend ALIAS/BUCKET
  • ALIAS替换为已配置的 MinIO 部署的别名

  • BUCKET 替换为要禁用版本控制的 目标存储桶

在版本控制暂停期间创建的对象将分配一个 null 版本 ID。在版本控制暂停期间对对象的任何修改都会导致覆盖该 null 版本的对象。MinIO 不会在暂停版本控制时删除或以其他方式更改现有的版本化对象。客户端可以继续与存储桶中的任何现有对象版本进行交互。