内存内复制
本主题介绍 Milvus 中的内存中复制(replication)机制,该机制可在工作内存中实现多个网段复制,以提高性能和可用性。
有关如何配置内存中复制的信息,请参阅查询节点相关配置。
概述
副本可用性
利用内存中副本,Milvus 可在多个查询节点上加载相同的数据段。如果一个查询节点出现故障或忙于处理当前的搜索请求,当另一个查询节点到达时,系统可将新请求发送到拥有相同段复制的空闲查询节点。
性能
内存中复制允许您利用额外的 CPU 和内存资源。如果你的数据集相对较小,但又想利用额外的硬件资源提高读取吞吐量,这将非常有用。整体 QPS(每秒查询次数)和吞吐量都能显著提高。
可用性
内存复制有助于 Milvus 在查询节点崩溃时更快地恢复。当一个查询节点发生故障时,无需在另一个查询节点上重新加载数据段。相反,搜索请求可以立即重新发送到新的查询节点,而无需再次重新加载数据。通过同时维护多个数据段副本,系统在面对故障转移时更具弹性。
关键概念
内存复制以复制组的形式组织。每个副本组都包含分片副本。每个分片副本都有一个流副本和一个历史副本,分别对应于分片(即 DML 通道)中不断增长和封存的分段。
内存复制工作原理示例
副本组
副本组由多个查询节点组成,负责处理历史数据和副本。
分片副本
分片副本由流式副本和历史副本组成,二者属于同一个分片。副本组中碎片副本的数量由指定 Collections 中碎片的数量决定。
流副本
流副本包含来自同一 DML 通道的所有增长分段。从技术上讲,流副本只能由一个副本中的一个查询节点提供服务。
历史副本
历史副本包含来自同一 DML 通道的所有密封数据段。一个历史副本的密封分段可分布在同一副本组内的多个查询节点上。
分片组长
分片组长是为分片副本中的流副本提供服务的查询节点。
设计细节
平衡
需要加载的新片段将分配给多个不同的查询节点。一旦至少一个副本加载成功,就可以处理搜索请求。
搜索
缓存
代理会维护一个将数据段映射到查询节点的缓存,并定期更新。当代理收到请求时,Milvus 会从缓存中获取所有需要搜索的封存段,并尝试将它们平均分配给查询节点。
对于不断增长的网段,代理也会维护一个从通道到查询节点的缓存,并向相应的查询节点发送请求。
故障转移
代理上的缓存并不总是最新的。当请求到来时,某些片段或通道可能已被转移到其他查询节点。在这种情况下,代理将收到错误响应,更新缓存并尝试将其分配给另一个查询节点。
如果代理在更新缓存后仍无法找到某个片段,该片段将被忽略。如果数据段已被压缩,就会出现这种情况。
如果缓存不准确,代理可能会漏掉一些数据段。具有 DML 通道(不断增长的数据段)的查询节点会返回搜索响应以及可靠数据段的列表,代理可与之比较并更新缓存。
改进
代理无法将搜索请求完全平等地分配给查询节点,查询节点可能拥有不同的资源来满足搜索请求。为避免资源的长尾分布,代理会将其他查询节点上的活动分段分配给同样拥有这些分段的空闲查询节点。