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

milvus-logo
LFAI
  • Home
  • Blog
  • 如何在 Milvus 中壓縮資料?

如何在 Milvus 中壓縮資料?

  • Engineering
February 21, 2022
Bingyi Sun

Binlog Cover Image Binlog 封面圖片

作者:孫斌義倪安琪

隨著 Milvus 2.0 GA 的正式發行,一連串的新功能也被支援。其中,壓縮是可以幫助您節省儲存空間的新功能之一。

壓縮是指將小區段合併為大區段,並清理邏輯上已刪除資料的過程。換句話說,壓縮是透過清除 binlog 中已刪除或過期的實體來減少磁碟空間的使用。在 Milvus 中,這是一項由資料協調器觸發、資料節點執行的背景工作。

這篇文章剖析了在 Milvus 中壓縮的概念和實現。

什麼是壓縮?

在深入討論如何在 Milvus 2.0 實作壓縮的細節之前,先搞清楚什麼是 Milvus 的壓縮是很重要的。

很多時候,身為 Milvus 的使用者,您可能會因為硬碟空間使用率越來越高而感到困擾。另一個問題是,少於 1,024 行的區段是沒有索引的,只支援暴力搜尋來處理查詢。自動刷新或使用者啟動刷新所造成的小區段可能會妨礙查詢效率。

因此,為了解決上述兩個問題,並協助減少磁碟使用量和提高查詢效率,Milvus 支援壓縮。

LevelDBRocksDB等資料庫會將資料追加到排序字串表 (SSTables) 中。每次查詢的平均磁碟讀取次數會隨著 SSTables 的數量而增加,導致查詢效率降低。為了減少讀取擴大並釋放硬碟空間,這些資料庫會將 SSTables 壓縮成一個。壓縮程序會在背景自動執行。

同樣地,Milvus 會將插入和刪除的資料追加到binlog。隨著 binlog 數量的增加,會使用更多的硬碟空間。為了釋放硬碟空間,Milvus 會壓縮已刪除和已插入資料的 binlog。如果一個實體被插入但後來被刪除,一旦壓縮後,它就不再存在於記錄資料插入或刪除的 binlog 中。此外,Milvus 還壓縮段- 由 Milvus 自動創建的用於保存插入數據的數據文件。

如何配置壓縮?

在 Milvus 中配置壓縮主要涉及兩個參數:dataCoord.enableCompactioncommon.retentionDuration

dataCoord.enableCompaction 指定是否啟用壓縮。它的默認值是 。true

common.retentionDuration 指定壓縮不執行的期間。其單位為秒。當您壓縮資料時,所有刪除的實體將不能使用 Time Travel 搜尋。因此,如果您計劃使用 Time Travel 搜尋,您必須指定一段壓縮不執行且不影響已刪除資料的時間。為了確保使用時間旅行搜尋的結果準確,Milvus 會保留在 指定的期間內操作的資料。也就是說,在這個期間操作的資料不會被壓縮。如需詳細資訊,請參閱common.retentionDuration使用時間旅行搜尋

Milvus 預設啟用壓縮。如果您關閉了壓縮,但之後想手動啟用它,您可以按照下面的步驟操作:

  1. 呼叫collection.compact() 方法來手動觸發全局壓縮程序。但是請注意,此操作可能需要很長的時間。
  2. 呼叫該方法後,會傳回一個壓縮 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_entitiescollection.load() 等)會自動調用 flush 來將區段寫入磁碟。

因此,binlog compaction,顧名思義,是指壓縮區段內的 binlog。更明確地說,在 binlog 壓縮期間,所有未保留的 delta binlog 和插入 binlog 都會被壓縮。

Binlog compaction binlog 壓縮

當區段被刷新到磁碟,或 Milvus 因為壓縮長時間未執行而要求全局壓縮時,至少需要滿足以下兩個條件之一,才能觸發自動壓縮:

  1. delta binlogs 中的行數超過總行數的 20%。
  2. delta binlog 的大小超過 10 MB。

區段壓縮

是 Milvus 自動建立的資料檔案,用來存放插入的資料。Milvus 有兩種類型的區段:成長區段和封閉區段。

成長中的區段持續接收新插入的資料,直到它被封閉。封閉的區段不再接收任何新資料,並會被刷新到物件儲存空間,留下新資料插入新建立的成長中區段。

因此,段壓縮是指壓縮多個密封的段。更明確地說,在段壓縮期間,小段會被壓縮成較大的段。

Segment compaction 分段壓實

壓縮後產生的每個區段不能超過區段大小的上限,預設為 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 Started

Like the article? Spread the word

繼續閱讀