存储桶版本控制
概述
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
在启用版本控制之前创建的对象具有 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 不会在暂停版本控制的过程中删除或以其他方式更改现有的版本化对象。客户端可以继续与存储桶中的任何现有对象版本进行交互。