Milvus 完整执行流程:写入、检索两大阶段拆解 目录一、前置知识二、向量数据写入 Insert 完整流程写入阶段独立 Mermaid 流程图步骤详解Step1 客户端请求与 Proxy 多层校验Step2 WAL 预写日志落地写入容错核心机制Step3 路由分发与分区分片逻辑Step4 DataNode 内存缓冲 MemTable 与活跃段Growing SegmentStep5 段 Seal 固化机制生成密封段 Sealed Segment三大固化触发条件密封段核心特性Step6 DataCoord 更新 ETCD 元数据Step7 Compaction 段合并Step8 异步离线构建向量索引三、向量相似检索 Search 完整流程检索阶段独立 Mermaid 流程图步骤详解Step1 Proxy 校验与全局元数据拉取Step2 QueryCoord 任务拆分、负载均衡、副本调度Step3 QueryNode 段内存加载、缓存淘汰机制Step4 两层前置过滤Step5 双分支检索逻辑分支 1Sealed 密封段分支 2Growing 活跃段Step6 本地局部 TopK 裁剪Step7 QueryCoord 全局结果合并、重排序Step8 Proxy 格式化返回结果检索额外补充知识点四、写入 检索全流程核心综合知识点面试可看1. Segment 分段核心体系2. 三大协调器分工本质区别3. 容错与数据一致性完整机制4. 线上性能调优核心思路写入调优查询调优5. 架构设计核心优势总结一、前置知识Milvus面向的是做 RAG 知识库、图文相似检索、大模型向量存储等的开发场景而使用时大部分人只知道调用SDK 的 insert、search 接口完全不懂底层一条向量从入库到检索返回结果完整发生了什么要完全理清写入和检索的执行流程我们要先了解Client业务端 SDK发起增删查改请求Proxy统一网关入口负责参数校验、路由分发、协议解析、权限控制、读写请求限流三大协调器 Coordinator集群元数据调度核心无状态RootCoord全局元数据管理集合、分区、Schema、用户权限、索引元数据全部存入 ETCD负责 DDL 操作create_collection/drop_collectionDataCoord管控写入链路、段固化触发、Compaction 小段合并调度、索引构建任务分发、段生命周期管QueryCoord管控查询节点负载均衡、拆分分发检索子任务、段加载 / 卸载调度、副本管理两类工作节点 Worker有状态负责实际数据操作DataNode处理写入内存缓存、段落盘持久化、合并段数据、构建向量索引、执行删除数据标记落地QueryNode内存加载向量段、执行标量过滤、向量相似度计算、本地结果排序、管理段内存缓存淘汰三层存储系统存储计算分离核心设计ETCD强一致元数据存储存所有集合、段、索引、分区元信息高可用集群部署Pulsar/KafkaWAL 预写日志写入宕机容错、数据回放恢复MinIO / 本地磁盘 / S3持久化原始向量文件、索引二进制文件、标量字段文件、删除位图文件二、向量数据写入 Insert 完整流程写入阶段独立 Mermaid 流程图步骤详解Step1 客户端请求与 Proxy 多层校验业务侧必须推荐批量插入单条 insert 会产生海量微型 Segment直接摧毁查询性能Proxy 四层校验逻辑权限校验当前账号是否拥有该集合写入权限Schema 校验向量维度、字段数据类型、主键是否重复、是否开启自增主键冲突参数范围校验批量插入条数上限、向量数值合法性集合状态校验集合是否存在、是否处于加载 / 删除中不可写状态补充Proxy 无状态可水平无限扩容所有请求统一接入 Proxy 做网关分流Step2 WAL 预写日志落地写入容错核心机制核心规则日志落盘成功Proxy 才会下发数据至 DataNode两步写入不可逆WAL 作用故障恢复、主从副本同步。如果 DataNode 宕机重启后会消费 Pulsar 未消费日志回放恢复内存未固化数据零数据丢失补充WAL 是消息队列持久化性能损耗极低是 Milvus 保证写入 ACID 中持久性 (D) 的核心手段Step3 路由分发与分区分片逻辑RootCoord 维护集合分区路由表写入数据会按分区哈希路由分发到对应 DataNode分区是 Milvus 横向数据拆分第一层隔离单元补充分区仅做数据隔离不参与检索并行同一分区内所有 Segment 由同一批 DataNode 处理写入分区过多会增加元数据管理压力Step4 DataNode 内存缓冲 MemTable 与活跃段Growing SegmentMemTable 是 DataNode 内存缓冲区对应活跃段 Growing Segment活跃段特性可追加写入、只读不持久化磁盘、无法构建向量索引检索活跃段只能暴力全量扫描海量数据场景查询延迟极高内存阈值配置memtable.max.size到达阈值自动触发固化未到阈值会常驻内存直到定时 flush 或手动 flushStep5 段 Seal 固化机制生成密封段 Sealed Segment三大固化触发条件内存阈值触发MemTable 数据量达到配置上限定时固化后台定时任务超过指定时长自动固化内存数据手动触发业务调用collection.flush()强制全内存段固化密封段核心特性只读、不可追加新向量完整持久化至对象存储包含向量文件、标量文件、主键索引、删除位图支持异步构建向量索引检索时走索引加速补充Segment 是 Milvus 最小存储、索引、检索单元所有调度、加载、合并、建索引都以 Segment 为单位Step6 DataCoord 更新 ETCD 元数据段文件落盘完成后DataCoord 立刻在 ETCD 写入新 Segment 完整元信息段 ID、所属分区、向量数量、存储路径、索引状态、创建时间、删除标记位图状态补充ETCD 元数据全局唯一所有 Coord、Node 实时同步元数据集群任意节点均可感知新增段Step7 Compaction 段合并痛点频繁少量批量插入会生成成千上百个微型 Sealed 段检索时 QueryNode 需要并行加载、遍历所有小段IO、计算量成倍上涨查询延迟暴涨合并流程DataCoord 后台定时扫描所有小段筛选向量总量少的 Segment下发合并任务给 DataNodeDataNode 读取所有小段原始数据去重、剔除已删除向量生成单个大容量新 Segment新段落盘后 ETCD 标记旧段为待删除后台延迟清理磁盘旧文件细分两种合并类型Minor Compaction合并少量微型段轻量后台任务资源占用低Major Compaction大规模合并同时清理已删除向量释放存储空间CPU、IO 开销更高手动优化线上可定时调用 compact 接口主动触发合并避免自动合并高峰抢占业务资源。Step8 异步离线构建向量索引核心规则索引构建完全异步、离线、不阻塞写入链路写入和建索引资源隔离执行逻辑DataCoord 轮询 ETCD检测到无索引的 Sealed 段分配空闲 DataNode 执行建索引DataNode 从 MinIO 读取原始向量根据指定索引类型HNSW/IVF_FLAT/IVF_SQ8 等计算索引结构索引文件独立落盘完成后更新 ETCD 标记该段索引就绪补充Growing 活跃段永远无法构建索引索引文件和原始向量文件分开存储可单独删除、重建索引无需重写原始向量重建索引仅影响对应 Segment不会中断集合读写三、向量相似检索 Search 完整流程检索阶段独立 Mermaid 流程图步骤详解Step1 Proxy 校验与全局元数据拉取Proxy 校验范围查询向量维度、topk 数值上限、过滤字段是否存在、过滤表达式语法合法性、集合读写状态元数据拉取目的一次性获取集合所有分区、所有 Segment、段索引状态、段向量数量区分活跃段 / 密封段提前预判本次查询是否会触发全量扫描补充大集合元数据量大时Proxy 会缓存 ETCD 元数据减少重复查询 ETCD 压力Step2 QueryCoord 任务拆分、负载均衡、副本调度QueryCoord 核心三大职责任务拆分、节点负载均衡、Segment 副本调度并行拆分逻辑每个 Segment 分配独立检索子任务分发到加载该段的 QueryNode实现多节点并行计算补充高频考点Milvus 支持多副本同一 Segment 可加载至多个 QueryNode检索请求可分发至任意副本节点实现查询高可用、查询负载分流单副本节点宕机检索自动切换其他副本Step3 QueryNode 段内存加载、缓存淘汰机制段加载完整文件原始向量文件、索引文件、标量字段文件、删除位图文件密封段优先加载索引文件减少向量读取开销热点段缓存机制QueryNode 内置 LRU 内存淘汰策略高频访问热点段长期驻留内存长期未访问冷段自动卸载释放内存避免 OOM补充内存不足时频繁卸载 / 加载段会产生大量 MinIO 磁盘 IO查询延迟飙升生产环境需要预留充足 QueryNode 内存Step4 两层前置过滤性能优化核心知识点Milvus 检索先过滤、后计算向量相似度极大减少向量计算开销分为两层过滤标量 Where 条件过滤解析用户传入过滤表达式age18、category数码遍历标量字段筛选符合条件主键优化点高频过滤字段创建标量索引倒排索引过滤速度提升数十倍无标量索引会全段遍历标量字段删除位图 DeleteBitmap 过滤Milvus 删除为软删除不会立刻物理删除向量每个 Segment 维护一张位图标记哪些主键已被删除相似度计算完成后直接剔除位图标记删除的数据不会返回已删除向量只有 Major Compaction 大规模合并时才会物理剔除已删除向量释放磁盘与内存空间。Step5 双分支检索逻辑ANN 近似检索 VS 暴力全量扫描分支 1Sealed 密封段索引就绪推荐主流场景采用 ANN 近似最近邻算法HNSW/IVF 系列牺牲极小精度换取百万级向量毫秒检索支持检索参数调优HNSW 的 ef、IVF 的 nprobe平衡查询速度与召回精度分支 2Growing 活跃段无索引性能坑点无索引结构只能暴力线性扫描所有未过滤向量逐个计算余弦 / 内积 / 欧式距离线上重大性能问题根源大批量数据未 flush 固化活跃段向量量巨大每次查询触发全量扫描延迟数十倍上涨核心优化知识点生产环境定时 flush保证绝大多数数据进入密封段并构建索引Step6 本地局部 TopK 裁剪每个 QueryNode 仅对自己负责的 Segment 做排序只返回本段相似度最高的局部 TopK 结果而非全部向量距离数据补充大幅降低跨节点网络传输的数据量亿级向量分布式查询下网络开销减少 90% 以上Step7 QueryCoord 全局结果合并、重排序汇总所有 QueryNode 返回的局部候选结果统一按相似度分数全局排序裁剪出用户指定的最终 TopK 条数去除重复主键跨 Segment 重复写入场景补充如果开启分页查询offset会放大候选结果数量查询延迟显著上升Milvus 不支持超大 offset 分页推荐游标分页Step8 Proxy 格式化返回结果Proxy 统一封装相似度分数、主键、标量字段、距离值转换为 SDK 统一格式返回客户端同时记录查询埋点指标查询耗时、扫描段数量、扫描向量总数用于监控告警。检索额外补充知识点读写完全隔离QueryNode 只做检索计算不参与任何写入、建索引任务读写并发互不抢占 CPU、内存资源存储计算分离优势向量数据全部外置存储新增 QueryNode 节点无需迁移数据仅按需加载 Segment 即可横向扩容查询能力并发隔离多集合、多分区检索任务在 QueryNode 内部线程池隔离单集合慢查询不会阻塞其他集合检索过滤优先级标量过滤 删除过滤 向量相似度计算是 Milvus 查询性能优化第一优先级四、写入 检索全流程核心综合知识点面试可看1. Segment 分段核心体系Segment 分为两类Growing 活跃段内存可写无索引、Sealed 密封段磁盘只读支持索引Segment 是 Milvus 最小调度单元固化、合并、建索引、加载、检索全部以 Segment 为单位线上性能 80% 问题根源大量微型 Segment、超大容量活跃段2. 三大协调器分工本质区别RootCoord管全局元数据、集合 / 分区 DDLDataCoord管写入链路、段生命周期、索引构建QueryCoord管查询负载、段加载、检索任务分发 三者完全解耦独立扩容互不影响3. 容错与数据一致性完整机制写入容错WAL 预写日志保证宕机不丢数据查询容错Segment 多副本单 QueryNode 宕机自动切换副本删除一致性DeleteBitmap 软删除后台合并清理保证读写期间数据可见性统一元数据一致性ETCD 强一致存储集群所有节点实时同步元数据4. 线上性能调优核心思路写入调优对应写入流程批量插入单次条数控制在 1000~10000定时手动 flush减少活跃段数据量合理配置 memtable 内存阈值平衡固化频率监控 Segment 数量自动 / 手动触发 Compaction 合并小段密封段写入完成后及时构建索引查询调优对应检索流程减少活跃段数据避免全量暴力扫描高频过滤字段创建标量索引合理设置索引参数ef/nprobe平衡速度与召回预留充足 QueryNode 内存减少冷热段频繁卸载加载避免超大 offset 分页查询改用游标遍历5. 架构设计核心优势总结读写分离DataNode/QueryNode 职责完全拆分高并发读写互不干扰存储计算分离向量数据外置对象存储集群弹性扩缩容无数据迁移成本全链路异步后台任务固化、合并、建索引离线执行不阻塞业务读写接口分布式并行计算写入按分区拆分检索按 Segment 多节点并行天然支撑亿级向量海量场景分层内存优化写入侧内存缓冲提升吞吐查询侧 LRU 热点缓存降低磁盘 IO