文档

存储桶版本控制

概述

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。您可以通过在 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 控制台的 Buckets 部分以访问桶创建和管理功能。您可以使用 Search 栏来过滤列表。

MinIO Console Bucket Management

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

MinIO Console Bucket Management

切换 Versioning 字段以启用桶上的版本控制。

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

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

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

  • BUCKET 替换为要启用版本控制的 target bucket

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

从版本控制中排除前缀

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

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

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

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

  • 使用 mc version enable 命令,并加上 --excluded-prefixes 选项。

    mc version enable --excluded-prefixes "prefix1, prefix2" ALIAS/BUCKET
    
    • ALIAS 替换为已配置的 MinIO 部署的 alias

    • BUCKET 替换为要排除 前缀 的名称。

指定 --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 控制台的 Buckets 部分以访问桶创建和管理功能。您可以使用 Search 栏来过滤列表。

MinIO Console Bucket Management

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

MinIO Console Bucket Management

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

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

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

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

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

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