在 Kafka 和 Woodpecker 之间切换
本页面介绍如何在Milvus 集群中将消息队列 (MQ) 在Kafka(内置或外部)和Woodpecker(MinIO 后端)之间双向切换。有关一般工作流和先决条件,请参阅《切换消息队列》。
先决条件:切换消息队列功能仅在Milvus 3.0 及更高版本中提供。开始操作前,请将您的 Milvus 实例升级至 Milvus 3.0 或更高版本——此功能在早期版本中不可用。
切换消息队列是一项高风险操作。请选择与您的部署方式相匹配的章节——使用 Helm 或使用 Milvus Operator——并按顺序从头到尾操作。请勿混合使用 Helm 和 Operator 命令。
使用 Helm
从 Kafka 切换到 Woodpecker(Helm)
步骤 1:验证 Milvus 实例是否正在运行。确保您的 Milvus 集群运行正常——例如,通过创建测试 Collection、插入数据并执行查询来验证。
步骤 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:更新操作符中的 MQ 类型。更新操作符管理的配置,以防止操作符撤销此次切换。创建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 下(操作符会将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 | 目标 MQ | Helm | Milvus Operator |
|---|---|---|---|
| 内置 Kafka | Woodpecker (MinIO) | 已支持 | 已支持 |
| 外部 Kafka | Woodpecker (MinIO) | 已支持 | 已支持 |
| Woodpecker (MinIO) | 外部 Kafka | 已支持 | 已支持 |
| Kafka | Woodpecker(本地) | 支持但不推荐(所有 Pod 都需要共享文件系统) | 不支持 |