向量数据库实战:选型、调优与落地~系列文章16:Milvus 分布式部署实战

发布时间:2026/7/23 17:43:47
向量数据库实战:选型、调优与落地~系列文章16:Milvus 分布式部署实战 Milvus 分布式部署实战从单机到集群的完整踩坑记录 ️本文是《向量数据库实战选型、调优与落地》专栏第 16 篇⏱️阅读时间约 15 分钟 开篇什么时候需要分布式单机 Milvus 的极限指标单机极限数据量~5000 万条受内存限制QPS~5000取决于硬件可用性单点故障当你的需求超过这些数字时就必须上分布式了数据量 5000 万条QPS 5000需要高可用不能宕机需要在线扩缩容️ Milvus 分布式架构┌─────────────────────────────────────────────────────────────┐ │ Milvus Cluster 架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 接入层Access Layer │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ Proxy 1 │ │ Proxy 2 │ │ Proxy 3 │ ← 负载均衡 │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌───────────┬───────────┼───────────┬───────────┐ │ │ ▼ ▼ ▼ ▼ ▼ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐ │ │ │Query │ │Data │ │Index │ │Coord │ │ etcd │ │ │ │Node │ │Node │ │Node │ │ZK │ │ (元数据) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │搜索执行│ │数据管理│ │索引构建│ │调度协调│ │ 3节点集群 │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────────┘ │ │ │ │ │ ┌──────────┐ │ │ │ MinIO │ │ │ │ (对象存储) │ │ │ └──────────┘ │ │ │ │ 各组件均可独立扩缩容 │ │ │ └─────────────────────────────────────────────────────────────┘四大组件组件职责扩缩容建议Proxy接入层处理客户端请求按 QPS 扩通常 2-5 个Query Node执行搜索查询按数据量和 QPS 扩Data Node管理数据写入和持久化按写入 QPS 扩Index Node构建向量索引按索引构建需求扩️ Kubernetes 部署推荐Step 1安装 Milvus Operator# 添加 Helm 仓库helm repoaddmilvus https://zilliztech.github.io/milvus-helm/ helm repo update# 安装 Milvus Operatorkubectl apply-fhttps://raw.githubusercontent.com/milvus-io/milvus-operator/main/deploy/manifests/deployment.yamlStep 2部署 Milvus Cluster# milvus-cluster.yamlapiVersion:milvus.io/v1beta1kind:Milvusmetadata:name:my-milvusspec:mode:clusterconfig:dataNode:concurrency:4queryNode:scheduler:cpuRatio:0.9components:proxy:replicas:2resources:limits:cpu:2memory:4GiqueryNode:replicas:3resources:limits:cpu:4memory:16GidataNode:replicas:2resources:limits:cpu:2memory:8GiindexNode:replicas:2resources:limits:cpu:4memory:8Gidependencies:etcd:replicas:3minio:replicas:3pulsar:replicas:3# 部署kubectl apply-fmilvus-cluster.yaml# 查看状态kubectl get milvus my-milvus集群资源估算数据量Query NodeData NodeIndex Node总内存100 万2×8GB2×4GB2×4GB~32GB1000 万3×16GB3×8GB2×8GB~104GB5000 万5×32GB5×16GB3×16GB~368GB1 亿8×64GB8×32GB4×32GB~960GB⚙️ 关键配置调优消息队列选择消息队列优点缺点推荐场景Pulsar功能全多层存储资源消耗大生产推荐Kafka生态好性能高需要自己运维已有 Kafka 的团队Rockemq轻量功能较少小规模集群负载均衡策略# Proxy 层负载均衡配置proxy:maxTaskNum:1024# 最大并发任务数timeTickInterval:200# 时间戳间隔(ms)# 前端 Nginx 负载均衡upstream milvus_proxy{least_conn;# 最少连接数策略server proxy-1:19530; server proxy-2:19530; server proxy-3:19530;} 分布式性能实测测试环境K8s 集群6 节点1 亿条 1024 维向量配置QPSP50 延迟P99 延迟召回率单机128GB32005.2ms12ms96.8%集群3 Query85004.8ms10ms96.8%集群5 Query140004.5ms9ms96.8%集群8 Query180004.2ms8ms96.8%关键发现Query Node 数量与 QPS 近似线性关系延迟几乎不随节点增加而增加召回率保持一致⚠️ 踩坑记录坑 1etcd 磁盘 IO 瓶颈问题etcd 对磁盘 IO 非常敏感慢磁盘会导致整个集群不稳定 解决etcd 必须用 SSD推荐 NVMe坑 2Segment 数量过多问题大量小 Segment 导致查询性能下降 解决 - 批量写入每次 1000 条 - 定期 compaction - 监控 segment 数量坑 3内存 OOM问题Query Node 加载数据时 OOM 解决 - 合理估算内存需求 - 配置 loadMemoryLimit - 使用分段加载策略坑 4索引构建阻塞查询问题大量数据写入后索引构建占用资源导致查询变慢 解决 - Index Node 独立部署 - 配置索引构建的资源限制 - 错峰构建索引 本篇核心要点回顾要点说明何时上分布式数据量5000万 或 QPS5000推荐部署方式Kubernetes Milvus Operator核心组件Proxy/Query/Data/Index Node消息队列生产推荐 Pulsar关键坑etcd 用 SSD、批量写入、内存估算下篇预告《向量数据库性能调优索引参数、batch_size、并发数的黄金配置 ⚙️》有问题欢迎评论区讨论觉得有用请点赞收藏 作者高炉炼铁智能化技术研究者专注钢铁冶金与人工智能 交叉领域。 如果觉得有帮助请点赞、收藏、转发版权归作者所有未经许可请勿抄袭套用商用(或其它具有利益性行为)。 关注专栏不错过后续精彩内容

相关新闻

最新新闻

日新闻

周新闻

月新闻