前几篇默认「一段在某处加载一次」。生产读放大与可用性靠 内存副本、写侧靠 WAL 可迁移、段分布靠 Coordinator handoff。本文合并这三条恢复与扩缩路径。
本文是「向量检索引擎」系列第 14 篇(共 18 篇)。→ 系列目录
版本锚定:Milvus 2.6.x In-Memory Replica、Streaming Service、Data Processing、Architecture。
一、In-Memory Replica:同一 Sealed 多份内存象
In-Memory Replica:允许同一 segment 加载到 多个 Query Node 的工作内存,以提升性能与可用性。
| 收益 | 官方表述 |
|---|---|
| 性能 | 用额外 CPU/内存换读吞吐;适合数据集相对不大、想堆硬件提 QPS 的场景 |
| 可用性 | Query Node 故障或繁忙时,请求可转到仍持有该段副本的空闲节点,不必先重新加载 |
1.1 关键概念(官方)
| 概念 | 含义 |
|---|---|
| Replica group | 多个负责历史数据与副本的节点组成的组 |
| Shard replica | 同一 shard 上的 streaming replica + historical replica;组内 shard replica 数由 Collection shard 数决定 |
| Streaming replica | 同一 DML channel 上的 growing 段集合;文档称技术上由副本内单一节点服务 |
| Historical replica | 同一 channel 的 sealed 段集合;可分布在组内多个 Query Node |
| Shard leader | 服务该 shard streaming replica 的节点 |
1.2 与 2.6 Streaming 架构的对照阅读
2.6 Architecture / Data Processing 将 Growing 放在 Streaming Node,Sealed 放在 Query Node。In-Memory Replica 文档仍大量使用「Query Node 服务 growing」的表述——属于组件演进中的术语滞后。
本系列采用如下对齐(不伪造未文档化的内部表结构):
- Historical / Sealed 多副本:按 In-Memory Replica,同一 sealed 段可多 Query Node 加载——这是读扩缩与故障转移的主杠杆。
- Growing / 流侧多副本:Streaming Service 写明 Collection 配置多副本时,除与 WAL 共存的 Delegator 外,另有 \(N-1\) 个 Delegator 部署在其它 Streaming Node——流侧可用性按该叙述理解。
- 配置入口:官方指向 Query Node 相关配置(In-Memory Replica → Query Node-related Configurations)。
读源码或监控时同时搜 replica 与
delegator,避免只认旧名词。
二、Search 路径上的缓存与 Failover
In-Memory Replica · Search:
- Proxy 缓存 segment→Query Node 映射,并周期性更新;请求到来时尽量均匀分配 sealed 段到各节点。
- Growing 侧维护 channel→节点缓存并发送请求。
- Failover:缓存可能过期;段已迁移则 Proxy 收到错误,更新缓存并改派。若更新后仍找不到段,可能因 compaction 已消除该段 而忽略。
- 持有 DML channel 的节点可在响应中带回 可靠段列表,供 Proxy 校对缓存。
- Enhancement:节点负载不均时,Proxy 可把其它节点上的活跃段请求派给同样持有该段、且更空闲的节点,缓解长尾。
这与第 4 篇「routing cache,缺则问 Coordinator」、第 9 篇多级 reduce 同一家族:正确性依赖 视图最终追上,短暂不一致靠重试与缓存刷新。
三、WAL 迁移与 Wait for Ready
Streaming Service:存算分离使 WAL 可从一 Streaming Node 迁到另一节点。迁移窗口:
- 旧节点拒绝部分请求;
- 新节点恢复 WAL;
- 客户端 Wait for Ready。
写路径可用性的关键不是「Query Node 副本数」,而是 WAL 单所有者 + 快速恢复(第 5 篇 fencing)。副本再多也救不了「WAL 未就绪」的写入。
四、Handoff 与负载均衡
Data Processing:flush 或 compaction 后,Coordinator handoff,在 Query Node 间分配 Sealed,平衡内存、CPU、segment 数,释放冗余。
故障与扩缩时:
| 事件 | 典型动作 |
|---|---|
| Query Node 宕机 | 有内存副本则可改派;否则需重新从对象存储加载(延迟尖刺,第 6、7 篇) |
| 新节点加入 | handoff / balance 迁入段 |
| compaction | 旧段消失,Proxy 缓存必须能忽略(见上) |
五、代价:副本不是免费 QPS
| 代价 | 说明 |
|---|---|
| 内存 | 同段多份向量/索引驻留 |
| 对象 GET | 多节点重复加载放大 API 与流量(第 6 篇) |
| 删除广播 | 更多历史副本需要收到 Delete(第 13 篇) |
| 协调复杂度 | 缓存失效、错派、长尾调度 |
小数据集 + 多硬件堆 QPS 是官方点名的甜区;十亿级全量多副本可能先被内存与对象费用打死。
六、学术谱系、工程间隙、开放问题
6.1 谱系
内存多副本 ≈ 只读副本组;与共识日志多副本不同——Milvus 写耐久在 WAL,读副本服务查询扩展。
6.2 工程间隙
- 文档术语跨 2.x→2.6 需人工对齐 Streaming/Query。
- 「至少一个副本加载成功即可服务」缩短上线时间,但副本未齐时容量与尾延迟仍差。
- Proxy 增强调度依赖段级副本拓扑正确;拓扑抖动期长尾可能恶化。
6.3 开放问题
- 副本因子随 QPS 自动伸缩的策略?
- 跨可用区放置时,延迟与删除广播的 SLA?
- 与 Kubernetes 滚动升级的配合:先加副本再驱逐?
七、小结
读扩缩靠 Sealed 内存多副本 + Proxy 缓存改派;写可用靠 WAL 迁移与 Wait for Ready;段分布靠 handoff。下一批进入对照与收束:第 15–18 篇(Qdrant、Lance、排障、选型)。
参考资料
- Milvus Documentation v2.6.x, In-Memory Replica。
- Milvus Documentation v2.6.x, Streaming Service(多 Delegator、WAL 迁移、Wait for Ready)。
- Milvus Documentation v2.6.x, Data Processing(handoff)、Architecture Overview。
- 第 4、5、6、9、10 篇、系列 index。
返回 系列目录 | 上一篇:Delete · Upsert · TTL | 下一篇:Qdrant 对照
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【向量检索引擎】Collection · Partition · Segment · Channel:Growing 到 Sealed 的状态机
钉住 Milvus 2.6.x 的数据模型词汇:Collection/Partition、vchannel/pchannel 与 Streaming Node 绑定,Growing/Sealed 段类型、flush 与 handoff,为后续写路径与读路径提供共同状态机。
【向量检索引擎】Streaming Node 与 Woodpecker WAL:实时可搜的日志层
按 Milvus 2.6.x Streaming Service 拆解 Message/TSO、WAL 组件、Recovery Storage 与 Query Delegator;说明 Woodpecker 零本地盘设计与 MemoryBuffer/QuorumBuffer 模式,并标明官方吞吐数字的引用边界。
【向量检索引擎】Query Node 与 Segcore:段级 search 如何执行
按 Milvus 2.6.x Data Processing 与 Architecture 拆解 Query Node 对 Sealed 的加载与段级检索,说明 Streaming Node 上 Growing 路径与 Query Delegator 如何拼成一次 search,并界定 Segcore 与 Knowhere 的层次。
【向量检索引擎】Data Node:compaction 与 index build
说明 Milvus 2.6.x 中 Data Node 作为离线 Worker 如何承接 Coordinator 下发的建索引与 compaction,输入输出如何进出对象存储,以及索引堆积与 handoff 如何影响查询新鲜度与资源争用。