設定 CDC 複製

本指南展示如何使用 Milvus Operator 部署兩個獨立的 Milvus 群集,並配置 CDC 從源群集複製到目標群集。

範例使用

  • source-cluster 作為主要群集。
  • target-cluster 作為備用群集。
  • milvus 作為 Milvus 叢集的命名空間。
  • milvus-operator 作為 Milvus Operator 的命名空間。

在您開始之前,請閱讀Milvus CDC以瞭解主備模式和故障移轉選項。

先決條件

  • Milvus v2.6.16 或更新版本。
  • Milvus Operator v1.3.4 或更新版本。
  • Kubernetes 叢集可用。
  • 來源集群與目標集群可透過網路相互連線。
  • 您擁有兩個 Milvus 叢集的管理認證。
  • 您知道每個群集的實體通道數量。

步驟 1:升級 Milvus Operator

新增 Milvus Operator Helm 套件庫:

helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/

更新儲存庫:

helm repo update zilliztech-milvus-operator

安裝或升級 Milvus Operator:

helm -n milvus-operator upgrade --install milvus-operator \
  zilliztech-milvus-operator/milvus-operator \
  --create-namespace

檢查 Operator Pod 是否正在執行:

kubectl get pods -n milvus-operator

範例輸出:

NAME                               READY   STATUS    RESTARTS   AGE
milvus-operator-6f7d8c9c7d-xm4tj   1/1     Running   0          54s

步驟 2:部署原始群集

建立一個名為milvus_source_cluster.yaml 的檔案:

apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: source-cluster
  namespace: milvus
  labels:
    app: milvus
spec:
  mode: standalone
  components:
    image: milvusdb/milvus:v2.6.16
    cdc:
      replicas: 1
  dependencies:
    msgStreamType: woodpecker

套用配置:

kubectl create namespace milvus
kubectl apply -f milvus_source_cluster.yaml

檢查來源群集 Pod 是否正在執行:

kubectl get pods -n milvus

範例輸出:

NAME                                                   READY   STATUS    RESTARTS   AGE
source-cluster-etcd-0                                  1/1     Running   0          3m
source-cluster-minio-6d8f7d9b9f-9t7j2                  1/1     Running   0          3m
source-cluster-milvus-standalone-7f8d9c8f6d-r2m5x      1/1     Running   0          2m
source-cluster-milvus-cdc-66d64747bd-sckxj             1/1     Running   0          2m

確保 CDC pod(如source-cluster-milvus-cdc-... )處於Running 狀態。

步驟 3:部署目標群集

建立一個名為milvus_target_cluster.yaml 的檔案:

apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: target-cluster
  namespace: milvus
  labels:
    app: milvus
spec:
  mode: standalone
  components:
    image: milvusdb/milvus:v2.6.16
    cdc:
      replicas: 1
  dependencies:
    msgStreamType: woodpecker

CDC 元件也在目標群集上啟用。當目標群集為備用時,它是閒置的,但如果目標群集之後成為切換後的主要群集,則需要它。

套用組態:

kubectl apply -f milvus_target_cluster.yaml

檢查目標群集 pod 是否正在執行:

kubectl get pods -n milvus | grep -E 'NAME|target-cluster'

範例輸出:

NAME                                                   READY   STATUS    RESTARTS   AGE
target-cluster-etcd-0                                  1/1     Running   0          3m
target-cluster-minio-5f7c8d9b6f-k8s2q                  1/1     Running   0          3m
target-cluster-milvus-standalone-66dc8d9f7f-5n6bp      1/1     Running   0          2m
target-cluster-milvus-cdc-7f8c9d6b8c-q4t9m             1/1     Running   0          2m

步驟 4:準備群集資訊

取得兩個群集的 Milvus 服務位址:

kubectl get svc -n milvus | grep -E 'NAME|source-cluster|target-cluster'

範例輸出:

NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)              AGE
source-cluster-milvus                 ClusterIP   10.98.124.90     <none>        19530/TCP,9091/TCP   8m
target-cluster-milvus                 ClusterIP   10.109.234.172   <none>        19530/TCP,9091/TCP   3m

準備兩種地址:

  • 叢集位址會寫入複製組態,並由 CDC 元件使用。這些位址必須可以從 CDC pod 達到。
  • 用戶端地址僅在呼叫 Milvus API 時被您的 Python 用戶端使用。如果您在 Kubernetes 集群之外執行 Python 用戶端,請透過正常的存取方法,例如負載平衡器、ingress 或 port-forward,來揭露 Milvus 服務。

準備兩個群集的連線資訊和 pchannel 清單:

source_cluster_addr = "http://source-cluster-milvus.milvus.svc.cluster.local:19530"
target_cluster_addr = "http://target-cluster-milvus.milvus.svc.cluster.local:19530"

source_client_addr = source_cluster_addr
target_client_addr = target_cluster_addr

# If your Python client runs outside the Kubernetes cluster, replace only
# source_client_addr and target_client_addr with externally reachable addresses.
# Keep source_cluster_addr and target_cluster_addr reachable from CDC pods.
# For example:
# source_client_addr = "http://127.0.0.1:19530"
# target_client_addr = "http://127.0.0.1:19531"

