「实时可搜」常被理解成「insert 返回成功后下一次 search 一定看到」。Milvus 用 可调一致性级别 把这句话拆成:你愿意为可见性等待多久。第 4、9 篇 已引入 GuaranteeTs;本文按官方文档收束四级语义与工程后果。
本文是「向量检索引擎」系列第 12 篇(共 18 篇)。→ 系列目录
版本锚定:Milvus 2.6.x Consistency Level、Timestamp;数据面路径对齐 Data Processing(Growing / Sealed)。
一、问题从哪来
Consistency Level:存算分离下,执行节点可能尚未看见全部最新流式更新;若不加约束,直接在不完整视图上 search 会丢未提交/未追上的点。系统为记录赋时间戳,并用同步时间推进执行侧的 ServiceTime;用户通过 GuaranteeTs 声明「至少要看到该时刻之前的更新」。
Timestamp:同一批 DML 共享时间戳;查询侧比较
Service_timestamp 与
Guarantee_timestamp(及可选
Graceful_time),决定立即执行还是等待。
二、四级一致性(官方)
支持级别:Strong、Bounded、Session、Eventually;默认 Bounded。
| 级别 | GuaranteeTs 如何定(官方直觉) | 体验 |
|---|---|---|
| Strong | 用最新时间戳 | 等到 ServiceTime 追上再搜;延迟↑,新鲜度↑ |
| Bounded | 早于最新的时间点,容忍有界陈旧 | 默认;延迟与新鲜度折中 |
| Session | 以该客户端插入到达的时间点为 GuaranteeTs | 「我刚写的」优先可见 |
| Eventually | GuaranteeTs 极小(如 1),弱化检查 | 尽快在已有视图上返回 |
可在 创建 Collection 时设默认,也可在单次 search / query 覆盖(官方 API 示例)。
用户通常 不手写原始 TSO;选级别即可,由系统映射 GuaranteeTs(Timestamp 文档亦说明此点)。
三、等待条件(Timestamp 文档)
记 \(G\) = GuaranteeTs,\(S\) = ServiceTime,\(g\) = Graceful_time(配置的可容忍窗口)。
| 条件 | 行为 |
|---|---|
| \(S \ge G\) | 可立即执行 |
| \(S + g \ge G\)(在启用 graceful 的叙述下) | 可在容忍窗口内执行 |
| 仍不满足 | 推迟 search/query,直到水位追上 |
因此 Strong 相对 Eventually 的主要代价往往是 尾延迟(等待),不是另一套 ANN 算法。
四、对照 2.6 数据面:精确理解「刚写入就能搜」
2.6 Data Processing:WAL 提交后进入 Growing,由 Streaming Node 路径参与实时查询;Sealed 在 Query Node。Consistency 文档示意图仍用较笼统的 QueryNode 收流叙述——阅读时映射为:
- 写入成功 = 相关 Message 已按 TSO 提交到 WAL(第 5 篇);
- 对某次 search 可见 = 该次请求的 GuaranteeTs 所要求的更新,已进入执行路径的可见水位(Growing 与/或已 handoff 的 Sealed,视数据阶段而定);
- 索引最优路径就绪 = Data Node 建索 + Query Node 加载完成(第 10 篇)——这是性能问题,不是一致性级别字面承诺。
Session 保证的是 该客户端写入点 相关的可见性语义,不是「全集群所有客户端任意写入立即彼此可见」(那更接近 Strong)。
五、与 RAG 工程的选型直觉
| RAG 场景 | 更常见选择 |
|---|---|
| 文档入库后立刻问答同一会话 | Session 或 Strong |
| 批量索引、可接受秒级陈旧 | Bounded(默认) |
| 离线评测、只读近似视图 | Eventually 可能够用 |
权限过滤很严时,陈旧视图可能导致
偶发读到已撤销文档的向量——产品上常与第 11
篇过滤、应用层 ACL 一并设计,而不是只调
ef。
六、学术谱系、工程间隙、开放问题
6.1 谱系
有界陈旧(Bounded Staleness)是分布式存储常见折中;Milvus 将其产品化为四级 + GuaranteeTs。TSO 提供写顺序原料(第 4、5 篇)。
6.2 工程间隙
- 文档示例时间用墙钟字符串便于理解;实现是 TSO 逻辑时间。
- Graceful_time 是集群配置,与 per-request 级别不同层,调参要写进运行手册。
- Strong 下的超时应配置为「等水位」可观测,避免客户端误判为 Knowhere 挂死。
6.3 开放问题
- 多副本下 ServiceTime 取 min/max/法定人数?
- Session 在连接池复用、跨进程客户端时的精确语义?
- 与 CDC 入湖(lakehouse/stream)对齐同一「可见版本号」?
七、小结
一致性级别 = GuaranteeTs 策略;代价主要是等待 ServiceTime。默认 Bounded。「能搜到」≠「索引已最优」。下一篇:Delete · Upsert · TTL。
参考资料
- Milvus Documentation v2.6.x, Consistency Level。
- Milvus Documentation v2.6.x, Timestamp。
- Milvus Documentation v2.6.x, Data Processing、Streaming Service。
- 第 4、5、9 篇、系列 index。
返回 系列目录 | 上一篇:混合过滤 | 下一篇:Delete · Upsert · TTL
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【向量检索引擎】分布式 search 归并:Delegator、多级 reduce 与 GuaranteeTs
按 Milvus 2.6.x Data Processing 与 Architecture 拆解 search 的多级归并树:Proxy → Streaming Node Delegator → Query Node 段级结果;说明 shard 并发、Top-k 合并直觉,以及 GuaranteeTs/ServiceTime 如何让一致性变成等待。
【向量检索引擎】Proxy 与 Coordinator:接入面、TSO 与集群大脑
按 Milvus 2.6.x 四层架构拆解无状态 Proxy 的校验与 MPP 归并,以及单活跃 Coordinator 的 DDL/TSO、Streaming 绑定、Query 拓扑与离线任务调度;说明控制面与 Worker 的分工边界。
【向量检索引擎】Streaming Node 与 Woodpecker WAL:实时可搜的日志层
按 Milvus 2.6.x Streaming Service 拆解 Message/TSO、WAL 组件、Recovery Storage 与 Query Delegator;说明 Woodpecker 零本地盘设计与 MemoryBuffer/QuorumBuffer 模式,并标明官方吞吐数字的引用边界。
【向量检索引擎】向量引擎全景:算法、RAG 与专用引擎之间的一层
定位专用向量检索引擎相对 ANN 算法、RAG 应用与湖仓格式的分工;以 Milvus 2.6.x 四层架构给出本系列 18 篇地图,并交代从 SIGMOD 2021 系统论文到存算分离演进的谱系。