故障转移

当原主集群完全不可用时,故障转移会将备用集群升级为独立的主集群。这是一种可用性优先的操作符,可能会丢失故障前未复制的数据。

本指南假定原始拓扑结构是:

cluster-a (primary)  ->  cluster-b (standby)

故障转移后,cluster-b 成为独立的主节点:

cluster-b (primary)

何时使用故障转移

仅在以下情况下使用故障转移

  • 原主设备无法响应请求。
  • 主节点无法在可接受的时间内恢复。
  • 恢复写可用性比等待旧主节点更重要。

如果主服务器仍然可以访问,请使用切换。切换可避免数据丢失。

数据丢失风险

故障切换不会等待原主设备。任何写入旧主设备但尚未复制到备用设备的数据都可能丢失。

可能的数据丢失由主用不可用时的 CDC 滞后决定。

在运行故障转移之前,请了解其中的利弊得失:

目标切换故障切换
在主服务器不可用时恢复写入
避免数据丢失不保证
需要旧主设备响应

开始之前

确认以下内容:

  • 原主机不可用。
  • 您已决定不等待主系统恢复。
  • 应用程序流量可以重定向到备用。
  • 如果主用恢复,流量自动化将不会将写入发送回旧主用。
  • 您拥有备用群集 ID、地址、令牌和 pchannels。

最重要的安全要求是防止大脑分裂。故障切换后,只有已升级的备用群集才能接受应用程序写入。

构建故障切换配置

构建一个只包含备用群集而不包含复制拓扑的配置。设置force_promote=True

# If you followed Set Up CDC Replication, cluster B is the original target cluster.
cluster_b_id = target_cluster_id
cluster_b_addr = target_cluster_addr
cluster_b_client_addr = target_client_addr
cluster_b_token = target_cluster_token
cluster_b_pchannels = target_cluster_pchannels

failover_config = {
    "clusters": [
        {
            "cluster_id": cluster_b_id,
            "connection_param": {
                "uri": cluster_b_addr,
                "token": cluster_b_token,
            },
            "pchannels": cluster_b_pchannels,
        }
    ],
    "cross_cluster_topology": [],
    "force_promote": True,
}

升级备用

向备用群集发送请求。

from pymilvus import MilvusClient

client_b = MilvusClient(uri=cluster_b_client_addr, token=cluster_b_token)

try:
    client_b.update_replicate_configuration(**failover_config)
finally:
    client_b.close()

如果请求成功,cluster-b 将成为独立的主服务器,并可接受写入。

重定向应用程序流量

升级后:

  1. 将写流量重定向到cluster-b
  2. 从写入端点、负载平衡器、DNS 记录和自动化中删除cluster-a
  3. 验证cluster-b 是否接受写入。
  4. 保持cluster-a 隔离,直至其退役或明确重建。

写入验证示例:

client_b = MilvusClient(uri=cluster_b_client_addr, token=cluster_b_token)

try:
    client_b.insert(
        collection_name="test_collection",
        data=[{"id": 1, "vector": [0.1] * 128}],
    )
finally:
    client_b.close()

调整 Collections 名称和 Schema 字段以匹配您的部署。

验证结果

直接验证已推广的群集:

  • cluster-b 上写入成功。
  • 读取返回预期数据。
  • 没有应用程序组件写入cluster-a

处理旧主集群

故障转移后,将cluster-a 视为过时。如果可以再次访问,请勿向其发送应用程序写入内容。它可能包含从未复制到cluster-b 的数据,而cluster-b 可能已经包含故障切换后的新写入。

不要将cluster-a 自动重新连接到旧拓扑。重新引入旧的主服务器是一项单独的恢复任务,必须仔细规划。

尽量减少数据丢失

您无法消除故障转移带来的所有数据丢失风险,但可以降低风险:

  • 持续监控 CDC 滞后。
  • 保持备用群集的配置,以处理主写入率。
  • 保持较低的跨群集网络延迟和数据包丢失。
  • 使应用程序写入具有惰性。
  • 在故障切换后重试成功率不确定的写入。
  • 只要主集群仍能响应,就优先进行切换。

常见问题

故障切换是否总是会丢失数据?

不会,但有可能。如果在主系统故障前所有写入都已复制,则不会丢失数据。如果 CDC 存在滞后,滞后数据可能会丢失。

故障转移需要多长时间?

通常在几秒钟内完成,具体取决于群集状态和备用机上控制平面的可用性。

能否在主服务器上运行故障切换?

故障转移适用于备用群集。如果当前主服务器可用,请使用切换。

旧主集群能否自动重新加入?

不能。故障切换后,旧主集群必须被视为过时集群并退出运行或重建,然后才能再次参与复制。

如何避免大脑分裂?

确保只有被升级的群集才能接收写入。在旧主节点恢复并接受流量之前,将其从所有写入路径中移除。