18 Milvus-Milvus集群部署

发布时间:2026/6/23 6:08:57

18 Milvus-Milvus集群部署 「milvus-course-ai.zip」链接https://pan.quark.cn/s/00f3d411bb6dgithubhttps://github.com/yuanmomoya/milvus学习目标学完本章后你应该能够理解 Milvus 分布式集群的组件拓扑。使用 Docker Compose 或 Helm 部署集群模式。配置多 QueryNode、多 DataNode 实现水平扩展。规划集群的资源分配和容量。处理集群部署中的常见问题。Standalone vs Cluster维度StandaloneCluster组件所有角色在一个进程Coord、Node 独立部署扩展性垂直扩展加 CPU/内存水平扩展加节点高可用单点故障组件级容错适用规模 2000 万向量 2000 万或高可用要求运维复杂度低高依赖etcd MinIOetcd MinIO/S3 Pulsar/Kafka集群架构基础设施SDK / 应用负载均衡Proxy 1Proxy 2RootCoordDataCoordQueryCoordIndexCoordDataNode 1DataNode 2QueryNode 1QueryNode 2QueryNode 3IndexNode 1IndexNode 2etcd 集群Pulsar / KafkaS3 / MinIO组件角色组件可扩展职责扩展场景Proxy是接入请求、路由QPS 高时加 ProxyRootCoord否单实例DDL、时间戳无需扩展DataCoord否单实例Segment 调度无需扩展QueryCoord否单实例查询调度无需扩展IndexCoord否单实例索引任务调度无需扩展DataNode是写入消费写入吞吐不足时加QueryNode是搜索执行搜索延迟高/QPS 不足时加IndexNode是索引构建索引构建慢时加Docker Compose 集群部署适合开发测试和小规模生产name:milvus-clusterservices:etcd:image:quay.io/coreos/etcd:v3.5.18command:etcd -advertise-client-urlshttp://127.0.0.1:2379 -listen-client-urlshttp://0.0.0.0:2379 --data-dir/etcdvolumes:-etcd-data:/etcdhealthcheck:test:[CMD,etcdctl,endpoint,health]interval:30stimeout:20sretries:3minio:image:minio/minio:RELEASE.2024-12-18T13-15-44Zenvironment:MINIO_ACCESS_KEY:minioadminMINIO_SECRET_KEY:minioadmincommand:minio server /minio_data--console-address :9001ports:-9000:9000-9001:9001volumes:-minio-data:/minio_datahealthcheck:test:[CMD,curl,-f,http://localhost:9000/minio/health/live]interval:30stimeout:20sretries:3pulsar:image:apachepulsar/pulsar:3.1.2command:bin/pulsar standaloneports:-6650:6650volumes:-pulsar-data:/pulsar/datahealthcheck:test:[CMD,bin/pulsar-admin,brokers,healthcheck]interval:30stimeout:20sretries:3rootcoord:image:milvusdb/milvus:v2.6.15command:[milvus,run,rootcoord]environment:milvus-envETCD_ENDPOINTS:etcd:2379MINIO_ADDRESS:minio:9000PULSAR_ADDRESS:pulsar://pulsar:6650MINIO_ACCESS_KEY:minioadminMINIO_SECRET_KEY:minioadmindepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}datacoord:image:milvusdb/milvus:v2.6.15command:[milvus,run,datacoord]environment:*milvus-envdepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}querycoord:image:milvusdb/milvus:v2.6.15command:[milvus,run,querycoord]environment:*milvus-envdepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}indexcoord:image:milvusdb/milvus:v2.6.15command:[milvus,run,indexcoord]environment:*milvus-envdepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}datanode:image:milvusdb/milvus:v2.6.15command:[milvus,run,datanode]environment:*milvus-envdepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}querynode1:image:milvusdb/milvus:v2.6.15command:[milvus,run,querynode]environment:*milvus-envdepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}querynode2:image:milvusdb/milvus:v2.6.15command:[milvus,run,querynode]environment:*milvus-envdepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}indexnode:image:milvusdb/milvus:v2.6.15command:[milvus,run,indexnode]environment:*milvus-envdepends_on:etcd:{condition:service_healthy}minio:{condition:service_healthy}pulsar:{condition:service_healthy}proxy:image:milvusdb/milvus:v2.6.15command:[milvus,run,proxy]environment:*milvus-envports:-19530:19530-9091:9091depends_on:rootcoord:{condition:service_started}datacoord:{condition:service_started}querycoord:{condition:service_started}indexcoord:{condition:service_started}volumes:etcd-data:minio-data:pulsar-data:Helm 部署Kubernetes生产环境推荐使用 Helm Chart 部署到 Kubernetes# 添加 Milvus Helm 仓库helm repoaddmilvus https://zilliztech.github.io/milvus-helm/ helm repo update# 安装集群模式helminstallmilvus milvus/milvus\--setcluster.enabledtrue\--setqueryNode.replicas3\--setdataNode.replicas2\--setindexNode.replicas2\--setproxy.replicas2\-nmilvus --create-namespace自定义 values.yamlcluster:enabled:truequeryNode:replicas:3resources:requests:memory:8Gicpu:4limits:memory:16Gicpu:8dataNode:replicas:2resources:requests:memory:4Gicpu:2indexNode:replicas:2resources:requests:memory:8Gicpu:4proxy:replicas:2resources:requests:memory:2Gicpu:2etcd:replicaCount:3persistence:size:10Giminio:mode:distributedreplicas:4persistence:size:100Gipulsar:enabled:true# 或使用 Kafka# kafka:# enabled: true资源规划QueryNode 内存规划QueryNode 需要加载索引和向量到内存单个 QueryNode 内存 ≈ 总数据内存 / QueryNode 数量 × 副本数 示例 - 1000 万条 × 768 维 × HNSW(M16) ≈ 31 GB - 3 个 QueryNode1 副本每个 ~10.3 GB - 3 个 QueryNode2 副本每个 ~20.6 GB各组件资源建议组件CPU内存磁盘数量Proxy2-4 核2-4 GB无2按 QPSQueryNode4-8 核8-32 GBSSDmmap 时按数据量DataNode2-4 核4-8 GB无2按写入量IndexNode4-8 核8-16 GBSSD临时1-2Coord 系列1-2 核2-4 GB无各 1etcd2 核4 GBSSD 10-50 GB3高可用Pulsar/Kafka4 核8 GBSSD 50-200 GB3MinIO/S32 核4 GBHDD/SSD4分布式扩缩容水平扩展 QueryNode当搜索延迟增加或 QPS 不足时# Helm 扩容helm upgrade milvus milvus/milvus--setqueryNode.replicas5-nmilvus# Docker Compose 扩容添加新的 querynode 服务dockercompose up-d--scalequerynode4QueryCoord 会自动将 Segment 重新分配到新的 QueryNode。扩展 DataNode当写入吞吐不足时helm upgrade milvus milvus/milvus--setdataNode.replicas4-nmilvus扩展 IndexNode当索引构建积压时helm upgrade milvus milvus/milvus--setindexNode.replicas4-nmilvus消息队列选择消息队列优点缺点适用场景PulsarMilvus 默认支持功能完整部署复杂资源占用大生产集群Kafka生态成熟运维经验多需要额外配置已有 Kafka 集群RocksMQ内嵌无需额外部署不支持集群模式仅 Standalone集群健康检查# 检查所有组件状态kubectl get pods-nmilvus# 检查 Milvus 健康curlhttp://proxy-ip:9091/healthz# 查看组件日志kubectl logs-fdeployment/milvus-proxy-nmilvus kubectl logs-fdeployment/milvus-querynode-nmilvus# 查看 QueryNode 负载分布# 通过 Prometheus 指标观察各 QueryNode 的 Segment 数量和内存使用常见错误现象原因修复Proxy 启动失败Coord 组件未就绪检查 Coord 日志确认 etcd 连接QueryNode OOM数据量超过单节点内存增加 QueryNode 数量或开启 mmap写入延迟高Pulsar 积压检查 Pulsar 健康增加 DataNode索引构建慢IndexNode 资源不足增加 IndexNode 或增大 CPUetcd 空间不足元数据过多执行 etcd compaction增大 quota搜索结果不一致Segment 正在迁移等待 QueryCoord 完成 balance面试题Standalone 和 Cluster 的核心区别是什么Standalone 所有角色在一个进程共享内存用 RocksMQ 做消息队列。Cluster 各角色独立部署通过 Pulsar/Kafka 通信可以独立扩缩容。为什么 Coord 组件不需要多副本Coord 是调度器不处理数据面流量。它的负载很轻单实例足够。高可用通过 etcd 选主实现——Coord 挂了会自动重新选主恢复。增加 QueryNode 后搜索性能一定会提升吗不一定。如果瓶颈在网络、Proxy 或索引参数加 QueryNode 无效。只有当 QueryNode CPU/内存是瓶颈时水平扩展才有效。集群模式为什么需要 Pulsar/Kafka集群中 DataNode 和 QueryNode 是独立进程需要通过消息队列传递写入日志。Standalone 用进程内的 RocksMQ 就够了。如何判断需要从 Standalone 升级到 Cluster当出现以下情况单机内存不够加载所有数据、需要高可用不能单点故障、写入吞吐需要水平扩展、搜索 QPS 超过单机上限。练习题Docker Compose 集群使用本章的 docker-compose 文件启动集群模式验证写入和搜索正常工作。QueryNode 扩容启动 2 个 QueryNode 的集群写入 10 万条数据。然后增加到 4 个 QueryNode观察 Segment 重新分配过程。故障模拟停止一个 QueryNodedocker stop观察搜索是否仍然正常QueryCoord 应该将 Segment 迁移到其他节点。资源监控使用docker stats观察集群各组件的 CPU 和内存使用写入和搜索时分别观察哪个组件负载最高。小结Milvus 集群部署的核心是理解哪些组件可以水平扩展Proxy、QueryNode、DataNode、IndexNode以及何时需要扩展。QueryNode 决定搜索能力DataNode 决定写入能力IndexNode 决定索引构建速度。生产环境推荐 Helm Kubernetes 部署配合监控和自动扩缩容。

相关新闻