Bucket Versioning
概述
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 Object Expiration如需 更多信息。
您也可以使用以下命令手动删除对象版本:
mc rm --versions- 删除对象的所有版本。mc rm --versions --older-than-删除指定日历日期之前的所有对象版本。
版本 RELEASE.2024-04-18T19-09-19Z 中的新功能:如果任何单个对象的版本累计大小超过1TiB,MinIO会发出警告。
版本ID生成
MinIO 为每个版本化对象生成一个唯一且不可变的标识符作为写入操作的一部分。每个对象版本 ID 由 128 位固定大小组成UUIDv4UUID生成具有足够的随机性,能确保在任何环境下都具有很高的唯一性概率,在计算上难以被猜测,且无需通过集中式注册流程和权威机构来保证唯一性。
MinIO 不支持客户端管理的版本 ID 分配。所有版本 ID 生成均由 MinIO 服务器进程处理。
对于在版本控制被禁用或暂停期间创建的对象,MinIO
使用一个null版本ID。您可以通过指定这些版本来访问或删除这些对象。null作为 S3 操作中的版本 ID。
版本化删除操作
执行一个DELETE对版本化对象的操作会创建一个0字节的DeleteMarker作为该对象的最新版本。
对于最新版本为DeleteMarker客户端必须指定版本控制标志或标识符才能执行GET/HEAD/LIST/DELETE对该对象的先前版本的操作。
默认服务器行为会省略DeleteMarker在无版本操作中排除对象考虑。
MinIO 可以充分利用生命周期管理过期规则自动永久移除版本化对象。
否则,请使用手动方式DELETE永久删除非当前版本对象的操作或DeleteMarkerobjects.
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 控制台启用版本控制,MinIOmcCLI,或
使用兼容 S3 的 SDK。
使用mc version enable在现有存储桶上启用版本控制的命令:
mc version enable ALIAS/BUCKET
替换
ALIAS随着alias已配置的 MinIO 部署。替换
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 or _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排除名称以指定后缀结尾的对象的选项/from versioning: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 随时暂停存储桶版本控制。mcCLI 或使用 S3 兼容的 SDK。
使用mc version suspend在现有存储桶上启用版本控制的命令:
mc version suspend ALIAS/BUCKET
替换
ALIAS随着alias已配置的 MinIO 部署。替换
BUCKET随着target bucket要禁用版本控制的
版本控制暂停期间创建的对象被分配一个null 版本 ID在版本控制暂停期间对对象进行的任何修改都会导致该对象被覆盖null版本化对象。
MinIO 在暂停版本控制时不会删除或以其他方式更改现有的版本化对象。
客户端可以继续与存储桶中的任何现有对象版本进行交互。