在 Kafka 與 Woodpecker 之間切換

本頁面說明如何將Milvus 叢集的訊息佇列 (MQ) 在Kafka(內建或外部)與Woodpecker(MinIO 後端)之間進行雙向切換。有關一般工作流程與先決條件,請參閱《切換訊息佇列》

先決條件:MQ 切換功能僅適用於Milvus 3.0 及後續版本。開始操作前,請將您的 Milvus 實例升級至 Milvus 3.0 或後續版本——此功能在較早版本中不可用。

切換訊息佇列是一項高風險操作。請選擇與您的部署方式相符的章節 —「使用 Helm」或「使用 Milvus Operator」— 並依序從頭至尾執行。請勿混用 Helm 與 Operator 指令。

使用 Helm

從 Kafka 切換至 Woodpecker(Helm)

步驟 1:確認 Milvus 實例正在運行。確保您的 Milvus 叢集運作正常 —— 例如,建立測試集合、插入資料並執行查詢。

步驟 2:執行訊息佇列切換。公開 MixCoord 管理介面,然後呼叫切換 API:

kubectl port-forward --address 0.0.0.0 service/my-release-milvus-mixcoord 29091:9091

在另一個終端機中:

curl -X POST http://127.0.0.1:29091/management/wal/alter \
  -H "Content-Type: application/json" \
  -d '{"target_wal_name": "woodpecker"}'

步驟 3:驗證切換是否完成。

kubectl logs <mixcoord-pod> | grep "successfully updated mq.type configuration in etcd"

若切換成功,系統會記錄[mqTypeValue=woodpecker]

步驟 4:(可選)停止 Kafka 並進行清理。對於內建的Kafka,請移除 Kafka Pod 及其 PVC。對於外部Kafka,請清理外部 Kafka 實例中的 Milvus 主題 — 這些主題的格式為<cluster_prefix>-dml_<seqNo>_<TimeTick><Version>

若您計劃日後切換回 Kafka,請先清理資料/主題以避免衝突。

從 Woodpecker 切換至 Kafka(Helm)

步驟 1:確認 Milvus 實例正在運行。

步驟 2:設定目標 Kafka 連線並重新啟動 Milvus。此切換操作需要 Milvus 已知曉 Kafka 連線設定,因此請透過 `extraConfigFiles ` 將其寫入 `user.yaml `,並使用 `helm upgrade ` 套用設定(此操作會重啟 Pod)。`streaming.enabled=true ` 是「切換訊息佇列 (Switch MQ)」功能所需的設定。有關 SASL/SSL 的詳細資訊,請參閱《使用 SASL/SSL 連線至 Kafka》

# values.yaml
extraConfigFiles:
  user.yaml: |+
    kafka:
      brokerList:
        - <your_kafka_address>:<your_kafka_port>
      saslUsername:
      saslPassword:
      saslMechanisms: PLAIN
      securityProtocol: SASL_SSL
helm upgrade -i my-release zilliztech/milvus \
  --set kafka.enabled=true \
  --set woodpecker.enabled=false \
  --set streaming.enabled=true \
  -f values.yaml

請等待所有 Pod 準備就緒,然後確認 Kafka 存取設定已套用至 Milvus 設定中。

步驟 3:執行 MQ 切換。

請確保目標 Kafka 中不包含來自先前設定的 Milvus 主題。若這是您首次切換至 Kafka,請跳過此說明;否則請先清理名稱相同的殘留 Milvus 主題。

kubectl port-forward --address 0.0.0.0 service/my-release-milvus-mixcoord 29091:9091

在另一個終端機中:

curl -X POST http://127.0.0.1:29091/management/wal/alter \
  -H "Content-Type: application/json" \
  -d '{"target_wal_name": "kafka"}'

步驟 4:驗證切換是否完成。

kubectl logs <mixcoord-pod> | grep "successfully updated mq.type configuration in etcd"

若切換成功,系統會記錄[mqTypeValue=kafka]

