🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
  • Home
  • Blog
  • 瞭解 Milvus 向量資料庫的一致性等級 - 第二部分

瞭解 Milvus 向量資料庫的一致性等級 - 第二部分

  • Engineering
September 13, 2022
Jiquan Long

Cover_image 封面圖片

本文作者龍吉全倪安琪轉載。

上一篇關於一致性的博客中,我們解釋了什麼是分散式向量資料庫一致性的內涵,涵蓋了Milvus向量資料庫所支援的四個一致性等級--強一致性、有邊界的不穩定性、會話一致性和最終一致性,並解釋了每個一致性等級最適合的應用場景。

在本篇文章中,我們將繼續探討 Milvus 向量資料庫背後的機制,讓使用者可以針對不同的應用情境,彈性地選擇理想的一致性層級。我們也將提供如何在 Milvus 向量資料庫中調整一致性等級的基本教學。

跳到

底層時間刻度機制

當進行向量搜尋或查詢時,Milvus 使用時間刻度機制來確保不同等級的一致性。時間刻度是 Milvus 的水印,它就像 Milvus 的時鐘,標誌著 Milvus 系統處於哪個時間點。每當有資料處理語言 (DML) 請求傳送至 Milvus 向量資料庫時,它會指定一個時間戳記。如下圖所示,當有新的資料插入訊息佇列時,Milvus 不僅會在這些插入的資料上標記時間戳,也會以固定的間隔插入時間刻度。

timetick 時間刻度

讓我們以上圖中的syncTs1 為例。當下游的消費者 (例如查詢節點) 看到syncTs1 時,消費者元件就會明白,所有早於syncTs1 插入的資料都已被消耗。換句話說,時間戳值小於syncTs1 的資料插入請求將不再出現在訊息佇列中。

保證時間戳記

如上一節所述,下游消費者元件 (如查詢節點) 會持續從訊息佇列取得資料插入請求和時間刻度的訊息。每消耗一個時間刻度,查詢節點就會將這個消耗的時間刻度標記為可服務時間 -ServiceTime ,查詢節點可以看到所有在ServiceTime 之前插入的資料。

除了ServiceTime 之外,Milvus 還採用了一種時間戳 - 保證時間戳 (GuaranteeTS) 來滿足不同使用者對不同等級的一致性和可用性的需求。這表示 Milvus 向量資料庫的使用者可以指定GuaranteeTs ,以便通知查詢節點在進行搜尋或查詢時,GuaranteeTs 之前的所有資料都應該是可見和涉及的。

當查詢節點在 Milvus 向量資料庫中執行搜尋請求時,通常有兩種情況。

情況一:立即執行搜尋請求

如下圖所示,如果GuaranteeTs 小於ServiceTime ,查詢節點可以立即執行搜尋請求。

execute_immediately execute_immediately

情況二:等待至 "ServiceTime > GuaranteeTs" 為止

如果GuaranteeTs 大於ServiceTime ,查詢節點必須繼續消耗訊息佇列中的時間 tick。在ServiceTime 大於GuaranteeTs 之前,查詢請求無法執行。

wait_search 等待搜尋

一致性等級

因此,GuaranteeTs 可在搜尋請求中設定,以達到您指定的一致性等級。具有較大值的GuaranteeTs 可確保強一致性,但代價是較高的搜尋延遲。而一個小值的GuaranteeTs 可以減少搜尋延遲,但資料的可見性則會受到影響。

GuaranteeTs 在 Milvus 是一種混合時間戳格式。而使用者並不知道 Milvus 內的TSO。因此,對使用者來說,指定 的值是一項非常複雜的任務。為了節省用戶的麻煩,提供最佳的用戶體驗,Milvus 只需要用戶選擇特定的一致性等級,Milvus 向量資料庫就會自動為用戶處理 的值。也就是說,Milvus 的使用者只需要從四個一致性等級中選擇:, , , 和 。而每個一致性等級都對應某個 值。GuaranteeTs GuaranteeTs Strong Bounded Session Eventually GuaranteeTs

下圖說明了 Milvus 向量資料庫中四個一致性等級的GuaranteeTs

guarantee_ts 保證

Milvus 向量資料庫支援四種一致性等級:

  • CONSISTENCY_STRONG:GuaranteeTs 設定為與最新系統時間戳相同的值,查詢節點會等到服務時間進行到最新系統時間戳時才處理搜尋或查詢請求。

  • CONSISTENCY_EVENTUALLYGuaranteeTs 設定為小於最新系統時間戳的微不足道的值,以跳過一致性檢查。查詢節點會立即在現有資料檢視上進行搜尋。

  • CONSISTENCY_BOUNDEDGuaranteeTs 設定為相對小於最新系統時間戳記的值,查詢節點會在更新較少的資料檢視上進行搜尋。

  • CONSISTENCY_SESSION:用戶端使用最後一次寫入操作的時間戳作為GuaranteeTs ,這樣每個用戶端至少可以檢索到自己插入的資料。

如何在 Milvus 中調整一致性等級?

Milvus 支援在建立資料集、進行搜尋查詢時調整一致性層級。

要以您想要的一致性等級進行向量相似性搜尋,只需設定參數consistency_level 的值為Strong,Bounded,Session, 或Eventually 。如果您沒有設定參數consistency_level 的值,一致性等級預設為Bounded 。本範例以Strong 的一致性進行向量相似性查詢。

results = collection.search(
        data=[[0.1, 0.2]], 
        anns_field="book_intro", 
        param=search_params, 
        limit=10, 
        expr=None,
        consistency_level="Strong"
)

進行向量查詢

與進行向量相似性搜尋類似,您可以在進行向量查詢時指定參數consistency_level 的值。範例以Strong 的一致性進行向量查詢。

res = collection.query(
  expr = "book_id in [2,4,6,8]", 
  output_fields = ["book_id", "book_intro"],
  consistency_level="Strong"
)

下一步

隨著 Milvus 2.1 正式發行,我們準備了一系列介紹新功能的部落格。閱讀此系列部落格的更多內容:

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

繼續閱讀