文档

存储桶版本控制

概述

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 命令。新的前缀列表将替换旧列表。

要查看当前排除的前缀,请使用 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"
  ]
 }
}

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

mc version enable ALIAS/BUCKET

从版本控制中排除文件夹

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

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

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

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

对象锁定

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

  • 使用 mc version enable 命令并结合 --exclude-folders 选项来排除名称以 / 结尾的对象,使其不受版本控制。

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

    • 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
 }
}

要禁用文件夹排除并恢复所有文件夹的版本控制,请在不使用 --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 不会在暂停版本控制时删除或以其他方式更改现有的版本化对象。客户端可以继续与存储桶中的任何现有对象版本进行交互。