桶复制
MinIO 支持在源存储桶和目标存储桶之间进行对象服务器端和客户端复制。
- 服务器端桶复制
配置每个存储桶的规则,用于在 MinIO 部署之间自动同步对象。您配置桶复制规则的部署充当“源”,而配置的远程部署充当“目标”。MinIO 将规则作为对象写入操作(例如
PUT
)的一部分应用,并自动同步新对象 *和* 对象更改,例如新对象版本或对象元数据更改。MinIO 服务器端桶复制仅支持远程复制目标上相同版本的 MinIO 集群。
- 客户端桶复制
使用命令过程在同一 S3 兼容集群内的存储桶之间 *或* 两个独立的 S3 兼容集群之间同步对象。使用
mc mirror
的客户端复制支持 MinIO 到 S3 和类似的复制配置。
存储桶与站点复制
存储桶复制与 站点复制 不同且互斥。
存储桶复制在存储桶级别同步数据,例如存储桶前缀路径和对象。
您可以在任何时候配置存储桶复制,并且远程 MinIO 部署可能在复制目标存储桶上具有预先存在的数据。
站点复制扩展存储桶复制,包括 IAM、安全令牌、访问密钥和存储桶级配置。
站点复制通常在最初部署 MinIO 对等站点时进行配置。在初始配置时,只有一个站点可以持有任何存储桶或对象。
服务器端桶复制
MinIO 服务器端桶复制是一种自动的存储桶级配置,用于在源存储桶和目标存储桶之间同步对象。MinIO 服务器端复制 *要求* 源存储桶和目标存储桶是两个单独的 MinIO 集群,运行相同的 MinIO 服务器版本。
对于对存储桶的每个写入操作,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