故障移轉

當原始主機完全不可用時,故障移轉會將備用群集升級為獨立的主機。這是可用性第一的作業,可能會遺失故障前未複製的資料。

本指南假設原始拓樸是:

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()

調整集合名稱和模式欄位,以符合您的部署。

驗證結果

直接驗證已升級的群集:

  • cluster-b 上寫入成功。
  • 讀取返回預期的資料。
  • 沒有應用程式元件寫入cluster-a

處理舊的 Primary

故障移轉後,請將cluster-a 視為過時。如果可以再次連線,請勿向其傳送應用程式寫入內容。它可能包含從未複製到cluster-b 的資料,而cluster-b 可能已經包含故障移轉後的新寫入。

請勿自動將cluster-a 重新連接到舊拓樸。重新引入舊的主要資料是一項獨立的復原工作,必須仔細規劃。

最小化資料遺失

您無法消除故障移轉造成的所有資料遺失風險,但您可以降低風險:

  • 持續監控 CDC 滯後情況。
  • 保持備用群集的配置,以處理主寫入速率。
  • 保持較低的跨群集網路延遲和封包遺失。
  • 讓應用程式寫入具有惰性。
  • 在故障轉換後,重試不確定是否成功的寫入。
  • 只要主機仍能回應,就優先進行切換。

常見問題

故障移轉是否總會遺失資料?

不會,但有可能。如果所有寫入在主機故障前已經複製,就不會遺失資料。如果 CDC 存在滯後情況,則滯後的資料可能會遺失。

故障移轉需要多長時間?

通常在幾秒鐘內完成,這取決於群集狀態和備用伺服器上控制平面的可用性。

我可以在主機上執行故障移轉嗎?

故障移轉適用於備用群集。如果目前的主機可用,請使用切換。

舊的主機可以自動重新加入嗎?

不可以。故障移轉後,舊的主機必須視為陳舊,並在再次參與複製之前退役或重建。

如何避免腦部分裂?

確保只有已升級的群集才會接收寫入。在舊的主機可以復原並接受流量之前,將它從所有寫入路徑中移除。