如何在 Milvus 中壓縮資料?
Binlog 封面圖片
隨著 Milvus 2.0 GA 的正式發行,一連串的新功能也被支援。其中,壓縮是可以幫助您節省儲存空間的新功能之一。
壓縮是指將小區段合併為大區段,並清理邏輯上已刪除資料的過程。換句話說,壓縮是透過清除 binlog 中已刪除或過期的實體來減少磁碟空間的使用。在 Milvus 中,這是一項由資料協調器觸發、資料節點執行的背景工作。
這篇文章剖析了在 Milvus 中壓縮的概念和實現。
什麼是壓縮?
在深入討論如何在 Milvus 2.0 實作壓縮的細節之前,先搞清楚什麼是 Milvus 的壓縮是很重要的。
很多時候,身為 Milvus 的使用者,您可能會因為硬碟空間使用率越來越高而感到困擾。另一個問題是,少於 1,024 行的區段是沒有索引的,只支援暴力搜尋來處理查詢。自動刷新或使用者啟動刷新所造成的小區段可能會妨礙查詢效率。
因此,為了解決上述兩個問題,並協助減少磁碟使用量和提高查詢效率,Milvus 支援壓縮。
LevelDB和RocksDB等資料庫會將資料追加到排序字串表 (SSTables) 中。每次查詢的平均磁碟讀取次數會隨著 SSTables 的數量而增加,導致查詢效率降低。為了減少讀取擴大並釋放硬碟空間,這些資料庫會將 SSTables 壓縮成一個。壓縮程序會在背景自動執行。
同樣地,Milvus 會將插入和刪除的資料追加到binlog。隨著 binlog 數量的增加,會使用更多的硬碟空間。為了釋放硬碟空間,Milvus 會壓縮已刪除和已插入資料的 binlog。如果一個實體被插入但後來被刪除,一旦壓縮後,它就不再存在於記錄資料插入或刪除的 binlog 中。此外,Milvus 還壓縮段- 由 Milvus 自動創建的用於保存插入數據的數據文件。
如何配置壓縮?
在 Milvus 中配置壓縮主要涉及兩個參數:dataCoord.enableCompaction
和common.retentionDuration
。
dataCoord.enableCompaction
指定是否啟用壓縮。它的默認值是 。true
common.retentionDuration
指定壓縮不執行的期間。其單位為秒。當您壓縮資料時,所有刪除的實體將不能使用 Time Travel 搜尋。因此,如果您計劃使用 Time Travel 搜尋,您必須指定一段壓縮不執行且不影響已刪除資料的時間。為了確保使用時間旅行搜尋的結果準確,Milvus 會保留在 指定的期間內操作的資料。也就是說,在這個期間操作的資料不會被壓縮。如需詳細資訊,請參閱common.retentionDuration
使用時間旅行搜尋。
Milvus 預設啟用壓縮。如果您關閉了壓縮,但之後想手動啟用它,您可以按照下面的步驟操作:
- 呼叫
collection.compact()
方法來手動觸發全局壓縮程序。但是請注意,此操作可能需要很長的時間。 - 呼叫該方法後,會傳回一個壓縮 ID。透過呼叫
collection.get_compaction_state()
方法來檢視壓縮狀態。
啟用壓縮後,它會在背景自動執行。由於壓縮過程可能需要很長時間,為了節省時間,壓縮請求會以非同步方式處理。
如何實現壓縮?
在 Milvus 中,您可以選擇手動或自動執行壓縮。
手動壓縮 binlog 或區段不需要滿足任何觸發條件。因此,如果您手動啟動壓縮,無論如何 binlog 或區段都會被壓縮。
但是,如果要啟用自動壓縮,則需要滿足某些壓縮觸發條件,系統才會壓縮區段或 binlog。
一般而言,在 Milvus 中有兩種類型的物件可以壓縮:binglog 和片段。
binlog 的壓縮
binlog 是二進位日誌,或是段中較小的單元,記錄並處理 Milvus 向量資料庫中資料的更新與變更。一個區段的資料會持久存在多個 binlog 中。在 Milvus 中,二進位日誌壓縮涉及兩種類型的二進位日誌:插入式二進位日誌(insert binlogs)和遞減式二進位日誌(delta binlogs)。
Delta binlog 在刪除資料時產生,而插入 binlog 則在下列三種情況下產生。
- 當插入的資料被追加時,區段的大小達到上限,並自動刷新到磁碟。
- DataCoord 會自動刷新長時間未封存的區段。
- 一些 API(如
collection.num_entities
、collection.load()
等)會自動調用 flush 來將區段寫入磁碟。
因此,binlog compaction,顧名思義,是指壓縮區段內的 binlog。更明確地說,在 binlog 壓縮期間,所有未保留的 delta binlog 和插入 binlog 都會被壓縮。
binlog 壓縮
當區段被刷新到磁碟,或 Milvus 因為壓縮長時間未執行而要求全局壓縮時,至少需要滿足以下兩個條件之一,才能觸發自動壓縮:
- delta binlogs 中的行數超過總行數的 20%。
- delta binlog 的大小超過 10 MB。
區段壓縮
段是 Milvus 自動建立的資料檔案,用來存放插入的資料。Milvus 有兩種類型的區段:成長區段和封閉區段。
成長中的區段持續接收新插入的資料,直到它被封閉。封閉的區段不再接收任何新資料,並會被刷新到物件儲存空間,留下新資料插入新建立的成長中區段。
因此,段壓縮是指壓縮多個密封的段。更明確地說,在段壓縮期間,小段會被壓縮成較大的段。
分段壓實
壓縮後產生的每個區段不能超過區段大小的上限,預設為 512 MB。請閱讀系統設定,瞭解如何修改磁區段大小的上限。
當區段刷新到磁碟,或 Milvus 因為壓縮長時間未執行而要求全局壓縮時,需要滿足以下條件才能觸發自動壓縮:
- 區段小於 0.5 *
MaxSegmentSize
大於 10。
下一步是什麼?
學習了 Milvus 的壓縮基礎之後,接下來該做什麼?目前,在milvus.yaml
檔案中並沒有配置壓縮的所有參數,而且計畫產生的策略也比較基本。如果您有興趣,歡迎來為 Milvus 這個開放原始碼專案貢獻心力!
另外,在 2.0 新功能系列部落格中,我們的目標是解釋新功能的設計。閱讀此系列部落格的更多內容!
關於作者
孫秉義,Milvus 項目高級軟體工程師,在上海交通大學取得軟體工程碩士學位。他主要負責開發 Milvus 2.0 的儲存相關元件。他的興趣領域是資料庫和分散式系統。他是開源專案的忠實粉絲,也是一位美食家,閒暇時喜歡玩遊戲機和閱讀。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word