存储桶复制
MinIO 支持在源存储桶和目标存储桶之间进行服务器端和客户端对象复制。
- 服务器端存储桶复制
为自动同步 MinIO 部署之间的对象配置每个存储桶规则。您配置存储桶复制规则的部署充当“源”,而配置的远程部署充当“目标”。MinIO 在对象写入操作(例如
PUT
)期间应用规则,并自动同步新对象和对象变动,例如新对象版本或对象元数据的更改。MinIO 服务器端存储桶复制仅支持在相同版本的远程复制目标上运行的 MinIO 集群。
- 客户端存储桶复制
使用命令流程来同步同一 S3 兼容集群中的存储桶或两个独立的 S3 兼容集群之间的对象。使用
mc mirror
进行的客户端复制支持 MinIO 到 S3 和类似的复制配置。
存储桶与站点复制
存储桶复制与 站点复制 不同且相互排斥。
存储桶复制在存储桶级别同步数据,例如存储桶前缀路径和对象。
您可以在任何时间配置存储桶复制,而远程 MinIO 部署可能在复制目标存储桶上具有预先存在的数据。
站点复制将存储桶复制扩展到包括 IAM、安全令牌、访问密钥和存储桶级别配置。
站点复制通常在最初部署 MinIO 对等站点时配置。在初始配置时,只有一个站点可以容纳任何存储桶或对象。
服务器端存储桶复制
MinIO 服务器端存储桶复制是一种自动的存储桶级别配置,它会在源存储桶和目标存储桶之间同步对象。MinIO 服务器端复制要求源存储桶和目标存储桶是两个独立的 MinIO 集群,运行着相同的 MinIO Server 版本。
对于每个写入到存储桶的操作,MinIO 会检查存储桶的所有已配置的复制规则,并应用优先级最高的匹配规则。MinIO 会同步新对象*以及*对象变动,例如新的对象版本或对象元数据的更改。这包括元数据操作,例如启用或修改对象锁定或保留设置。
MinIO 服务器端存储桶复制在功能上类似于 Amazon S3 复制,同时还添加了以下 MinIO 独有的功能
源存储桶和目标存储桶名称可以匹配,支持站点到站点的用例,例如 Splunk 或 Veeam BC/DR。
比 S3 存储桶复制配置更简单的实现,无需配置 AccessControlTranslation、Metrics 和 SourceSelectionCriteria 等设置。
源存储桶和目标存储桶之间对象的活动-活动(双向)复制。
三个或更多个 MinIO 部署之间对象的跨站点复制
重新同步(灾难恢复)
重新同步主要支持在复制配置中使用健康的部署在 MinIO 部署上的数据部分或全部丢失后恢复。使用mc replicate resync
命令使用指定的源存储桶完全重新同步远程目标(mc admin bucket remote
)。
重新同步过程会检查源存储桶中的所有对象,并与所有包含现有对象复制的已配置复制规则进行比较。对于每个与规则匹配的对象,重新同步过程会将对象放入复制队列中,而不管对象的当前复制状态。
MinIO 会跳过同步那些远程副本与源副本完全匹配的对象,包括对象元数据。否则,MinIO 不会优先处理或修改与目标现有内容相关的队列。
mc replicate resync
在存储桶级别运行,*不支持*前缀级别的粒度。对大型存储桶启动重新同步可能会导致与复制相关的负载和流量显著增加。谨慎使用此命令,仅在必要时使用。
对于配置了对象转换(分层)的存储桶,复制重新同步会将对象恢复为未转换状态,且不带任何关联的转换元数据。因此,以前已转换为远程存储的任何数据将永久断开与远程 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 仅将递归删除应用于作为对象写入操作的一部分*隐式*创建的前缀,也就是说,前缀不是使用显式目录创建命令(例如mc mb
)创建的。
如果复制规则启用了复制删除操作,复制过程*也会*在目标 MinIO 集群上应用隐式前缀修剪行为。
例如,考虑一个存储桶photos
,它具有以下对象前缀
photos/2021/january/myphoto.jpg
photos/2021/february/myotherphoto.jpg
photos/NYE21/NewYears.jpg
photos/NYE21
是使用mc mb
*显式*创建的*唯一*前缀。所有其他前缀都是作为写入位于该前缀下的对象的一部分*隐式*创建的。
一条命令删除了
myphoto.jpg
。MinIO 会自动修剪空的/janaury
前缀。然后,一条命令删除了
myotherphoto.jpg
。MinIO 会自动修剪/february
前缀*以及*现在为空的/2021
前缀。一条命令删除了
NewYears.jpg
对象。MinIO 会保留/NYE21
前缀,因为它已*显式*创建。
现有对象的复制
默认情况下,MinIO 会将源存储桶中的现有对象复制到配置的远程存储桶中,类似于AWS:在 S3 存储桶之间复制现有对象,但无需与技术支持联系即可完成。
MinIO 会将所有满足复制规则的对象或对象前缀标记为有资格同步到远程集群和存储桶。MinIO 仅会排除那些没有版本 ID 的对象,例如在启用存储桶的版本控制之前写入的那些对象。
在配置或修改存储桶复制规则时,可以禁用现有对象复制。在创建或修改过程中,必须指定*所有*所需的复制功能
对于新的复制规则,请从
mc replicate add --replicate
中指定的复制功能列表中排除"existing-objects"
。对于现有的复制规则,使用
mc replicate update --replicate
从现有复制功能列表中删除"existing-objects"
。新规则会**替换**之前的规则。
禁用现有对象复制不会删除已复制到远程存储桶的任何对象。
同步复制与异步复制
MinIO 支持为给定的远程目标指定异步(默认)复制或同步复制。
对于异步复制,MinIO 会在将对象放入复制队列之前完成原始的PUT
操作。因此,原始客户端可能会在对象被复制之前看到成功的PUT
操作。虽然这可能会导致远程位置的对象陈旧或丢失,但它可以减轻由于复制负载导致的写入操作缓慢的风险。
对于同步复制,MinIO 会尝试在完成原始的PUT
操作之前复制对象。无论复制尝试是否成功,MinIO 都会返回成功的PUT
操作。这可以减少写入操作缓慢的风险,但可能会导致远程位置的对象陈旧或丢失。
在使用 mc admin bucket remote add
命令配置远程目标时,必须显式启用同步复制,并使用 add
标志。
复制内部机制
本节介绍复制内部行为,对于使用或实现复制并不重要。本文档仅供学习和教育目的提供。
复制流程
MinIO 使用一个复制排队系统,该系统有多个并发复制工作进程在队列上运行。MinIO 不断努力从队列中复制和删除对象,同时扫描新的未复制对象以添加到队列中。
在版本 RELEASE.2022-07-18T17-49-40Z 中更改: MinIO 将失败的复制操作排队,并最多重试三次 (3 次) 这些操作。
MinIO 会将三次尝试后仍无法复制的复制操作出队。扫描程序可以在以后的时间内拾取这些受影响的对象,并将其重新排队以进行复制。
在版本 RELEASE.2022-08-11T04-37-28Z 中更改: 在执行列表或任何 GET
或 HEAD
API 方法时,失败或待处理的复制操作会自动重新排队。例如,使用 mc stat
、mc cat
或 mc ls
,在远程位置恢复联机后,重新排队复制。
MinIO 根据对象的复制状态设置 X-Amz-Replication-Status
元数据字段。
复制状态 |
描述 |
---|---|
|
对象尚未复制。如果对象符合桶上的已配置复制规则之一,MinIO 会应用此状态。MinIO 不断扫描尚未在复制队列中的 对于多站点复制,对象将保持在 |
|
对象已成功复制到远程集群。 |
|
对象无法复制到远程集群。 MinIO 不断扫描尚未在复制队列中的 |
|
对象本身是来自远程来源的副本。 |
复制过程通常具有以下流程之一
PENDING -> COMPLETED
PENDING -> FAILED -> COMPLETED