如何使用內存中副本提高矢量數據庫的讀取吞吐量
譯文譯者 | 李睿
審校 | 孫淑娟
在正式發布之后,Milvus 2.1增加了許多新功能,例如內存副本、支持字符串數據類型、嵌入式Milvus、可調一致性、用戶身份驗證和傳輸中的加密,以提供便利和更好的用戶體驗。雖然內存中副本的概念對于分布式數據庫來說并不新鮮,但它是一個關鍵功能,可以幫助用戶輕松提高系統性能、提高數據庫讀取吞吐量,并提高硬件資源的利用率。
因此,本文首先解釋了內存中的副本是什么以及為什么它很重要的原因,然后介紹了如何在人工智能的矢量數據庫Milvus中啟用這一新功能。
與內存中副本相關的概念
在了解內存中副本是什么以及為什么這么重要之前,需要先了解一些相關概念,其中包括副本組、分片副本、流副本、歷史副本和分片領導者。下圖是這些概念的說明。
副本概念
(1)副本組
副本組由負責處理歷史數據和副本的多個查詢節點組成。更具體地說,Milvus向量數據庫中的查詢節點檢索增量日志數據,并通過訂閱日志代理、從對象存儲中加載歷史數據以及在向量和標量數據之間運行混合搜索,將其轉變成為不斷增長的片段。
(2)分片副本
一個分片副本由一個流副本和一個歷史副本組成,它們都屬于同一個分片(即數據操作語言通道,在Milvus中縮寫為DML通道)。多個分片副本組成一個副本組。并且副本組中的分片副本的確切數量由指定集合中的分片數量決定。
(3)流副本
流副本包含來自同一DML通道的所有不斷增長的段。不斷增長的段不斷接收新插入的數據,直到它被密封。從技術上講,一個流副本應該由一個副本中的一個查詢節點提供服務。
(4)歷史副本
歷史副本包含來自同一DML通道的所有密封段。密封段不再接收任何新數據,并將被刷新到對象存儲中,將新數據插入到新創建的增長段中。一個歷史副本的密封段可以分布在同一副本組內的多個查詢節點上。
(5)分片領導者
分片領導者是為分片副本中的流式副本提供服務的查詢節點。
什么是內存副本?
啟用內存中副本允許用戶將數據加載到多個查詢節點上的集合中,以便可以利用額外的CPU和內存資源。換句話說,當在集合中加載數據并指定要將其作為兩個副本加載時,最終將在兩個查詢節點上擁有兩個數據副本。如果有一個相對較小的數據集,但希望增加讀取吞吐量,并提高硬件資源的利用率,則內存中副本的功能非常有用。
在默認情況下,Milvus矢量數據庫目前在內存中為每個段保存一個副本。但是,使用內存中的副本,用戶可以在不同的查詢節點上對一個段進行多次復制。這意味著如果一個查詢節點正在對某個段進行搜索,則可以將傳入的新搜索請求分配給另一個空閑查詢節點,因為該查詢節點具有完全相同的段的復制。其好處是不必再次重新加載數據。用戶無需執行任何操作,空閑查詢節點會自動進行搜索或查詢,因為該查詢節點已經復制并接收了數據。
此外,如果有多個內存中的副本,可以更好地應對查詢節點崩潰的情況。如果沒有內存中的副本,則必須等待段重新加載才能繼續并在另一個查詢節點上搜索。但是,通過內存復制,可以立即將搜索請求重新發送到新的查詢節點,而無需再次重新加載數據,如下圖所示:
內存中的副本
為什么內存中的副本很重要?
啟用內存中副本的最顯著好處之一是整體QPS(每秒查詢數)和吞吐量的增加。如果在使用Milvus矢量數據庫時啟用了內存中的副本,將能夠看到系統性能的巨大飛躍。此外,使用內存中的副本,可以維護多個段副本,并且系統在面對故障轉移時更具彈性,就像上面的示例一樣。
在Milvus矢量數據庫中啟用內存中的副本
在Milvus矢量數據庫中啟用內存中副本的新功能很容易。需要做的只是在加載集合時指定所需的副本數量(即調用collection.load( ))。
在下面的教程中,將使用包含書籍信息的集合的示例。假設已經創建了一個名為“book”的集合,并將數據插入其中。然后,可以指定在加載集合數據時要創建的副本數。下面的示例代碼將集合加載為兩個副本。
用戶可以靈活修改上述示例代碼中的副本數,以最適合應用場景。然后可以直接對多個副本進行向量相似性搜索或查詢,而無需運行任何額外的命令。但是,應該注意,允許的最大副本數受到運行查詢節點的可用內存總量的限制。如果指定的副本數量超過可用內存的限制,則在數據加載期間將返回錯誤。
用戶還可以通過運行collection.get_replicas()檢查其創建的內存中副本的信息。將返回副本組的信息以及相應的查詢節點和分片。以下是輸出示例:
原文標題:??Increase Your Vector Database Read Throughput with In-Memory Replicas???,作者:Angela Ni?