跳到主要内容

内存副本

本主题介绍了 Milvus 中的内存副本(复制)机制,该机制在工作内存中启用多个 segment 复制以提高性能和可用性。

有关如何配置内存副本的信息,请参阅 Query Node 相关配置

概述

Replica_Availiability

使用内存副本,Milvus 可以在多个 query node 上加载相同的 segment。如果一个 query node 发生故障或正在忙于处理当前搜索请求而另一个请求到达时,系统可以将新请求发送到具有相同 segment 副本的空闲 query node。

性能

内存副本允许您利用额外的 CPU 和内存资源。如果您的数据集相对较小但希望通过额外的硬件资源增加读取吞吐量,这非常有用。整体 QPS(每秒查询数)和吞吐量可以显著提高。

可用性

内存副本帮助 Milvus 在 query node 崩溃时更快恢复。当 query node 失败时,segment 不必在另一个 query node 上重新加载。相反,搜索请求可以立即重新发送到新的 query node,而无需再次重新加载数据。通过同时维护多个 segment 副本,系统在面对故障转移时更具弹性。

关键概念

内存副本被组织为副本组。每个副本组包含分片副本。每个分片副本都有一个流式副本和一个历史副本,对应分片中的增长和密封segment(即 DML 通道)。

内存副本工作原理示意图

副本组

副本组由多个query node组成,负责处理历史数据和副本。

分片副本

分片副本由一个流式副本和一个历史副本组成,两者都属于同一个分片。副本组中分片副本的数量由指定 Collection 中的分片数量决定。

流式副本

流式副本包含来自同一 DML 通道的所有增长 segment。从技术上讲,流式副本应该由一个副本中的只有一个 query node 提供服务。

历史副本

历史副本包含来自同一 DML 通道的所有密封 segment。一个历史副本的密封 segment 可以分布在同一副本组内的多个 query node 上。

分片领导者

分片领导者是在分片副本中为流式副本提供服务的 query node。

设计细节

平衡

需要加载的新 segment 将被分配到多个不同的 query node。一旦至少有一个副本成功加载,搜索请求就可以被处理。

搜索

缓存

Proxy 维护一个将 segment 映射到 query node 的缓存,并定期更新它。当 proxy 收到请求时,Milvus 从缓存中获取所有需要搜索的密封 segment,并尝试将它们均匀分配给 query node。

对于增长 segment,proxy 还维护一个通道到 query node 的缓存,并将请求发送到相应的 query node。

故障转移

Proxy 上的缓存并不总是最新的。当请求到达时,某些 segment 或通道可能已经移动到其他 query node。在这种情况下,proxy 将收到错误响应,更新缓存并尝试将其分配给另一个 query node。

如果 proxy 在更新缓存后仍然找不到 segment,则该 segment 将被忽略。这可能在 segment 已被压缩时发生。

如果缓存不准确,proxy 可能会错过一些 segment。具有 DML 通道(增长 segment)的 Query node 返回搜索响应以及 proxy 可以用来比较和更新缓存的可靠 segment 列表。

增强

Proxy 无法完全平等地将搜索请求分配给 query node,并且 query node 可能具有不同的资源来处理搜索请求。为了避免资源的长尾分布,proxy 将把其他 query node 上的活跃 segment 分配给也拥有这些 segment 的空闲 query node。