Milvus CDC
Milvus CDC(变更数据捕获)可将数据变更从一个 Milvus 集群复制到另一个 Milvus 集群。您可以使用 CDC 为 Milvus 构建主-备灾难恢复拓扑。
在主-备拓扑中,一个集群作为主集群,负责处理写入操作。一个或多个备用集群会持续接收来自主集群的变更,并可处理读取流量。当主集群不可用或需要维护时,您可以将服务流量切换到备用集群。
架构
典型的拓扑结构包含:
- 主集群:复制的源集群。它接受读写操作。
- 备用集群:复制的目标集群。它接收来自主集群的变更,在保持备用状态期间为只读模式。
- CDC 节点:Milvus 的一个组件,用于将当前主集群的 WAL 变更转发至备集群。请在每个可能在切换或故障转移后成为主集群的集群上部署 CDC。
- 复制拓扑:配置好的源到目标的关系,例如集群-a -> 集群-b。
下图展示了该拓扑结构。
CDC 工作流
支持的拓扑结构
最常见的 CDC 部署模式是一主一备:
Application writes
|
v
Primary cluster A -- CDC replication --> Standby cluster B
Milvus CDC 还支持单主、多备拓扑:
Primary cluster A -- CDC replication --> Standby cluster B
\-- CDC replication --> Standby cluster C
Milvus CDC 不支持多主或主动-主动部署,即两个或多个集群同时接受写入流量的部署模式。
主节点与备用节点的行为
| 角色 | 读取 | 写入 | 复制行为 |
|---|---|---|---|
| 主节点 | 是 | 是 | 将变更发送至备用集群 |
| 备集群 | 是 | 否 | 从主集群接收复制的变更 |
备用集群会拒绝直接写入请求。这可防止“脑裂”现象,并保持复制拓扑的一致性。
计划切换与故障转移
Milvus CDC 提供了两种将服务流量从当前主集群迁移至备用集群的方式。
| 操作 | 适用场景 | 数据丢失 | 预期行为 |
|---|---|---|---|
| 切换 | 当前主节点仍可访问,或您正在进行计划内维护 | RPO = 0 | 在角色切换前等待剩余的复制数据 |
| 故障转移 | 当前主节点不可用且无法快速恢复 | 可能 | 立即提升待机节点,以便恢复写入操作 |
只要当前主节点仍能响应,就使用切换操作。仅当恢复可用性比等待原始主节点更重要时,才使用故障转移。
CDC 延迟及其重要性
CDC 延迟是指已写入主集群但尚未应用到备用集群的数据量。
CDC 延迟会影响以下两种恢复选项:
- 在切换过程中,较小的 CDC 延迟通常意味着操作完成得更快。
- 在故障转移期间,CDC 延迟代表了如果原始主集群不可用时可能丢失的数据窗口。
您应持续监控 CDC 延迟,并将其控制在尽可能低的水平。《设置 CDC 复制》页面中提供了一个用于估算 CDC 延迟的 PromQL 示例。
CDC 复制中的批量导入
在 CDC 复制拓扑中,批量导入必须使用两阶段提交 (2PC) 模式,并启用auto_commit=false 。仅在主集群上运行导入和提交操作,并确保主集群和备用集群均可访问导入文件。有关详细信息,请参阅《CDC 复制中的批量导入》。
限制
Milvus CDC 目前存在以下限制:
- 仅支持单主节点拓扑。
- 不支持主动-主动(active-active)或多主写入。
- 备用集群可以处理读取流量,但在保持备用状态期间会拒绝直接写入。
- 故障转移可能会丢失那些已写入旧主节点但尚未复制到备节点的数据。
- 配置的
pchannels必须与每个集群的实际通道布局相匹配。
常见问题
备用集群可以处理查询吗?
可以。备用集群可以处理读取流量。在成为主集群之前,它无法接受写入操作。
Milvus CDC 是否支持主动-主动写入?
不支持。Milvus CDC 专为单主节点拓扑设计。同时向多个集群写入数据可能会导致“脑裂”和数据不一致。
切换过程中会丢失数据吗?
不会。切换操作会在待机集群成为主集群之前,等待剩余数据完成复制。
故障转移会导致数据丢失吗?
可能会丢失。任何写入旧主节点但尚未复制到备节点的数据都可能丢失。
故障转移期间可能丢失多少数据?
潜在的数据丢失量取决于主服务器不可用时 CDC 的延迟。