数据库研究前沿第
8 篇 把 HNSW、DiskANN、IVF-PQ 的算法假设讲清了;大模型基础设施第
17–18 篇 把 RAG 召回与向量库产品选型讲清了;湖仓第
21 篇 则把 Lance
留在「湖侧格式」边界。中间仍缺一层:生产向量引擎里,一条
insert / search 如何穿过
Proxy、Streaming Node、Query Node,Segment 如何从 Growing
变成带索引的 Sealed。
本文是「向量检索引擎」系列第 1 篇。目标不是重复 ANN 推导,也不是再写一遍 RAG 流水线,而是回答三个定位问题:
- 专用向量引擎相对「带向量列的数据库」、湖上格式、纯 ANN 库,差在哪一层?
- Milvus 2.6.x 的四层架构如何把写路径(流)与读路径(批)拆开?
- 本系列 18 篇与相邻系列的分工边界在哪里?
本文是「向量检索引擎」系列第 1 篇(共 19 篇)。→ 系列目录
篇目 核心内容 第 1 篇 · 向量引擎全景 分工地图、Milvus 四层、系列路线 第 2 篇 · ANN 工程接口 Knowhere 插件契约(算法外链 frontier/08) 第 3 篇 · Segment 状态机 Collection / Growing / Sealed / Flush 第 5 篇 · Streaming 与 WAL Woodpecker、实时可搜
版本锚定:Milvus 2.6.x(官方 Architecture Overview、Data Processing、Streaming Service、Knowhere、Woodpecker 文档)。机制结论以官方文档与 SIGMOD 2021 系统论文为准;本篇不粘贴未在本机执行的吞吐数字。
一、最小故事:同一条向量,四个「库」会怎么放
假设你有 \(n=10^6\) 条文档向量,\(d=768\),业务还要求:
- 白天持续写入新文档;
- 查询带标量过滤(例如
tenant_id = 42); - 夜间希望历史数据上有高质量 ANN 索引。
若只调用 FAISS /
Hnswlib,你自己要写:增量缓冲、崩溃恢复、过滤、分片与索引重建。若塞进
PostgreSQL + pgvector,你得到 SQL
与事务,但索引生命周期、十亿级对象存储与专用 ANN
调度通常不是 OLTP 页模型的一等公民。若把向量只放在 Lance
文件里,湖侧随机 take 很快(见
lakehouse/21),但「刚写入立刻可搜 + 集群级
handoff」仍要另接服务。
专用向量引擎(本系列以 Milvus 为主线)要同时回答:持续写入、近似检索、过滤、分布式生命周期。后面四层架构与 Growing/Sealed 二分,都是为这条故事服务的。
二、为什么需要「专用向量引擎」这一层
相似度检索的核心操作可以写成:给定查询向量 \(q \in \mathbb{R}^d\),在集合 \(X = \{x_1,\ldots,x_n\}\) 上返回距离最近的 \(k\) 个点(或距离阈值内的点)。精确解在高维下代价接近 \(O(nd)\);工程上几乎一律走近似最近邻(Approximate Nearest Neighbor, ANN),在召回率、延迟、内存之间折中——这是 db-frontier/08 的主题。
ANN 算法库(FAISS、Hnswlib、DiskANN)解决的是 索引结构与距离计算。生产系统还要回答算法库通常不包办的问题:
| 问题 | 算法库通常不做 | 专用引擎要做 |
|---|---|---|
| 持续写入 | 批量建索引为主 | 增量可搜、崩溃恢复、顺序日志 |
| 标量过滤 | 外层自己滤 | 表达式下推、与 ANN 路径交织 |
| 十亿级规模 | 单机内存假设 | 分片、对象存储、副本、调度 |
| 多租户与 schema | 内存里的矩阵 | Collection / 字段类型 / 权限边界 |
| 运维 | 调 ef / nprobe |
索引堆积、OOM、对象存储慢、一致性级别 |
因此「专用向量引擎」不是把 float[] 塞进
PostgreSQL 再挂一个扩展那么简单,也不是把 FAISS 包一层
gRPC。它处在 ANN 算法 与 RAG /
业务检索 之间:下层消费 Knowhere
一类索引内核,上层被 llm-infra 里的召回服务调用。
flowchart LR
frontier["db-frontier 08/09<br/>ANN and hybrid filter"]
engine["This series<br/>Milvus engine kernel"]
lake["lakehouse/21<br/>Lance lake format"]
rag["llm-infra 17/18<br/>RAG application"]
frontier --> engine
lake --> engine
engine --> rag
三、四类东西:不要混成一个词
站内与业界常把下列对象统称「向量库」。本系列严格区分:
| 类型 | 代表 | 优化目标 | 本系列角色 |
|---|---|---|---|
| ANN 算法 / 库 | FAISS、Hnswlib、DiskANN | 单机索引构建与查询 | 第 2、8 篇接口层;原理外链 frontier/08 |
| 专用向量引擎 | Milvus、Qdrant | 持续写入、过滤、分布式服务 | 主线 + 第 15 篇对照 |
| 库内向量扩展 | pgvector | 与 SQL/事务同进程 | 第 19 篇内核对照;选型见第 18 篇 |
| 湖原生格式 | Lance / LanceDB | 随机访问 + 可选 ANN,存算在文件侧 | 第 16 篇对照;实测口径见 lakehouse/21 |
争论(可核对双方):一边是「向量应成为通用数据库的一等类型」(pgvector、部分多模数据库叙事);另一边是「相似度检索的索引生命周期与 OLTP 页模型不兼容,应专用引擎」(Wang et al., SIGMOD 2021;Milvus Architecture)。本系列不宣称其中一方全面胜利——按规模、过滤复杂度、是否已有强 SQL 事务需求选型;决策树见第 18 篇,页模型与 Index AM 钉点见 第 19 篇。
3.1 常见误解
- 「向量库 = 一个大
HNSW」。生产里索引贴着
Segment,一次
search是多段候选归并(第 3、9 篇),不是单图一次调用。 - 「接了 pgvector 就等于有了专用引擎」。同进程 SQL 很强,但不等价于 Streaming/Query/Data 分流与对象存储上的索引生命周期。
- 「湖上有向量列就不必上在线引擎」。湖擅长版本与随机访问;「刚写入即可搜」依赖 WAL + Growing 路径(第 5、16 篇)。
四、学术谱系:从 ANN 到向量数据管理系统
4.1 奠基:ANN 与磁盘假设
| 工作 | 出处 | 本文引用点 |
|---|---|---|
| Indyk & Motwani | STOC 1998 等 | \(c\)-近似 NN 形式化;高维精确索引退化直觉 |
| Malkov & Yashunin, Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs | IEEE TPAMI 2020 | 内存图索引 HNSW;工业默认之一 |
| Subramanya et al., DiskANN | NeurIPS 2019 | 图索引落盘、十亿级内存装不下时的假设切换 |
算法层的召回–QPS–内存三角、参数语义,见 db-frontier/08。本系列默认读者接受:索引是独立于原始向量的数据结构,构建与查询参数分离。
4.2 系统分叉:Milvus SIGMOD 2021 → 2.x 存算分离 → 2.6 Streaming
| 阶段 | 系统 / 文献 | 相对前一代 |
|---|---|---|
| 2021 | Wang et al., Milvus: A Purpose-Built Vector Data Management System, SIGMOD 2021 | 目的建造向量数据管理系统:异构计算、动态更新、分布式;Knowhere 作为向量执行引擎 |
| 2.x | 存算分离 + 对象存储 | 计算节点无状态扩缩;Segment 持久化到对象存储 |
| 2.6.x | Streaming Node + Woodpecker WAL | 流处理与批查询拆分;可选零本地盘 WAL,降低对外部消息队列的硬依赖 |
同一条 insert 在两代叙事里:SIGMOD 2021 论文强调动态更新与异构执行;2.6 文档则把「可变增量」钉在 Streaming Node 的 Growing 上,把「不可变历史 + 重索引」钉在 Query/Data Node。工程间隙:论文组件名与今天的 Proxy / Streaming / Query / Data 不完全同构——本系列正文以 2.6.x 官方 Architecture / Data Processing 为准。
4.3 开放问题(系列贯穿)
- 统一多模引擎 vs 专用向量引擎:过滤与 join 变复杂时,专用引擎的表达式能力是否成为瓶颈?
- 湖上 ANN 与在线引擎如何共享同一份 embedding 版本:snapshot / 主键对齐,见 lakehouse/21 与第 16 篇。
- GPU 索引在共享集群上的调度与成本:Knowhere 支持 GPU 路径(官方文档),多租户下的利用率仍是工程开放问题(第 8、18 篇)。
五、Milvus 2.6.x 四层架构(本系列坐标系)
官方 Architecture Overview 把 Milvus 拆成相互独立扩展的四层(A 级)。下图用独立 SVG 强调二维分层;后文 Mermaid 再拆 insert / Growing–Sealed 分工。
flowchart TB
access["Layer1 Access<br/>Proxy"]
coord["Layer2 Coordinator<br/>DDL TSO topology"]
workers["Layer3 Workers"]
storage["Layer4 Storage<br/>etcd / Object / WAL"]
access --> coord
access --> workers
coord --> workers
workers --> storage
subgraph workersBox ["Three worker roles"]
sn["Streaming Node<br/>Growing + WAL"]
qn["Query Node<br/>Sealed history"]
dn["Data Node<br/>compaction + index"]
end
workers --- workersBox
| 层 | 职责 | 本系列篇目 |
|---|---|---|
| Access(Proxy) | 校验请求、MPP 结果归并 | 第 4、9 篇 |
| Coordinator | DDL/DCL、TSO、WAL 与 Streaming 绑定、Query 拓扑、离线任务调度 | 第 4、10、14 篇 |
| Streaming Node | shard 级一致性、Growing 查询、WAL、Growing→Sealed | 第 3、5、7、9 篇 |
| Query Node | 从对象存储加载 Sealed,历史检索 | 第 7、8、9 篇 |
| Data Node | compaction、索引构建,写回对象存储 | 第 6、10 篇 |
| Storage | etcd 元数据;对象存储(日志快照、索引);WAL(Woodpecker / Kafka / Pulsar) | 第 5、6 篇 |
5.1 API 三类走不同路径
官方按 API 类别给出架构流(Architecture Overview):
| 类别 | 示例 | 路径 |
|---|---|---|
| DDL/DCL | createCollection |
Access → Coordinator |
| DML | insert / delete /
upsert |
Access → Streaming Node |
| DQL | search / query |
Access → 以 Streaming Node 为入口,再协同 Query Node(详见 Data Processing) |
注意:总表里 DQL 写「Batch Worker / Query Nodes」,细粒度查询流写明 Proxy 广播到相关 Streaming Node,由后者搜本地 Growing 并请求 Query Node 的 Sealed 结果,再经多层 reduce 回到 Proxy。本系列以 Data Processing 细粒度流 为准(第 7、9 篇展开)。
5.2 插入端到端时序
sequenceDiagram
participant C as Client
participant P as Proxy
participant SN as StreamingNode
participant OS as ObjectStore
participant DN as DataNode
participant QN as QueryNode
C->>P: insert
P->>SN: route by shard
SN->>SN: assign TSO, append WAL
Note over SN: Growing searchable
SN->>OS: flush Sealed
DN->>OS: build index / compact
Note over QN: handoff then load
QN->>OS: load Sealed + index
步骤与官方 Data Processing / Architecture 一致:
- Proxy 校验并按 shard 规则拆包,送到对应 Streaming Node。
- Streaming Node 赋 TSO,写入 WAL;提交后可参与实时查询。
- Growing Segment 在策略触发下 flush 为不可变 Sealed,数据落对象存储。
- Data Node 对 Sealed 建索引 / compaction;Coordinator handoff 后由 Query Node 加载。
5.3 Growing 与 Sealed 的分工
flowchart LR
subgraph realtime ["Realtime path"]
wal["WAL commit"]
grow["Growing segment<br/>on Streaming Node"]
wal --> grow
end
subgraph history ["History path"]
sealed["Sealed on object store"]
idx["Index via Data Node"]
qn["Query Node load"]
sealed --> idx --> qn
end
grow -->|"flush + handoff"| sealed
检索最小故事:Proxy → 相关 shard 的
Streaming Node → 本地 Growing + 远程 Query Node 的 Sealed →
shard 内聚合 → Proxy 跨 shard
reduce。这就是本系列要钉住的「引擎层」——不是
efSearch=64 该取多少,而是
谁持有可变数据、谁持有不可变索引、何时
handoff。
六、与相邻系列的分工
| 话题 | 本系列 | 相邻系列 |
|---|---|---|
| HNSW / DiskANN / IVF-PQ 原理 | 第 2、8 篇只谈 Knowhere 契约 | db-frontier/08 |
| ACORN / pre-post filter 算法 | 第 11 篇工程落点 | db-frontier/09 |
| RAG chunking / rerank / GraphRAG | 第 18 篇回链 | llm-infra/17–18 |
| Lance vs Parquet 随机 take | 第 16 篇对照 | lakehouse/21 |
| 向量存储入门 | 本文一句 | storage/39 |
| 行存 / 列存 / LSM / 湖 / 流 / SQL | 不重复 | db/index 各系列 |
七、十八篇地图
第一部分(01–03):生态定位、ANN 接口、Segment 状态机——共同词汇。
第二部分(04–06):Proxy/Coordinator、Streaming/WAL、对象存储布局——写路径与持久化。
第三部分(07–10):Segcore/Query Node、Knowhere、分布式归并、Data Node——读路径与离线维护。
第四部分(11–14):混合过滤、一致性、Delete/Upsert、副本故障——生产语义。
第五部分(15–18):Qdrant、Lance、排障、选型——对照与收束。
系列贯穿的五个问题见 index;本篇只建立坐标系。
八、实验与证据约定
本系列性能相关实验放在 reproduce/(随第
3、7、11 篇启动)。环境以 Docker 单机 Milvus 2.6.x
为主。
硬约束(与 PLAN.md 一致):
- 未跑的 benchmark 不写进结论。
- 官方 Woodpecker 对比表(Kafka / Pulsar / S3 等)若引用,必须标明 官方单节点基准、非本机复现,并写清后端假设。
- 十亿级数字只作带出处的外部引用,不作自测伪装。
九、小结
三句话小结
- 专用向量引擎补的是 ANN 库与 RAG 之间的 写入、过滤、分布式生命周期,不是又一个距离函数。
- Milvus 2.6.x 用四层把 Growing 实时 与 Sealed 历史 拆开,再用 flush / handoff 缝合。
- 读本系列时先记住「谁持有可变数据、谁持有不可变索引」,再去调
ef/nprobe。
下一篇进入接口层:ANN 算法工程接口;数据模型见 Segment 状态机。
参考资料
核心论文
- Wang, Jianguo et al., Milvus: A Purpose-Built Vector Data Management System, SIGMOD 2021(系统论文;架构以当时实现为准,与 2.6.x 对照阅读)。
- Malkov, Yu. A. & Yashunin, D. A., Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs, IEEE TPAMI 2020 (vol. 42, no. 4)(HNSW;算法细节见 db-frontier/08)。
- Subramanya, Suhas Jayaram et al., DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node, NeurIPS 2019。
规范 / 文档
- Milvus Documentation v2.6.x, Architecture Overview(四层、API 路径、insert/search 示例流)。
- Milvus Documentation v2.6.x, Data Processing(Growing/Sealed、flush、index build、query、handoff)。
- Milvus Documentation v2.6.x, Knowhere / Streaming Service / Woodpecker(后续篇展开)。
站内
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【向量检索引擎】Milvus · Segcore · Knowhere · Qdrant · Lance · pgvector
补齐 ANN 算法与 RAG 应用之间的生产级向量引擎层:以 Milvus 2.6.x 为主线拆解 Segment、WAL、Segcore、Knowhere、混合过滤与一致性,并用 Qdrant、LanceDB、pgvector 对照选型。
【向量检索引擎】ANN 算法工程接口:从 HNSW/IVF 到 Knowhere 契约
把 HNSW、IVF、DiskANN、Flat 收成引擎侧 Train/Build/Load/Search 契约与构建期/查询期参数面;用生命周期图与召回–QPS–内存三角说明索引如何贴着 Segment,并与 db-frontier/08、第 8 篇 Knowhere 分工。
【向量检索引擎】Query Node 与 Segcore:段级 search 如何执行
按 Milvus 2.6.x Data Processing 与 Architecture 拆解 Query Node 对 Sealed 的加载与段级检索,说明 Streaming Node 上 Growing 路径与 Query Delegator 如何拼成一次 search,用最小故事与常见误解钉住 Segcore 与 Knowhere 的层次边界。
【向量检索引擎】Knowhere:向量索引执行引擎与插件契约
按官方 Knowhere 文档说明其在 Milvus 中的位置、相对 Faiss 的扩展(bitset、SIMD 选择、二进制度量)、VecIndex 类层次与 IDMAP/IVF/HNSW 等类型,用插件注册、CPU/GPU 分发与 bitset 进查询三张图钉住工程契约,并与 db-frontier/08 的算法细节分工。