桶复制
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
命令在 Bucket 层级运行,**不支持**前缀级别的粒度。对大型 Bucket 发起重新同步可能会导致复制相关的负载和流量显著增加。请谨慎使用此命令,并且仅在必要时使用。
对于配置了 对象转换(分层) 的 Bucket,复制重新同步会将对象恢复为非转换状态,并且不包含关联的转换元数据。因此,之前转换到远程存储的任何数据都将永久与远程 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 **不**复制因应用 生命周期管理过期规则 而删除的对象。对于 主动-主动 配置,请在*所有*复制 Bucket 上设置相同的过期规则,以确保一致地应用对象过期。
MinIO 在源和远程 Bucket 上修剪空对象前缀
如果删除操作删除了 Bucket 前缀中的最后一个对象,则 MinIO 会递归删除前缀直至 Bucket 根目录的每个空部分。MinIO 仅将递归删除应用于作为对象写入操作*隐式*创建的前缀,即,前缀不是使用显式目录创建命令(例如 mc mb
)创建的。
如果复制规则启用了复制删除操作,则复制过程也将在目标 MinIO 集群上应用隐式前缀修剪行为。
例如,考虑一个名为 photos
的 Bucket,其中包含以下对象前缀
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 会将源 Bucket 中的现有对象复制到配置的远程存储,类似于 AWS:在 S3 Bucket 之间复制现有对象,无需联系技术支持的额外开销。
MinIO 将满足复制规则的所有对象或对象前缀标记为可同步到远程集群和 Bucket。MinIO 仅排除那些没有版本 ID 的对象,例如在启用 Bucket 版本控制之前写入的对象。
您可以在配置或修改 Bucket 复制规则时禁用现有对象复制。您必须在创建或修改期间指定*所有*所需的复制功能。
对于新的复制规则,请从指定给
mc replicate add --replicate
的复制功能列表中排除"existing-objects"
。对于现有的复制规则,请使用
mc replicate update --replicate
从现有复制功能列表中删除"existing-objects"
。新规则将**替换**之前的规则。
禁用现有对象复制不会删除已复制到远程 Bucket 的任何对象。
同步与异步复制
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
元数据字段
复制状态 |
描述 |
---|---|
|
对象尚未复制。如果对象满足 Bucket 上配置的复制规则之一,MinIO 会应用此状态。MinIO 不断扫描尚未进入复制队列的 对于多站点复制,对象将保持在 |
|
对象已成功复制到远程集群。 |
|
对象复制到远程集群失败。 MinIO 持续扫描尚未进入复制队列的 |
|
对象本身是从远程源复制的副本。 |
复制过程通常具有以下流程之一
PENDING -> COMPLETED
PENDING -> FAILED -> COMPLETED