存储桶版本控制
概述
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 对象过期。
您也可以使用以下命令手动删除对象版本
mc rm --versions
- 删除对象的全部版本。mc rm --versions --older-than
-删除指定日历日期之前的所有对象版本。
版本 RELEASE.2024-04-18T19-09-19Z 中新增: 如果任何单个对象的版本累计大小超过 1TiB,MinIO 会发出警告。
版本 ID 生成
MinIO 在写入操作期间为每个版本化的对象生成一个唯一且不可变的标识符。每个对象版本 ID 由一个 128 位固定大小的 UUIDv4 组成。UUID 生成具有足够的随机性,以确保在任何环境中都极有可能保持唯一性,并且在计算上难以猜测,也不需要集中式注册流程和权威机构来保证唯一性。
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
或版本化对象上操作
使用
mc ls --versions
查看对象的全部版本,包括删除标记。使用
mc cp --version-id=UUID ...
检索与UUID
匹配的“已删除”对象的版本。使用
mc rm --version-id=UUID ...
删除与UUID
匹配的对象版本。使用
mc rm --versions
删除对象的所有版本。
教程
启用存储桶版本控制
可以使用 MinIO 控制台、MinIO mc
CLI 或使用兼容 S3 的 SDK 来启用版本控制。
选择 MinIO 控制台的 存储桶 部分以访问存储桶创建和管理功能。可以使用 搜索 栏来过滤列表。
每个存储桶行都有一个 管理 按钮,该按钮将打开该存储桶的管理视图。
切换 版本控制 字段以在存储桶上启用版本控制。
MinIO 控制台还支持在创建存储桶时启用版本控制。有关使用 MinIO 控制台管理存储桶的更多信息,请参阅 存储桶。
使用 mc version enable
命令在现有存储桶上启用版本控制
mc version ALIAS/BUCKET
将
ALIAS
替换为已配置的 MinIO 部署的alias
。将
BUCKET
替换为要启用版本控制的target bucket
。
在启用版本控制之前创建的对象具有 null
版本 ID。
从版本控制中排除前缀
可以使用 MinIO 客户端 从版本控制中排除某些 前缀。这对最初使用临时前缀创建对象的 Spark/Hadoop 工作负载或其他工作负载很有用。
使用
mc version enable
以及--excluded-prefixes
选项mc version enable --excluded-prefixes "prefix1, prefix2" ALIAS/BUCKET
--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 客户端 从版本控制中排除文件夹。
对象锁定
具有 启用对象锁定 的存储桶需要版本控制并且不支持排除文件夹。
使用带有
--exclude-folders
选项的mc version enable
命令来从版本控制中排除名称以/
结尾的对象mc version enable --exclude-folders ALIAS/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 控制台管理存储桶的更多信息,请参阅 存储桶。
使用 mc version suspend
命令在现有存储桶上启用版本控制
mc version suspend ALIAS/BUCKET
在暂停版本控制时创建的对象将分配一个 null
版本 ID。在暂停版本控制期间对对象的任何更改都会导致覆盖该 null
版本控制对象。MinIO 不会在暂停版本控制时删除或以其他方式更改现有版本控制对象。客户端可以继续与存储桶中的任何现有对象版本交互。