桶版本控制
概述
MinIO支持在单个存储桶中保存对象的多个”版本”。
启用后,版本管理允许MinIO保留同一对象的多次迭代。 通常会覆盖现有对象的写操作,会导致创建新的版本对象。 MinIO的版本管理可以防止意外覆盖和删除,同时提供了”撤销”写操作的支持。 配置桶版本控制是一个必备条件 对象锁定和保留规则 .
对于有版本控制的桶,修改一个对象的写操作会导致该对象产生一个具有唯一版本 ID 的新版本。 MinIO 标记客户端默认检索的对象的“最新”版本。 然后,客户端可以明确选择列出、检索或删除特定的对象版本。
定义 object expiration 规则,以删除不再需要的对象版本,例如通过版本数或版本日期。
对版本化对象的读取操作
查看此系列中的四张图片,了解 MinIO 如何在版本化存储桶中检索对象。 使用图片两侧的箭头从一个导航到下一个。
在 MinIO 版本发生变更: Server RELEASE.2023-05-04T21-44-30Z
MinIO 不会为显式目录对象的创建、修改或删除创建版本 ( prefixes
)。
在显式目录对象内创建的对象保留正常的版本行为。
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 版本加入: MinIO 如果任何单一对象的版本累积大小超过 1TiB ,则会发出警告。
版本ID生成方式
MinIO 在写入操作中为每个版本化的对象生成一个唯一 且不可变的标识符。 每个对象版本 ID 由一个 128 位的固定大小 UUIDv4 组成。UUID 生成足够随机, 以确保在任何环境中独特性的高可能性, 计算上难以猜测,并且不需要集中 的注册过程和权威机构来保证独特性。
MinIO 不支持客户端管理的版本 ID 分配。 所有版本 ID 的生成都由 MinIO 服务器进程处理。
对于在版本控制禁用或暂停时创建的对象,MinIO 使用一个 null
版本 ID。
您可以通过将 null
作为版本 ID 的一部分来访问或删除这些对象,
作为 S3 操作的一部分。
版本控制和存储容量
对版本化对象执行 DELETE
操作会创建一个 0 字节的 DeleteMarker
作为该对象的最新版本。
对于最新版本是 DeleteMarker
的对象,客户端必须指定版本控制标志或标识符,才能对对象的前一个版本执行 GET/HEAD/LIST/DELETE
操作。
默认服务器行为会将 DeleteMarker
对象从无版本操作中排除。
MinIO 可以利用 生命周期管理过期规则 来自动永久删除版本化对象。
否则,可以使用手动 DELETE
操作来永久删除非当前版本的对象或 DeleteMarker
对象。
MinIO Implements Idempotent Delete Markers
在 RELEASE.2022-08-22T23-53-06Z 版本发生变更.
标准的S3实现(如AWS S3)在处理没有版本标识的简单 DeleteObject
请求时,可以创建同一个对象的多个连续的DeleteMarker。
请参阅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
来删除对象的 所有 版本。
教程
Enable 桶版本控制
您可以通过MinIO控制台、MinIO的 mc
CLI或使用S3兼容的SDK来
启用版本控制。
在MinIO控制台中,选择 Buckets (桶)部分,以访问桶创建和管理功能。您可以使用 Search (搜索)栏来过滤列表。

每个桶行都有一个 Manage (管理)按钮,点击该按钮会打开相应桶的管理视图。

切换到 Versioning (版本控制)字段以在桶上启用版本控制。
MinIO控制台还支持在桶创建过程中启用版本控制。 有关使用MinIO控制台进行桶管理的更多信息, 请参阅 存储桶 。
使用 mc version enable
命令在现有桶上
启用版本控制:
mc version enable ALIAS/BUCKET
将
ALIAS
替换为配置好的 MinIO 部署的alias
。将
BUCKET
替换为 要启用版本控制的target bucket
。
在启用版本控制之前创建的对象具有一个
null
的 版本ID 。
将前缀从版本控制中排除
您可以使用 MinIO客户端 排除某些 前缀 免受版本控制。 这对于 Spark/Hadoop 工作负载或其他最初创建带有临时前缀的对象的情况很有用。
Replication and Object Locking Require Versioning
MinIO 要求启用版本控制以支持 复制 功能。 被排除的前缀中的对象不会复制到任何对等站点或远程站点。
MinIO 不支持在启用了 对象锁定 的桶上从版本控制中排除前缀。
使用
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"
]
}
}
要禁用前缀排除并恢复对所有前缀的版本控制,请重复执行 mc version enable
命令,但不要包含 --excluded-prefixes
选项:
mc version enable ALIAS/BUCKET
排除文件夹从版本控制中
您可以使用 :ref:`MinIO客户端 <minio-client>`来排除文件夹的版本控制。
Replication and Object Locking Require Versioning
MinIO 需要版本控制来支持 复制 功能。 在排除的文件夹中的对象不会复制到任何对等站点或远程站点。
MinIO 不支持在 启用对象锁定 的桶中排除文件夹的版本控制。
Object locking
启用对象锁定 的桶需要版本控制,并且不支持排除文件夹。
使用
mc version enable
命令并添加--exclude-folders
选项来排除以/
结尾的对象名称,使其不受版本控制:mc version enable --exclude-folders ALIAS/BUCKET
要检查某个桶中的文件夹是否已启用版本控制,请使用 mc version enable
命令并添加 --json
选项。
如果 排除文件夹
属性为 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
Suspend 桶版本控制
您可以使用MinIO控制台、MinIO的 mc
CLI或使用兼容S3的SDK
在任何时候暂停桶版本控制。
在MinIO控制台中,选择 Buckets` 部分以访问桶创建和管理功能。您可以使用 Search 栏来过滤列表。

每个桶行都有一个 Manage 按钮,点击后会打开该桶的管理视图。

选择 版本控制 字段,并按照指示暂停桶中的版本控制。
请参阅 存储桶 以获取有关使用 MinIO控制台进行桶管理的更多信息。
使用 mc version suspend
命令在现有桶上启用
版本控制:
mc version suspend ALIAS/BUCKET
将
ALIAS
替换为已配置MinIO部署的别名
。将
BUCKET
替换为 要禁用版本控制的目标桶
在版本控制暂停期间创建的对象将被分配一个 null
版本ID 。
在版本控制暂停期间,对对象的任何修改都会导致覆盖那个 null
版本的对象。
MinIO在暂停版本控制时不会删除或以其他方式修改现有版本化的对象。
客户端可以继续与存储桶中任何现有对象版本进行交互。