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

milvus-logo
LFAI
  • Home
  • Blog
  • 使用內存複製提高向量資料庫的讀取吞吐量

使用內存複製提高向量資料庫的讀取吞吐量

  • Engineering
August 22, 2022
Congqi Xia

Cover_image 封面圖片

本文由夏琮琦倪安琪共同撰寫。

隨著 Milvus 2.1 的正式發布,Milvus 2.1 帶來了許多新功能,為用戶提供了便利和更好的用戶體驗。雖然對於分散式資料庫的世界來說,記憶體內複製的概念並不新鮮,但它卻是一個重要的功能,可以幫助您毫不費力地提升系統效能、增強系統可用性。因此,這篇文章將解釋何謂記憶體內複製以及其重要性,然後介紹如何在用於人工智能的向量資料庫 Milvus 中啟用這項新功能。

跳至:

在瞭解什麼是記憶體內複製以及為什麼它很重要之前,我們需要先瞭解幾個相關的概念,包括複製群組、分片複製、串流複製、歷史複製和分片領導者。下圖說明了這些概念。

Replica_concepts 複製概念

複製群組

複製群組由多個負責處理歷史資料和複製品的查詢節點組成。

分片複製

一個分片複製本由一個串流複製本和一個歷史複製本組成,兩者都屬於同一個分片(即 DML 通道)。多個分片副本組成一個副本群組。複製群組中分片複製本的確實數量由指定集合中的分片數量決定。

串流複製

流複製包含來自相同 DML 通道的所有成長區段。技術上來說,一個串流複製應該只由一個複製中的一個查詢節點提供服務。

歷史副本

歷史副本包含來自相同 DML 通道的所有封存區段。一個歷史副本的封存區段可以分佈在同一個副本群組內的多個查詢節點上。

分片領導者

分片領導者是在分片複製中服務於串流複製的查詢節點。

什麼是記憶體複製?

啟用記憶體內複製可讓您在多個查詢節點上載入集合中的資料,以便充分利用額外的 CPU 和記憶體資源。如果您的資料集相對較小,但希望增加讀取吞吐量並提高硬體資源的利用率,則此功能非常有用。

Milvus 向量資料庫目前在記憶體中為每個區段保留一個副本。不過,有了記憶體內複製,您可以在不同的查詢節點上對一個區段進行多次複製。這表示如果有一個查詢節點正在對某一區段進行搜尋,傳入的新搜尋請求可以分配給另一個閒置的查詢節點,因為這個查詢節點擁有完全相同區段的複製。

此外,如果我們有多個在記憶體中的複製,就可以更好地應付查詢節點當機的情況。之前,我們必須等待區段重新載入,才能在另一個查詢節點上繼續搜尋。但是,有了記憶體內複製,搜尋要求可以立即重新傳送到新的查詢節點,而不需要再次重新載入資料。

Replication 複製

為什麼記憶體內複製很重要?

啟用「記憶體內複製」的最顯著好處之一,是可提高整體 QPS(每秒查詢次 數)和吞吐量。此外,可以維護多個網段複製,而且系統在面臨故障轉移時更具彈性。

在 Milvus 向量資料庫中啟用記憶體內副本

在 Milvus 向量資料庫中啟用記憶體內複製的新功能並不費力。您只需要在載入集合時指定您想要的副本數量(即呼叫collection.load() )。

在下面的示例教程中,我們假設您已經創建了一個名為 "book "的集合,並在其中插入了資料。然後,您可以執行以下指令,在載入書本集合時建立兩個複本。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load(replica_number=2) # load collection as 2 replicas

您可以靈活修改上述示例程式碼中的副本數量,以最適合您的應用程式情境。之後,您就可以直接在多個複本上進行向量相似性搜尋或 查詢,而不需要執行任何額外的指令。但需要注意的是,允許的最大複製本數量受限於執行查詢節點的可用記憶體總量。如果您指定的副本數量超過可用記憶體的限制,在資料載入時會傳回錯誤。

您也可以透過執行collection.get_replicas() 來檢查您所建立的記憶體內複製群組的資訊。將傳回複製群組以及相應查詢節點和分片的資訊。以下是輸出的範例。

Replica groups:
- Group: <group_id:435309823872729305>, <group_nodes:(21, 20)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:21>, <shard_nodes:[21]>, Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:20>, <shard_nodes:[20, 21]>]>
- Group: <group_id:435309823872729304>, <group_nodes:(25,)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:25>, <shard_nodes:[25]>, Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:25>, <shard_nodes:[25]>]>

下一步

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

Like the article? Spread the word

繼續閱讀