对象删除
概述
此页面总结了 DELETE
操作如何影响对象,具体取决于包含该对象的存储桶的配置。
以下任何因素的组合都可能影响 DELETE
操作的功能
权限
MinIO 使用 基于策略的访问控制 系统进行访问管理。用户或服务帐户必须提供正确的策略操作和条件才能允许对存储桶和对象的 DELETE
操作。
未版本化的对象
在对未启用版本控制的存储桶中的对象执行 DELETE
操作时,操作很简单。在验证用户或服务帐户有权执行 DELETE
操作后,MinIO 会永久删除该对象。
请求删除操作的用户或服务帐户必须对存储桶和对象具有 s3:DeleteObject
操作权限。
已版本化的对象
当对象已版本化时,DELETE
操作的工作方式有所不同。
用户或服务帐户必须对存储桶和对象具有 s3:DeleteObjectVersion
操作权限。
对当前版本的删除操作
对版本化对象执行DELETE
操作且未指定版本 UUID,会导致创建一个DeleteMarker
,并将其放置为对象的head
。
在这种情况下,MinIO 不会实际从磁盘中删除对象或其任何版本。所有现有版本的该对象都仍然可以通过指定版本的 UUID 来访问。当DeleteMarker
成为对象的头部时,MinIO 不会为未指定版本 ID 的GET
请求提供服务。相反,MinIO 会返回类似404
的响应。
您可以使用mc ls --versions
找到对象版本的 UUID。
要从驱动器中删除对象的当前版本,请查找该版本的 UUID,然后使用mc rm --version-id=UUID ...
删除当前版本。在这种情况下,对象的紧前版本将成为对象的当前版本,并为未指定 UUID 的对象的GET
请求提供服务。
警告
在 DELETE 操作中指定version-id
是不可逆的。MinIO 会从驱动器中删除指定的版本,并且**无法**检索它。
先前版本的删除操作
要删除对象的先前版本,请指定该版本的 UUID。您可以使用mc ls --versions
检索版本 UUID。当DELETE
请求指定version-id
并且用户具有删除对象版本的正确权限时,MinIO 会永久从驱动器中删除指定的版本。
警告
在 DELETE 操作中指定version-id
是不可逆的。MinIO 会从驱动器中删除指定的版本,并且**无法**检索它。
删除所有版本
使用mc rm --versions
删除对象的所有版本。此操作不可逆。
生命周期管理过期
您可以定义一个或多个生命周期管理过期规则,以便在达到一定版本号或经过一定时间后使对象过期。当版本数量超过规则指定的数量,或某个版本的日期早于指定日期时,MinIO 会永久从驱动器中删除该对象版本。
这些规则依赖于扫描程序来处理存储桶上的规则。扫描程序作为一个低优先级的持续进程运行,其中READ
和WRITE
操作优先。因此,满足过期条件的对象版本可能不会立即从 MinIO 中删除。
有关扫描程序的工作原理和配置选项的更多详细信息,请参阅扫描程序页面。
DeleteMarkers
本身就是对象。生命周期规则可以删除作为其对象唯一剩余版本的DeleteMarkers
。
MinIO 版本变更: RELEASE.2024-05-01T01-11-10Z
使用JSON
,生命周期规则可以在指定天数后删除已删除对象的所有版本。
保留的对象
MinIO 会保护受锁定规则影响的对象,防止其被覆盖或删除。这些规则要求对象必须保留,直到规则过期或被移除。
对锁定对象执行DELETE
操作且未指定版本,会导致为该对象创建一个DeleteMarker。但是,对象版本本身会根据锁的要求保留。
指定对象版本的DELETE
操作受保留规则约束。MinIO 会保护受锁影响的对象版本,防止其被覆盖或删除,直到锁过期或被移除。
复制的对象
复制会将对象从一个位置复制到另一个位置。MinIO 支持在存储桶级别或集群(“站点”)级别进行复制。
删除操作可能会或可能不会进行复制,具体取决于复制类型和复制配置方式。
站点复制
对于启用了多站点复制的集群,MinIO 会将对任何集群执行的所有delete
操作复制到对等组中的每个其他集群。
任何单个对等节点上的删除行为都遵循与任何 MinIO 部署相同的流程。
存储桶复制
使用存储桶复制,MinIO 支持在源存储桶和配置的远程存储桶之间复制删除操作。MinIO 会同步删除特定对象版本以及新的删除标记。删除操作复制使用与所有其他复制操作相同的复制流程。
MinIO 要求显式启用版本化删除和删除标记复制。使用mc replicate add --replicate
字段分别指定delete
和delete-marker
或两者,以启用版本化删除和删除标记复制。要同时启用两者,请使用逗号分隔符指定这两个字符串:delete,delete-marker
。
对于删除标记复制,MinIO 会在删除操作创建删除标记后开始复制过程。MinIO 使用X-Minio-Replication-DeleteMarker-Status
元数据字段来跟踪删除标记复制状态。在主动-主动复制配置中,如果两个集群同时为某个对象创建删除标记或如果一个或两个集群在复制事件同步之前处于关闭状态,则 MinIO 可能会生成重复的删除标记。
对于复制特定对象版本的删除,MinIO 会将该对象版本标记为PENDING
,直到复制完成。远程目标删除该对象版本后,MinIO 会删除源上的该对象版本。虽然此过程可确保版本删除近乎同步,但它可能会导致列出操作在初始删除操作后返回该对象版本。MinIO 使用X-Minio-Replication-Delete-Status
来跟踪删除版本复制状态。
MinIO 仅复制显式客户端驱动的删除操作。MinIO 不会复制由生命周期管理过期规则删除的对象。对于主动-主动配置,请在所有复制存储桶上设置相同的过期规则,以确保对象过期的一致应用。
MinIO 修剪源和远程存储桶上的空对象前缀
如果删除操作删除了存储桶前缀中的最后一个对象,MinIO 会递归删除前缀的每个空部分,直到存储桶根目录。MinIO 仅将递归删除应用于作为对象写入操作的一部分隐式创建的前缀。MinIO 不会递归删除使用显式目录创建命令(例如mc mb
)创建的前缀。
如果复制规则启用了复制删除操作,则复制过程也会在目标 MinIO 集群上应用隐式前缀修剪行为。
例如,考虑一个名为photos
的存储桶,其中包含以下对象前缀
photos/2021/january/myphoto.jpg
//2021/january/
根据对象名称隐式创建photos/2021/february/myotherphoto.jpg
//2021/february/
根据对象名称隐式创建photos/NYE21/NewYears.jpg
//NYE21/
在存储桶中显式创建
photos/NYE21
是使用mc mb
显式创建的唯一前缀。所有其他前缀都是作为写入位于该前缀的对象的一部分隐式创建的。
某个命令删除了
myphoto.jpg
。MinIO 会自动修剪空/january/
前缀。某个命令随后删除了
myotherphoto.jpg
。MinIO 会自动修剪/february/
前缀以及现在为空的/2021
前缀。某个命令删除了
NewYears.jpg
对象。MinIO 会保留/NYE21/
前缀,因为它是由显式创建的。