步驟 5:(可選)清理 Woodpecker 資料。刪除 MinIO/S3 上的 Woodpecker 資料(位於<rootPath>/wp/... 目錄下,通常為files/wp/... )以及 etcd 中的 Woodpecker 元資料(etcdctl get woodpecker --prefix )。若您計劃日後切換回 Woodpecker,請先清理這些檔案。

使用 Milvus Operator

從 Kafka 切換至 Woodpecker(Milvus Operator)

步驟 1:確認 Milvus 實例正在執行。

步驟 2:執行 MQ 切換。由於 MixCoord 服務未對外公開,因此請從 MixCoord pod 內部執行切換 API:

kubectl exec -it <mixcoord-pod> -- \
  curl -X POST http://localhost:9091/management/wal/alter \
  -H "Content-Type: application/json" \
  -d '{"target_wal_name": "woodpecker"}'

步驟 3:驗證切換是否完成。

kubectl logs <mixcoord-pod> | grep "successfully updated mq.type configuration in etcd"

切換成功時會記錄[mqTypeValue=woodpecker]

步驟 4:更新 Operator 中的訊息佇列類型。更新由Operator管理的配置,以防止 Operator 將切換操作還原。建立change_configmap.yaml

apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: my-release
  labels:
    app: milvus
spec:
  dependencies:
    msgStreamType: woodpecker
kubectl patch -f change_configmap.yaml --patch-file change_configmap.yaml --type merge

步驟 5:(可選)停止 Kafka 並進行清理。對於內建的Kafka,請移除 Kafka Pod 及其 PVC。對於外部Kafka,請清理 Milvus 主題(格式為<cluster_prefix>-dml_<seqNo>_<TimeTick><Version> )。

從 Woodpecker 切換至 Kafka(Milvus Operator)

步驟 1:確認 Milvus 實例正在執行。

步驟 2:設定目標 Kafka 連線並重新啟動 Milvus。將 Kafka 連線置於spec.config 下(Operator 會將spec.config 渲染為user.yaml ),並設定 MQ 類型;套用 CR 後,系統會根據新設定重新部署 Pod。有關 SASL/SSL 的詳細資訊,請參閱《使用 SASL/SSL 連線至 Kafka》

# change_configmap.yaml
apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: my-release
  labels:
    app: milvus
spec:
  config:
    kafka:
      brokerList:
        - <your_kafka_address>:<your_kafka_port>
      saslUsername:
      saslPassword:
      saslMechanisms: PLAIN
      securityProtocol: SASL_SSL
  dependencies:
    msgStreamType: kafka
kubectl patch -f change_configmap.yaml --patch-file change_configmap.yaml --type merge

等待所有 Pod 準備就緒後,確認 Kafka 存取設定已渲染至 Milvus 設定中。

步驟 3:執行 MQ 切換。

請確保目標 Kafka 中不包含來自先前配置的 Milvus 主題。若這是您首次切換至 Kafka,請跳過此注意事項;否則,請先清理同名的殘留 Milvus 主題。

kubectl exec -it <mixcoord-pod> -- \
  curl -X POST http://localhost:9091/management/wal/alter \
  -H "Content-Type: application/json" \
  -d '{"target_wal_name": "kafka"}'

步驟 4:驗證切換是否完成。

kubectl logs <mixcoord-pod> | grep "successfully updated mq.type configuration in etcd"

若切換成功,系統會記錄[mqTypeValue=kafka]

步驟 5:(可選)清理 Woodpecker 資料。刪除 MinIO/S3 上的 Woodpecker 資料(位於<rootPath>/wp/... 目錄下,通常為files/wp/... )以及 etcd 中的 Woodpecker 元資料(etcdctl get woodpecker --prefix )。若您計劃日後切換回 Woodpecker,請先清理這些檔案。

支援的情境

來源 MQ目標 MQHelmMilvus Operator
內建 KafkaWoodpecker (MinIO)已支援已支援
外部 KafkaWoodpecker (MinIO)已支援受支援
Woodpecker (MinIO)外部 Kafka已支援受支援
KafkaWoodpecker(本地)受支援但不建議使用(所有 Pod 都需要共用檔案系統)不支援