使用 Milvus 向量資料庫進行即時查詢
封面圖片
在上一篇文章中,我們介紹了Milvus中的數據插入和數據持久化。在這篇文章中,我們將繼續解釋 Milvus 中不同的元件如何互動來完成即時資料查詢。
在開始之前,下面列出了一些有用的資源。我們建議您先閱讀這些資源,以便更好地理解本篇文章的主題。
將資料載入查詢節點
在執行查詢之前,必須先將資料載入查詢節點。
有兩種類型的資料會被載入查詢節點:來自日誌代理的串流資料,以及來自物件儲存(以下也稱為持久化儲存)的歷史資料。
流程圖
Data coord 負責處理不斷插入 Milvus 的串流資料。當 Milvus 使用者呼叫collection.load()
載入一個資料集時,查詢協調器會查詢資料協調器,以瞭解哪些片段已被持久化儲存及其對應的檢查點。檢查點(checkpoint)是一個標記,表示在檢查點之前被持久化的區段會被消耗,而檢查點之後的區段不會被消耗。
然後,查詢協調器根據資料協調器的資訊輸出分配策略:按區段或按通道。段分配器負責將持久性儲存(批次資料)中的段分配給不同的查詢節點。例如,在上圖中,區段分配器將區段 1 和 3 (S1, S3) 分配給查詢節點 1,將區段 2 和 4 (S2, S4) 分配給查詢節點 2。通道分配器會指派不同的查詢節點觀看日誌代理程式中的多個資料操作通道(DMChannels)。例如,在上圖中,通道分配器指派查詢節點 1 觀看通道 1 (Ch1),指派查詢節點 2 觀看通道 2 (Ch2)。
在此分配策略下,每個查詢節點會載入段資料,並依此觀看頻道。在圖中的查詢節點 1 中,歷史資料 (批次資料) 透過分配的 S1 和 S3 從持久性儲存空間載入。同時,查詢節點 1 透過訂閱日誌經紀人的頻道 1 載入增量資料 (串流資料)。
查詢節點的資料管理
查詢節點需要管理歷史和增量資料。歷史資料儲存在封存區段中,而增量資料則儲存在成長中的區段中。
歷史資料管理
歷史資料管理主要有兩個考量:負載平衡和查詢節點故障移轉。
負載平衡
例如,如圖所示,查詢節點 4 獲分配的密封區段比其他查詢節點多。這很有可能使查詢節點 4 成為瓶頸,拖慢整個查詢流程。為了解決這個問題,系統需要將查詢節點 4 中的數個網段分配給其他查詢節點。這稱為負載平衡。
查詢節點故障移轉
另一種可能的情況如上圖所示。其中一個節點 (查詢節點 4) 突然宕機。在這種情況下,負載 (分配給查詢節點 4 的區段) 需要轉移到其他工作的查詢節點,以確保查詢結果的準確性。
增量資料管理
查詢節點觀看 DMChannels 以接收增量資料。在此過程中會引入 Flowgraph。它首先過濾所有資料插入訊息。這是為了確保只有指定分區的資料會被載入。Milvus 中的每個集合都有相對應的通道,該通道由該集合中的所有分割區共享。因此,如果 Milvus 使用者只需要載入某個分割區中的資料,就需要流程圖來過濾插入的資料。否則,集合中所有分區的資料都會載入查詢節點。
經過篩選後,增量資料會插入到成長中的區段,並進一步傳送到伺服器時間節點。
流程圖
在資料插入過程中,每個插入訊息都會指定一個時間戳記。在上圖所示的 DMChannel 中,資料從左至右依序插入。第一個插入訊息的時間戳是 1;第二個是 2;第三個是 6。 第四個以紅色標示的訊息不是插入訊息,而是時間戳訊息。這表示時間戳小於這個時間刻度的插入資料已經在日誌經紀人中。換句話說,在此 timetick 訊息之後插入的資料,其時間戳值都應該大於此 timetick。例如,在上圖中,當查詢節點感知到目前的 timetick 為 5 時,表示所有時間戳值小於 5 的插入訊息都會被載入查詢節點。
伺服器時間節點每次收到插入節點的 timetick 時,都會提供一個更新的tsafe
值。tsafe
表示安全時間,所有在這個時間點之前插入的資料都可以被查詢。舉例來說,如果tsafe
= 9,小於 9 的時間戳的插入資料都可以被查詢。
Milvus 中的實時查詢
Milvus 的即時查詢是透過查詢訊息來啟用的。查詢訊息由代理插入日誌經紀人。然後,查詢節點透過觀看日誌經紀人的查詢通道來取得查詢訊息。
查詢訊息
查詢訊息
查詢訊息包括以下關於查詢的重要資訊:
msgID
:訊息 ID,系統指定的查詢訊息 ID。collectionID
:要查詢的集合 ID (如果使用者指定)。execPlan
:執行計畫主要用於查詢中的屬性篩選。service_ts
:服務時間戳會與上述tsafe
一起更新。服務時間戳表示服務是在哪個時間點。在service_ts
之前插入的所有資料都可供查詢。travel_ts
:行程時間戳指定過去的時間範圍。查詢將在travel_ts
指定的時間範圍內的資料上進行。guarantee_ts
:Guarantee timestamp(保證時間戳記):保證時間戳記指定查詢需要進行的時間段。只有當service_ts
>guarantee_ts
時,才會進行查詢。
即時查詢
查詢流程
當收到查詢訊息時,Milvus 會先判斷目前的服務時間service_ts
是否大於查詢訊息中的保證時間戳guarantee_ts
。如果是,則執行查詢。查詢會在歷史資料和增量資料上平行進行。由於串流資料和批次資料之間可能會有資料重疊,因此需要一個稱為 "local reduce "的動作來過濾掉多餘的查詢結果。
然而,如果當前的服務時間小於新插入查詢訊息中的保證時間戳,則查詢訊息將成為未解決的訊息,等待服務時間大於保證時間戳時再進行處理。
查詢結果最終會推送到結果通道。代理從該通道取得查詢結果。同樣地,proxy 也會進行「全域還原」,因為它會收到來自多個查詢節點的結果,而且查詢結果可能是重複的。
為了確保代理程式在回傳所有查詢結果給 SDK 之前,已經收到所有查詢結果,結果訊息也會保留資訊記錄,包括搜尋過的封閉區段、搜尋過的 DMChannels,以及全局封閉區段 (所有查詢節點上的所有區段)。只有滿足以下兩個條件,系統才能斷定代理已收到所有查詢結果:
- 所有結果訊息中記錄的所有搜尋的封存區段的聯合大於全局封存區段、
- 集合中的所有 DMChannels 都被查詢。
最後,proxy 將「全域還原」後的最終結果回傳給 Milvus SDK。
關於 Deep Dive 系列
隨著 Milvus 2.0正式宣布全面上市,我們安排了這個 Milvus Deep Dive 系列部落格,提供對 Milvus 架構和原始碼的深入詮釋。本系列部落格涵蓋的主題包括
- 將資料載入查詢節點
- 查詢節點的資料管理
- Milvus 中的實時查詢
- 關於 Deep Dive 系列
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word