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