設定 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_addr 或target_cluster_addr 設定為本機連接埠轉送位址,除非 CDC Pod 也可以到達該位址。pchannel 清單必須與您的 Milvus 部署相符。請勿在未檢查您的群集配置前複製範例值。
步驟 5:建立複製組態
建立從source-cluster 到target-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:驗證資料複製
驗證複製是否正常運作:
- 連接至
source-cluster。 - 建立集合。
- 將資料插入資料集中。
- 載入資料集,並在
source-cluster上執行查詢或搜尋。 - 連接至
target-cluster。 - 在
target-cluster上執行相同的查詢或搜尋,但不在備用群集上手動載入資料集。 - 確認預期的資料在兩個群集上都可見。
目標群集是此拓樸中的備用群集。請勿在備用群集上執行手動 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 集群,請新增符合您部署的標籤篩選器,例如namespace 或app_kubernetes_io_instance ,以避免混合來自不同集群的指標。
常見問題
我需要在兩個集群上呼叫update_replicate_configuration 嗎?
是的。請將相同的拓樸套用至所有參與的群集。如果其中一個群集在呼叫時不是主要群集,則會等到透過 CDC 套用拓樸後再呼叫。
我應該如何選擇cluster_id ?
為每個群集使用穩定、唯一的 ID。ID 也用於 pchannel 名稱和複製拓樸參照。
複製配置完成後,我可以變更 pchannel 嗎?
您可以更新拓扑,但 pchannel 列表必须与群集布局相匹配。請將 pchannel 變更視為進階作業,並在完成後仔細驗證複製。