Milvus 如何平衡各節點的查詢負載?
Binlog 封面圖片
作者:葛曦
在之前的博客文章中,我們相繼介紹了 Milvus 2.0 中的 Deletion、Bitset 和 Compaction 功能。在本系列文章的最後,我們想分享一下負載平衡背後的設計,這是 Milvus 分佈式集群的一個重要功能。
執行
當查詢節點緩衝的片段數量和大小不同時,各查詢節點的搜尋效能也可能不同。最糟糕的情況可能發生在幾個查詢節點在大量資料上搜尋到精疲力竭,但新建立的查詢節點卻因為沒有分段給它們而一直閒置,造成 CPU 資源的大量浪費和搜尋效能的大幅下降。
為了避免這種情況,查詢協調器 (query coordinator) 被編程為根據各查詢節點的 RAM 使用量,將區段平均分配給各查詢節點。因此,CPU 資源在各節點上被平均消耗,從而大幅提升搜尋效能。
觸發自動負載平衡
根據配置queryCoord.balanceIntervalSeconds
的預設值,查詢協調器每 60 秒檢查一次所有查詢節點的 RAM 使用量(百分比)。如果滿足下列任一條件,查詢協調器就會開始平衡各查詢節點的查詢負載:
- 群集中任何查詢節點的 RAM 使用量大於
queryCoord.overloadedMemoryThresholdPercentage
(預設值:90); - 或任何兩個查詢節點的 RAM 使用量差異的絕對值大於
queryCoord.memoryUsageMaxDifferencePercentage
(預設值:30)。
網段從來源查詢節點傳送到目的地查詢節點後,也必須同時滿足下列兩個條件:
- 目的地查詢節點的 RAM 使用量不超過
queryCoord.overloadedMemoryThresholdPercentage
(預設值:90); - 負載平衡後,來源查詢節點和目的查詢節點的 RAM 使用量差異的絕對值小於負載平衡前的差異。
在滿足上述條件的情況下,查詢協調器會繼續平衡各節點的查詢負載。
負載平衡
當負載平衡被觸發,查詢協調器首先載入目標段到目的地查詢節點。此時,兩個查詢節點都會在任何查詢請求中回傳目標網段的查詢結果,以保證結果的完整性。
在目的地查詢節點成功載入目標網段後,查詢協調器會發佈sealedSegmentChangeInfo
到查詢頻道。如下圖所示,onlineNodeID
和onlineSegmentIDs
分別表示載入網段的查詢節點和載入的網段,offlineNodeID
和offlineSegmentIDs
分別表示需要釋放網段的查詢節點和要釋放的網段。
sealedSegmentChangeInfo
收到sealedSegmentChangeInfo
後,來源查詢節點就會釋放目標網段。
負載平衡工作流程
當源查詢節點釋放目標網段時,整個流程就成功了。完成此步驟後,查詢節點間的查詢負載就被設定為平衡,也就是所有查詢節點的 RAM 使用量都不大於queryCoord.overloadedMemoryThresholdPercentage
,而且負載平衡後來源查詢節點和目標查詢節點的 RAM 使用量差異的絕對值小於負載平衡前的差異。
下一步是什麼?
在 2.0 新功能系列部落格中,我們的目標是解釋新功能的設計。閱讀此系列部落格的更多內容!
這是 Milvus 2.0 新功能博客系列的壓軸篇。在此系列之後,我們正計劃一個新的 MilvusDeep Dive 系列,介紹 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