資料處理

本文將詳細介紹 Milvus 中資料插入、索引建立和資料查詢的實作。

資料插入

在 Milvus 中,您可以選擇一個集合使用多少個分片 - 每個分片映射到一個虛擬通道(vchannel)。如下圖所示,Milvus 會將每個vchannel指派給一個實體通道(pchannel),而每個pchannel都會綁定到特定的 Streaming Node。

VChannel PChannel and StreamingNode VChannel PChannel 和 StreamingNode

資料驗證完成後,proxy 會依照指定的分片路由規則,將寫入的訊息分割成不同的資料包分片。

Channels 1 通道 1

然後將其中一個分片(vchannel) 的寫入資料傳送至pchannel 對應的 Streaming Node。

write flow 寫入流程

Streaming Node 會為每個資料封包指定一個 Timestamp Oracle (TSO),以建立總的作業順序。在將資料寫入底層的預先寫入日誌 (WAL) 之前,它會對有效負載執行一致性檢查。一旦資料持久地承諾到 WAL,就保證不會遺失 - 即使發生當機,Streaming Node 也能重播 WAL,以完全恢復所有待執行的作業。

與此同時,StreamingNode 也會以非同步的方式,將已提交的 WAL 項目切成不連續的區段。有兩種區段類型:

  • Growing segment (成長中區段):任何尚未預先存入物件儲存空間的資料。
  • 密封區段:所有資料都已持久化到物件儲存空間,密封區段的資料是不可變的。

成長區段轉換為封閉區段稱為 flush。當 Streaming Node 攝取並寫入該區段的所有可用 WAL 紀錄(即底層寫入日誌中沒有更多待寫紀錄)後,它會立即觸發 flush。

索引建立

索引建立由資料節點執行。為了避免因資料更新而頻繁建立索引,Milvus 會將資料集進一步分割成區段,每個區段都有自己的索引。

Index building 索引建立

Milvus 支援為每個向量欄位、標量欄位和主要欄位建立索引。索引建立的輸入和輸出都與物件儲存有關:資料節點會將要建立索引的日誌快照從區段(位於物件儲存空間)載入記憶體,再將對應的資料和元資料反序列化以建立索引,當索引建立完成時,再將索引序列化,並將其寫回物件儲存空間。

索引建立主要涉及向量和矩陣運算,因此需要大量的運算和記憶體。向量因其高維度的特性,無法使用傳統的樹狀索引有效率地建立索引,但可以使用此領域較成熟的技術建立索引,例如群集或圖表索引。無論是哪一種類型,建立索引都會涉及到大規模向量的大量反覆計算,例如 Kmeans 或圖形遍歷。

與標量資料的索引不同,建立向量索引必須充分利用 SIMD (單指令、多資料) 加速。Milvus 天生就支援 SIMD 指令集,例如 SSE、AVX2 和 AVX512。鑑於向量索引建立的「打嗝」與資源密集性質,彈性對 Milvus 的經濟效益而言變得極為重要。未來的 Milvus 版本將進一步探索異質運算與無伺服器運算,以降低相關成本。

此外,Milvus 也支援標量篩選與主要欄位查詢。它有內建索引來提高查詢效率,例如 Bloom 過濾索引、hash 索引、樹狀索引和倒置索引,並計劃引入更多外部索引,例如位圖索引和粗略索引。

資料查詢

資料查詢是指在指定的集合中搜尋與目標向量最接近的k 個向量或與向量在指定距離範圍內的所有向量的過程。向量會連同其對應的主索引鍵及欄位一起傳回。

Data query 資料查詢

Milvus 中的一個集合被分割成多個區段;Streaming Node 負載成長中的區段並維護即時資料,而 Query Nodes 負載封存的區段。

當查詢/搜尋請求到達時,代理會將請求廣播到所有負責相關分片的 Streaming 節點,以進行並行搜尋。

當查詢請求到達時,代理會同時請求持有相對應分片的串流節點執行搜尋。

每個 Streaming 節點會產生查詢計畫、搜尋其本機成長中的資料,並同時聯繫遠端查詢節點以擷取歷史結果,然後將這些結果彙總成單一分片結果。

最後,代理收集所有分片結果,將它們合併為最後的結果,並傳回給用戶端。

Handoff 移交

當串流節點上的成長區段刷新成密封區段時,或資料節點完成壓縮時,協調器啟動交接作業,將成長中的資料轉換成歷史資料。然後,協調器將封閉區段平均分配到所有查詢節點,平衡記憶體使用量、CPU 開銷和區段數量,並釋放任何冗餘區段。

下一步

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?