【向量数据库】Milvus:为大规模、高性能而生的企业级向量数据库

发布时间:2026/6/11 9:27:24
【向量数据库】Milvus:为大规模、高性能而生的企业级向量数据库
Milvus为大规模、高性能而生的企业级向量数据库Milvus为大规模、高性能而生的企业级向量数据库一、亿级向量的主流方案二、Milvus原理与基础2.1 Milvus 解决了什么问题2.2 整体架构四层分离的设计哲学2.3 数据组织Collection → Partition → Segment2.4 索引原理三种主流 ANN 索引2.4.1 IVFInverted File—— 基于聚类的倒排2.4.2 HNSWHierarchical Navigable Small World—— 基于图的导航2.4.3 ANNOY —— 基于树的分割2.5 一致性与隔离级别三、方案与对比3.1 ChromaDB vs Milvus何时升级3.2 索引类型选型四、实战步骤4.1 step 1部署模式选择4.2 step 2关键代码Python SDK4.3 step 3插入与检索4.4 step 4关键配置生产避坑4.5 step 5验证手段五、总结系列导航参考资料Milvus为大规模、高性能而生的企业级向量数据库当向量规模从百万级迈向十亿级单机数据库的内存装不下、CPU 算不动会成为第一个拦路虎。一、亿级向量的主流方案让我们从问题出发1、我们要在十亿级别的商品向量里为一个用户实时找出最相似的 100 个商品这个方法最关键的部分是什么最关键的部分是分布式架构 高效索引。十亿向量无法装入单机内存必须把数据切片到多台机器与此同时要在毫秒级返回结果必须借助近似最近邻ANN索引。2、当流量从 1k QPS 涨到 100k QPS 时向量检索服务如何不被打垮需要计算与存储分离 多副本 一致性可调。在请求高峰时扩出更多 QueryNode 处理查询请求而数据本身只需在多个副本间复制即可。3、当某个查询节点宕机时正在处理的请求怎么办数据会不会丢需要故障转移 多副本机制。Milvus 通过 etcd 做服务发现、K8s 调度 健康检查做故障转移、Pulsar/Kafka 做写入恢复保证节点宕机不影响查询和数据不丢。在实际生产中向量数据规模往往远超预期电商商品、日志、文档、图片、用户行为每一类动辄千万起步。当我们把 ChromaDB 这类轻量库用到一定规模时“插入变慢”“查询超时”内存爆掉会接踵而来。Milvus 正是为这种场景而生的解决方案。官方文档https://milvus.io/docs/zh/overview.md二、Milvus原理与基础Milvus 是由 Zilliz 公司创建并贡献给 LF AI Data 基金会的开源向量数据库。它的设计目标非常明确处理十亿乃至万亿级向量、毫秒级响应、企业级可靠性。要理解这三点我们先从架构开始拆解。2.1 Milvus 解决了什么问题大规模向量数据的存储和检索当数据量达到数十亿甚至更多时单节点数据库会遇到性能瓶颈。Milvus 采用分布式架构可以将计算和存储资源分开并根据需求进行水平扩展从而轻松应对海量数据的挑战。高并发和低延迟的查询需求对于需要同时处理成千上万用户请求的在线服务例如电商的推荐系统Milvus 能够通过其分布式的特性保证在高并发下依然有非常低的查询延迟。企业级的可靠性和高级功能Milvus 提供了数据备份、数据副本、故障转移和可调的一致性级别等高级功能确保了生产环境下的高可用性和数据可靠性。2.2 整体架构四层分离的设计哲学Milvus 自 2.0 之后采用了存算分离的微服务架构。理解这张图是后续做容量规划、问题排查的前提。┌─────────────────────────────────────────────────────┐ │ Access Layer接入层 │ │ - Proxy无状态网关负责请求路由、鉴权、限流 │ ├─────────────────────────────────────────────────────┤ │ Coordinator Service协调层 │ │ - Root Coord管理集合Collection元数据 │ │ - Query Coord管理查询节点、负载均衡、Segment 分配 │ │ - Data Coord管理数据节点、数据写入、Compaction │ │ - Index Coord管理索引构建任务 │ ├─────────────────────────────────────────────────────┤ │ Worker Node执行层 │ │ - QueryNode执行向量检索与标量过滤 │ │ - DataNode处理写入、构建日志索引 │ │ - IndexNode异步构建向量索引 │ ├─────────────────────────────────────────────────────┤ │ Storage Layer存储层 │ │ - Meta Store (etcd)元数据 │ │ - Log Broker (Pulsar/Kafka)写入日志 │ │ - Object Storage (S3/MinIO)向量与索引的持久化 │ └─────────────────────────────────────────────────────┘我们来逐层解读这张图接入层是无状态的 Proxy可以无限水平扩展——这是应对百万 QPS 的关键。协调层是大脑4 个 Coord 各司其职通过 etcd 选主。etcd 挂了整个集群就瘫了所以生产环境必须部署 3 节点 etcd 集群。执行层做实际工作。QueryNode 和 DataNode 也是无状态的K8s 拉起 / 杀掉的代价很低。存储层用对象存储S3/MinIO存真正的向量数据。这与 Elasticsearch 的设计哲学类似——让内存和 CPU 去服务查询磁盘做冷数据兜底。注意Milvus 的存算分离不是为了分离而分离而是因为向量检索的查询负载计算密集和写入负载IO 密集特征完全不同。把它们解耦后扩缩容策略可以独立设计。2.3 数据组织Collection → Partition → SegmentMilvus 把数据组织成三层结构这是排查为什么查得慢为什么插入卡住的基础。层级概念作用类比Collection业务表一类向量的容器如product_embeddings关系数据库的 TablePartition分区按业务维度切分数据如按时间/类别分区表Segment段物理存储单元达到阈值后封存、构建索引LSM-Tree 的 SSTable关键认知数据写入时进入Growing Segment内存中暂不建索引以加速写入。Growing Segment 达到阈值默认 512MB后封存为Sealed Segment异步构建索引。Sealed Segment 不可变只能在后台做Compaction合并小段和Index Rebuild重建索引。这就是为什么 Milvus 写入后立即查询可能会比较慢——数据还在 Growing Segment 里走暴力扫描。生产环境通常会预热force flush或容忍短暂的查询不全。2.4 索引原理三种主流 ANN 索引向量检索的核心是近似最近邻Approximate Nearest Neighbor, ANN算法。Milvus 支持多种索引我们重点看三类。2.4.1 IVFInverted File—— 基于聚类的倒排三步法理解 IVF_FLATstep 1聚类——用 K-Means 把所有向量聚成 nlist 个簇每个簇有一个中心点。step 2分配——每个向量归属到距离最近的簇记录我属于哪个簇。step 3检索——查询时先找最近的 nprobe 个簇只在这些簇的向量里做精确距离计算跳过其余向量。查询向量 → 计算到 nlist 个簇心的距离 → 选最近的 nprobe 个簇nprobe nlist → 只在这 nprobe 个簇里做精确 KNNnlist 与 nprobe 是关键参数nlist 越大 → 簇越多 → 单簇越小 → 检索越快但召回率可能下降nprobe 越大 → 扫描的簇越多 → 召回率越高但延迟增加2.4.2 HNSWHierarchical Navigable Small World—— 基于图的导航HNSW 是当前最流行的图索引可以理解为向量世界的跳表。核心思想构建一张多层图每层的节点是向量的子集层数越高节点越稀疏。查询时从最稀疏的顶层开始每层贪心搜索找到局部最近点然后下钻到下一层继续搜索。Layer 2: [A] ------------------------------ [Z] ← 顶层导航 Layer 1: [A] --- [M] --- [R] --- [Z] ← 中层粗定位 Layer 0: [A][B][C] ... [M][N][O] ... [Z] ← 底层精确搜索优势查询速度极快O(log N)召回率高。劣势构建慢、内存占用大需把图全装入内存。2.4.3 ANNOY —— 基于树的分割ANNOY 用多棵随机二叉树把空间切分查询时在每棵树里找最近点后聚合。Milvus 已逐步弃用 ANNOY实际生产推荐 HNSW 或 IVF。2.5 一致性与隔离级别Milvus 的分布式不是主从复制那么简单它在写入可见性上提供四种一致性级别——这是面试常考点。级别含义延迟一致性Strong能读到最新写入高强Session同一会话内保证单调读中中Bounded容忍短暂延迟默认低弱Eventually最终一致极低最弱默认是Boundedbounded_staleness5s平衡了一致性与延迟。强一致必然牺牲性能——这与 CAP 定理一脉相承。三、方案与对比3.1 ChromaDB vs Milvus何时升级前面文章我们讨论了 ChromaDB 的轻量与易用。那么问题来了什么时候必须升级到 Milvus让我们用一个对比表回答。特性ChromaDBMilvus核心优势简洁易用、开发速度快高性能、高可扩展、功能丰富架构单体架构可嵌入式运行分布式架构计算存储分离数据规模适合百万级向量适合十亿级甚至万亿级向量延迟百万级毫秒级毫秒级延迟十亿级不支持 / 性能崩溃仍可保持毫秒~十毫秒级适用场景快速原型验证、中小项目、个人开发企业级应用、大规模推荐系统、搜索引擎部署复杂度一行pip install即可需 Docker Compose / K8s 部署多个组件运维成本几乎为零需要运维 etcd / MinIO / Pulsar 等依赖索引类型默认 HNSW固定IVF / HNSW / PQ / DiskANN 等 10 种多租户隔离不支持支持 Partition / Database 隔离混合查询弱标量过滤 向量检索 全文检索2.4选型有立场百万级以内、原型验证、学习阶段→ 选ChromaDB一行命令启动5 分钟跑通 RAG。千万到亿级、追求功能丰富但不想自建→ 选Zilliz CloudMilvus 云服务免运维按量付费。十亿级以上、金融级可靠性要求、有 K8s 团队→ 选Milvus 自建集群可控性最强。为什么 ChromaDB 撑不住十亿级因为它把向量全装进内存并用单进程做检索。十亿 768 维 float32 向量 ≈ 3TB 内存单机物理极限就过不去。Milvus 用磁盘 内存分层 分布式把内存装不下的问题转化成了我可以横向扩。3.2 索引类型选型确定用 Milvus 后下一个关键决策是选哪种索引。这是性能调优的第一颗扣子。索引类型构建速度查询速度召回率内存占用适用场景FLAT暴力极快慢100%高基线测试、10w 向量IVF_FLAT中中95%中百万级、平衡场景IVF_PQ中快90%低压缩内存紧张、十亿级HNSW慢极快98%极高低延迟、高召回场景DISKANN中中95%极低超大规模、SSD 充足选型有立场追求极致召回率、不在乎内存→ 选HNSWM16, efConstruction200 是常用起点。内存有限、规模上亿→ 选IVF_PQPQ 压缩能把内存降一个数量级。数据量超 10 亿 SSD 充足→ 选DISKANN把索引放磁盘内存只放热数据。实际生产中召回率是底线——90% 召回率在 RAG 场景下意味着 10% 的查询会找不到正确答案这种损失往往是业务不可接受的。先用 FLAT 跑基线召回率再压索引。四、实战步骤下面我们一起从零跑通一个 Milvus 集群。虽然不能贴完整可运行项目避免长代码淹没主线但关键步骤和踩过的坑会一一标注。4.1 step 1部署模式选择Milvus 提供三种部署模式对应不同的场景模式适用阶段组件数一句话Milvus Lite本地开发、学习1Pythonpip install milvus-lite嵌入式Standalone中小规模生产1 进程含所有组件Docker Compose 一键起Cluster大规模生产多个微服务K8s Helm Chart 部署推荐路径本地用 Lite 验证 → 小流量用 Standalone → 流量上量后切 Cluster。三者使用相同的 SDK迁移成本几乎为零。4.2 step 2关键代码Python SDK以下是连接 Milvus、创建 Collection、插入数据、检索的核心代码骨架。重点看注释里的坑。frompymilvusimportMilvusClient,DataType# 1. 连接注意MilvusClient 是新版 SDK旧版用 connections.connect()clientMilvusClient(urihttp://localhost:19530)# 2. 创建 Collectionschemaclient.create_schema(auto_idFalse,# 手动指定主键便于幂等enable_dynamic_fieldTrue# 允许未定义的字段调试期好用生产建议关)schema.add_field(field_nameid,datatypeDataType.INT64,is_primaryTrue)schema.add_field(field_namevector,datatypeDataType.FLOAT_VECTOR,dim768)schema.add_field(field_namecategory,datatypeDataType.VARCHAR,max_length64)# 3. 配置索引关键metric_type 与算法强相关index_paramsclient.prepare_index_params()index_params.add_index(field_namevector,index_typeHNSW,# 索引类型metric_typeCOSINE,# 距离度量欧氏/内积/余弦params{M:16,efConstruction:200}# HNSW 参数)client.create_collection(collection_nameproduct_emb,schemaschema,index_paramsindex_params,consistency_levelBounded# 默认级别平衡性能与一致性)我们来逐段解读这段代码enable_dynamic_fieldTrue允许插入未在 schema 中定义的字段。生产环境务必关闭——一旦打开相当于把字段约束这一数据质量护栏拆了。metric_type是最容易踩坑的地方归一化后的 embedding如 BGE、OpenAI→ 用IP内积或COSINE余弦未归一化的特征向量 → 用L2欧氏距离混用会导致召回率莫名其妙地低而且代码不会报错。consistency_levelBounded是默认选项。如果你要做插入后立即查询如 RAG 的实时数据入库改用Strong否则可能查到旧数据。4.3 step 3插入与检索# 插入注意HNSW 不支持实时构建索引数据会先进 Growing Segmentdata[{id:1,vector:[...],category:phone},{id:2,vector:[...],category:laptop},]client.insert(collection_nameproduct_emb,datadata)# 检索 标量过滤混合查询是 Milvus 的杀手锏resultsclient.search(collection_nameproduct_emb,data[query_vector],# 查询向量filtercategory phone,# 标量过滤limit10,output_fields[id,category],# 返回字段search_params{ef:100}# HNSW 检索参数)关键点解读filter参数支持类 SQL 表达式,in,,and这是 ChromaDB 做不到的。生产中在某个分类下找相似商品这类业务非常依赖它。search_params{ef: 100}控制 HNSW 检索时的图遍历深度。ef 越大召回越高、延迟也越大生产环境建议从ef64起步压测。首次插入后立即 search 可能数据不全因为 Growing Segment 还没被检索调度加载到 QueryNode。可用client.flush()强制封存生产慎用会卡写入。4.4 step 4关键配置生产避坑配置项推荐值含义踩坑提醒queryNode.replicas2-3查询节点副本数副本越多查询并发越高但内存翻倍dataCoord.segment.maxSize512MBSegment 封存阈值太小会增加 Compaction 频率太大会拖慢查询queryNode.segcore.mmap.enabletrue亿级以上启用 mmap 内存映射节省内存但首次查询会触发缺页中断index.params.M16HNSW 每节点连接数M 越大召回越高、内存越大index.params.efConstruction200HNSW 构建时搜索深度越大索引质量越好、构建越慢quotaConfig.middle.*Protection.enabledtrue内存/磁盘保护防止 OOM 但会拒绝写入提醒以上参数都不是越大越好。生产调优一定要带召回率 延迟 内存三维监控做 trade-off单维压测会骗自己。4.5 step 5验证手段完成部署后做三个最小验证健康检查curl http://host:9091/healthz返回 200 → 组件就绪。写入验证insert一批数据 →query主键能查到 → 通过。召回率验证用 FLAT 索引100% 召回跑一遍测试集记录 top-K 结果再用 HNSW 跑同样的测试集召回率 ≥ 95%方可上线。反直觉点HNSW 索引参数在数据量翻倍后需要重新调优。M、efConstruction、ef 都不是一调永逸的参数。五、总结让我们把核心结论提炼成三条Milvus 的本质是分布式 存算分离 多索引可插拔。理解了四层架构和三段式数据组织排查任何问题都有据可循。ChromaDB 适合原型Milvus 适合生产。当数据量从百万迈向十亿、QPS 从百迈向十万Milvus 几乎是国内中大厂的标准答案。Milvus 不是装上就能用。索引选型、一致性级别、参数调优、Compaction 策略共同决定生产表现。强烈建议先用 Milvus Lite 跑通再上 Standalone最后切 Cluster。适用边界✅ 适合RAG 知识库、大规模推荐、图像/视频检索、广告投放、人脸识别⚠️ 谨慎 10w 向量的轻量场景ChromaDB 更经济❌ 不适合纯事务型业务、需要强 JOIN 的关系查询用 MySQL/PostgreSQL希望这篇文章能帮你从知道 Milvus走到会用 Milvus。下一篇文章我们会一起动手搭建一个生产级的 Milvus RAG 服务把今天讲的架构、索引、参数调优全部串起来。系列导航向量数据库系列从轻量到企业级系统讲清选型与实战。第 1 篇Milvus为大规模、高性能而生的企业级向量数据库本文第 2 篇待更新…参考资料Milvus 官方文档Milvus Architecture OverviewHNSW 论文Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphsFaiss WikiProduct QuantizationDiskANN 论文DiskANNFast Accurate Billion-point Nearest Neighbor Search on a Single Node