文档

存储桶版本控制

概述

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 控制台的 存储桶 部分,以访问存储桶创建和管理功能。您可以使用 搜索 条来筛选列表。

MinIO Console Bucket Management

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

MinIO Console Bucket Management

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

MinIO 控制台还支持在存储桶创建期间启用版本控制。有关使用 MinIO 控制台管理存储桶的详细信息,请参阅 存储桶

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

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

  • 用要启用版本控制的 目标存储桶 替换 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
    
    • 用已配置的 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
  • 用已配置的 MinIO 部署的 别名 替换 ALIAS

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

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