文档

存储桶版本控制

概述

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

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

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

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

对版本化对象的读取操作

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

在版本 MinIO 中更改: Server 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。您可以通过将 null 指定为 S3 操作的一部分的版本 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 部署的 alias

  • BUCKET 替换要启用版本控制的 target 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 命令,并提供更新的前缀列表。新的前缀列表将替换之前的列表。

要查看当前排除的前缀,请使用 mc version info 命令,并加上 --json 选项

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"
  ]
 }
}

要禁用前缀排除并恢复所有前缀的版本控制,请重复使用 mc version enable 命令,但不带 --excluded-prefixes 选项

mc version enable ALIAS/BUCKET

从版本控制中排除文件夹

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

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

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

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

对象锁定

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

  • 使用 mc version enable 命令并加上 --exclude-folders 选项,以从版本控制中排除名称以 / 结尾的对象

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

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

要检查存储桶的文件夹是否已进行版本控制,请使用 mc version enable 命令,并加上 --json 选项。如果 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
 }
}

要禁用文件夹排除并恢复所有文件夹的版本控制,请重复使用 mc version enable 命令,但不带 --exclude-folders 选项

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 部署的 alias

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

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