source_cluster_token = "root:Milvus"
target_cluster_token = "root:Milvus"

source_cluster_id = "source-cluster"
target_cluster_id = "target-cluster"

pchannel_num = 16
source_cluster_pchannels = [
    f"{source_cluster_id}-rootcoord-dml_{i}"
    for i in range(pchannel_num)
]
target_cluster_pchannels = [
    f"{target_cluster_id}-rootcoord-dml_{i}"
    for i in range(pchannel_num)
]

用您環境中實際的 Milvus 服務位址取代位址。不要將source_cluster_addrtarget_cluster_addr 設定為本機連接埠轉送位址,除非 CDC Pod 也可以到達該位址。pchannel 清單必須與您的 Milvus 部署相符。請勿在未檢查您的群集配置前複製範例值。

步驟 5:建立複製組態

建立從source-clustertarget-cluster 的複製組態:

replicate_config = {
    "clusters": [
        {
            "cluster_id": source_cluster_id,
            "connection_param": {
                "uri": source_cluster_addr,
                "token": source_cluster_token,
            },
            "pchannels": source_cluster_pchannels,
        },
        {
            "cluster_id": target_cluster_id,
            "connection_param": {
                "uri": target_cluster_addr,
                "token": target_cluster_token,
            },
            "pchannels": target_cluster_pchannels,
        },
    ],
    "cross_cluster_topology": [
        {
            "source_cluster_id": source_cluster_id,
            "target_cluster_id": target_cluster_id,
        }
    ],
}

步驟 6:套用複製組態

對兩個群集套用相同的組態:

from pymilvus import MilvusClient

source_client = MilvusClient(
    uri=source_client_addr,
    token=source_cluster_token,
)
target_client = MilvusClient(
    uri=target_client_addr,
    token=target_cluster_token,
)

try:
    source_client.update_replicate_configuration(**replicate_config)
    target_client.update_replicate_configuration(**replicate_config)
finally:
    source_client.close()
    target_client.close()

對於生產自動化,請使用獨立的短暫用戶端進行此控制平面作業。這可避免在群集角色變更時,與應用程式 DML 流量共用相同的 gRPC 通道。

套用組態後,寫入source-cluster 的變更會複製到target-cluster

步驟 7:驗證資料複製

驗證複製是否正常運作:

  1. 連接至source-cluster
  2. 建立集合。
  3. 將資料插入資料集中。
  4. 載入資料集,並在source-cluster 上執行查詢或搜尋。
  5. 連接至target-cluster
  6. target-cluster 上執行相同的查詢或搜尋,但不在備用群集上手動載入資料集。
  7. 確認預期的資料在兩個群集上都可見。

目標群集是此拓樸中的備用群集。請勿在備用群集上執行手動 DDL 或 DCL 作業,例如load_collection 。這些作業應該在來源群集上執行,並複製到目標群集。

確切的驗證碼取決於您的收集模式。有關基本的 Milvus 收集工作流程,請參閱 Milvus 快速入門文件。

CDC 滯後期

CDC 滯後是主要群集和備用群集之間的資料視窗。配置複製後,您應持續監控它。

CDC 滯後會在下列情況下增加

  • 主要寫入速率高。
  • 群集之間的網路延遲或封包遺失增加。
  • 備用群集負載過重。
  • CDC 節點配置不足。
  • 正在執行大型 DDL 或匯入作業。

使用 CDC 滯後指導作業決策:

  • 如果滯後時間短,切換應該會更快完成。
  • 如果滯後時間較長,故障轉換可能會遺失更多資料。

您可以使用下列 PromQL 查詢估算 CDC 滯後時間:

clamp_min(
  max by (channel_name) (
    milvus_wal_last_confirmed_time_tick
  )
  -
  min by (channel_name) (
    milvus_cdc_last_replicated_time_tick
  ),
  0
)

結果以秒為單位。對於每個來源通道,查詢會比較最新確認的 WAL 時間指標和 CDC 複製的最後時間指標。如果主複製到多個備用群集,min by (channel_name) 表達式會報告該通道最慢的複製進度。

如果 Prometheus 掃描多個 Milvus 集群,請新增符合您部署的標籤篩選器,例如namespaceapp_kubernetes_io_instance ,以避免混合來自不同集群的指標。

常見問題

我需要在兩個集群上呼叫update_replicate_configuration 嗎?

是的。請將相同的拓樸套用至所有參與的群集。如果其中一個群集在呼叫時不是主要群集,則會等到透過 CDC 套用拓樸後再呼叫。

我應該如何選擇cluster_id

為每個群集使用穩定、唯一的 ID。ID 也用於 pchannel 名稱和複製拓樸參照。

複製配置完成後,我可以變更 pchannel 嗎?

您可以更新拓扑,但 pchannel 列表必须与群集布局相匹配。請將 pchannel 變更視為進階作業,並在完成後仔細驗證複製。