Milvus 如何平衡各节点的查询负载?
Binlog 封面图片
作者:Xi Ge
在之前的博客文章中,我们陆续介绍了 Milvus 2.0 中的 Deletion、Bitset 和 Compaction 功能。在本系列文章的最后,我们想和大家分享负载均衡(Load Balance)背后的设计,它是 Milvus 分布式集群的一个重要功能。
实现
查询节点中缓冲的片段数量和大小不同,各查询节点的搜索性能也可能不同。最糟糕的情况可能是,几个查询节点在搜索大量数据时已经筋疲力尽,而新创建的查询节点却因为没有分段而处于闲置状态,从而造成 CPU 资源的大量浪费和搜索性能的大幅下降。
为避免出现这种情况,查询协调器(query coordinator)被编程为根据节点的内存使用情况向每个查询节点平均分配数据段。因此,CPU 资源在各节点上的消耗是均等的,从而大大提高了搜索性能。
触发自动负载平衡
根据配置queryCoord.balanceIntervalSeconds
的默认值,查询协调器每 60 秒检查一次所有查询节点的 RAM 使用情况(百分比)。如果满足以下任一条件,查询协调器就会开始平衡各查询节点的查询负载:
- 群集中任何查询节点的内存使用率大于
queryCoord.overloadedMemoryThresholdPercentage
(默认值:90); - 或任意两个查询节点的内存使用量差值的绝对值大于
queryCoord.memoryUsageMaxDifferencePercentage
(默认值:30)。
数据段从源查询节点传输到目标查询节点后,还应同时满足以下两个条件:
- 目标查询节点的内存使用量不大于
queryCoord.overloadedMemoryThresholdPercentage
(默认值:90); - 负载平衡后,源查询节点和目标查询节点的内存使用量差值的绝对值小于负载平衡前的差值。
满足上述条件后,查询协调器将继续平衡各节点的查询负载。
负载平衡
当负载平衡被触发时,查询协调器首先将目标数据段加载到目标查询节点。此时,两个查询节点都会根据任何搜索请求返回目标数据段的搜索结果,以保证结果的完整性。
目的地查询节点成功加载目标网段后,查询协调器会向查询频道发布sealedSegmentChangeInfo
。如下图所示,onlineNodeID
和onlineSegmentIDs
分别表示加载段的查询节点和加载的段,offlineNodeID
和offlineSegmentIDs
分别表示需要释放段的查询节点和要释放的段。
密封的分段更改信息
收到sealedSegmentChangeInfo
后,源查询节点将释放目标网段。
负载平衡工作流程
源查询节点释放目标网段后,整个流程就成功了。这样,各查询节点的查询负载就达到了平衡,即所有查询节点的 RAM 使用量都不大于queryCoord.overloadedMemoryThresholdPercentage
,并且负载平衡后源查询节点和目标查询节点的 RAM 使用量差值的绝对值小于负载平衡前的差值。
下一步是什么?
在 2.0 新功能系列博客中,我们将介绍新功能的设计。阅读本系列博客的更多内容!
这是 Milvus 2.0 新功能系列博客的压轴文章。继本系列之后,我们计划推出一个新的 Milvus深度系列,介绍 Milvus 2.0 的基本架构。敬请期待。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word