存储桶版本控制
概述
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 对象过期。
您也可以使用以下命令手动删除对象版本。
mc rm --versions
- 删除对象的全部版本。mc rm --versions --older-than
-删除比指定日历日期更早的所有对象版本。
New in version RELEASE.2024-04-18T19-09-19Z: 如果任何单个对象版本的累积大小超过 1TiB,MinIO 会发出警告。
版本 ID 生成
MinIO 为每个版本控制的对象生成一个唯一且不可变的标识符,作为写入操作的一部分。每个对象版本 ID 包含一个 128 位固定大小的UUIDv4。UUID 生成足够随机,以确保任何环境中都极有可能具有唯一性,难以通过计算猜测,并且不需要集中式注册流程和授权来保证唯一性。
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
或版本化对象进行操作。
使用
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
命令并提供更新的列表。 新的前缀列表将替换之前的列表。
要查看当前被排除的前缀,请使用 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 客户端 从版本控制中排除文件夹。
对象锁定
启用了 对象锁定 的存储桶需要版本控制,并且不支持排除文件夹。
使用
mc version enable
命令并添加--exclude-folders
选项,以从版本控制中排除以/
结尾的对象。mc version enable --exclude-folders 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 控制台管理存储桶的更多信息,请参阅 存储桶。
使用 mc version suspend
命令在现有存储桶上启用版本控制。
mc version suspend ALIAS/BUCKET
暂停版本控制期间创建的对象将被分配一个 null
版本 ID。 暂停版本控制期间对对象的任何修改都会导致覆盖该 null
版本的对象。 MinIO 不会作为暂停版本控制的一部分删除或以其他方式更改现有版本的对象。 客户端可以继续与存储桶中的任何现有对象版本进行交互。