跳到主要内容
版本:v3.0.x

In-Memory Replica

本主题介绍 Milvus 中的内存中复制(replication)机制,该机制可在工作内存中实现多个数据段复制,以提高性能和可用性。

有关如何配置内存中复制的信息,请参阅 QueryNode 相关配置

概述

Replica_Availiability

利用内存中副本,Milvus 可在多个 QueryNode 上加载相同的数据段。如果一个 QueryNode 出现故障或忙于处理当前的搜索请求,当另一个 QueryNode 到达时,系统可将新请求发送到拥有相同段复制的空闲 QueryNode。

性能

内存中复制允许您利用额外的 CPU 和内存资源。如果您的数据集相对较小,但又想利用额外的硬件资源提高读取吞吐量,这将非常有用。整体 QPS(每秒查询次数)和吞吐量都能显著提高。

可用性

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

关键概念

内存复制以复制组的形式组织。每个副本组都包含 分片 副本。每个分片副本都有一个流副本和一个历史副本,分别对应于分片(即 DML 通道)中不断增长和封存的 分段

An illustration of how in-memory replica works

副本组

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

分片副本

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

流副本

流副本包含来自同一 DML 通道的所有 增长片段。从技术上讲,流副本只能由一个副本中的一个 QueryNode 提供服务。

历史副本

历史副本包含来自同一 DML 通道的所有 Sealed Segment。一个历史副本的密封分段可分布在同一副本组内的多个 QueryNode 上。

分片组长

分片组长是为分片副本中的流副本提供服务的 QueryNode。

设计细节

平衡

需要加载的新片段将分配给多个不同的 QueryNode。一旦至少一个副本加载成功,就可以处理搜索请求。

缓存

Proxy 会维护一个将数据段映射到 QueryNode 的缓存,并定期更新。当 Proxy 收到请求时,Milvus 会从缓存中获取所有需要搜索的 Sealed Segment,并尝试将它们平均分配给 QueryNode。

对于 Growing Segment,Proxy 也会维护一个从通道到 QueryNode 的缓存,并向相应的 QueryNode 发送请求。

故障转移

Proxy 上的缓存并不总是最新的。当请求到来时,某些片段或通道可能已被转移到其他 QueryNode。在这种情况下,Proxy 将收到错误响应,更新缓存并尝试将其分配给另一个 QueryNode。

如果 Proxy 在更新缓存后仍无法找到某个片段,该片段将被忽略。如果数据段已被 Compaction,就会出现这种情况。

如果缓存不准确,Proxy 可能会漏掉一些数据段。具有 DML 通道(不断增长的数据段)的 QueryNode 会返回搜索响应以及可靠数据段的列表,Proxy 可与之比较并更新缓存。

改进

Proxy 无法将搜索请求完全平等地分配给 QueryNode,而且 QueryNode 可能拥有不同的资源来满足搜索请求。为避免资源的长尾分布,Proxy 会将其他 QueryNode 上的活动分段分配给同样拥有这些分段的空闲 QueryNode。