在 Pulsar 與 Woodpecker 之間切換

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

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

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

使用 Helm

從 Pulsar 切換至 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:(可選)停止 Pulsar 並進行清理。對於內建的Pulsar,請停用 Pulsar 並啟用 Woodpecker,然後刪除 Pulsar 的 PVC:

helm upgrade my-release zilliztech/milvus \
  --set image.all.tag=v3.0.0 \
  --set pulsarv3.enabled=false \
  --set woodpecker.enabled=true \
  --set streaming.enabled=true \
  --set indexNode.enabled=false
kubectl get pvc | grep my-release-pulsarv3
kubectl delete pvc <pulsar-pvc-name> ...

為外部Pulsar,請清理外部 Pulsar 實例中的 Milvus 主題。Milvus 主題格式為<cluster_prefix>-dml_<seqNo>_<TimeTick><Version> (例如:by-dev-rootcoord-dml_10_464633776992639586v0 )。

若您計劃日後切換回 Pulsar,請先清理資料/主題以避免衝突。由於 Helm 圖表的限制,目前無法切換回內建的Pulsar 實例。

從 Woodpecker 切換至 Pulsar(Helm)

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

步驟 2:配置目標 Pulsar 連線並重新啟動 Milvus。此切換操作需要 Milvus 已知曉 Pulsar 連線設定,因此請透過extraConfigFiles 將設定寫入user.yaml ,並使用helm upgrade 套用(此操作會滾動更新 Pod)。streaming.enabled=true 是「切換訊息佇列 (Switch MQ)」功能所需的設定。

# values.yaml
extraConfigFiles:
  user.yaml: |+
    pulsar:
      address: <pulsar addr>
      port: <pulsar port, e.g. 6650>
helm upgrade -i my-release zilliztech/milvus \
  --set pulsarv3.enabled=true \
  --set woodpecker.enabled=false \
  --set streaming.enabled=true \
  -f values.yaml

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

步驟 3:執行 MQ 切換。

請確保目標 Pulsar 中不包含來自先前配置的 Milvus 主題。若這是您首次切換至 Pulsar,請跳過此說明;否則請先清理同名的殘留 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": "pulsar"}'

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

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

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

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

使用 Milvus Operator

從 Pulsar 切換至 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 中的 MQ 類型。更新由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:(可選)停止 Pulsar 並進行清理。對於內建的Pulsar,請解除安裝該 Pulsar 發行版並刪除其 PVC:

helm uninstall my-release-pulsar
kubectl get pvc | grep my-release-pulsar
kubectl delete pvc <pulsar-pvc-name> ...

若為外部Pulsar,請清理 Milvus 主題(格式為<cluster_prefix>-dml_<seqNo>_<TimeTick><Version> )。

若您計劃日後切換回 Pulsar,請先清理資料/主題以避免衝突。由於 Helm 圖表的限制,目前無法切換回內建的Pulsar 實例。

從 Woodpecker 切換至 Pulsar(Milvus Operator)

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

步驟 2:設定目標 Pulsar 連線並重新啟動 Milvus。將 Pulsar 連線置於spec.config 下(Operator 會將spec.config 渲染為user.yaml ),並設定 MQ 類型;套用 CR 後,系統會根據新設定重新部署 Pod。

# change_configmap.yaml
apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:
  name: my-release
  labels:
    app: milvus
spec:
  config:
    pulsar:
      address: <pulsar addr>
      port: <pulsar port, e.g. 6650>
  dependencies:
    msgStreamType: pulsar
kubectl patch -f change_configmap.yaml --patch-file change_configmap.yaml --type merge

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

步驟 3:執行訊息佇列切換。

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

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

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

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

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

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

支援的情境

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