建表字段不能重複 Milvus 資料段合併機制

2021-10-16 09:37:22 字數 2263 閱讀 7754

我們在《milvus在大規模向量檢索場景下的資料管理》這篇文章的第(二)章第(2)小節說過,當向量資料不斷地進入milvus時,系統後台會持續地將插入緩衝區中的資料寫入磁碟,形成很多小檔案。我們稱這些檔案為資料段。大量零碎的資料段有兩個明顯缺點:

因此milvus後台落盤任務會不斷地把這些小資料段合併成大資料段,直到合併後的資料段大小超過index_file_size(預設1024mb)這個閾值。

(一)舊版本合併機制的缺點

在0.9.0版本以前,資料段的合併策略是簡單粗暴的:先從元資料拿到一批需要被合併的資料段,然後迴圈遍歷合併。如下圖所示:

假設拿到7個資料段,從第乙個開始合併到第三個,segment_8已經超過1024mb的大小,就停止對segment_8的合併;接著從第四個合併到第六個,合併為segment_9;合併完成後將前六個資料段標記為軟刪除,最終剩下三個資料段:segment_7,segment_8,segment_9。

這種合併機制有乙個很大的缺點:占用過多的磁碟空間。

《milvus在大規模向量檢索場景下的資料管理》這篇文章介紹過,資料段的刪除是分為兩個階段的:軟刪除和硬刪除。當資料段被標記為軟刪除後,並不會立刻從磁碟中清理掉,而是會保留一段時間,直到後台清理執行緒將其硬刪除,才會被清理掉。因此,在某些特定場景下,這種合併機制會造成巨大的磁碟空間浪費。

假設有乙個256維的集合,index_file_size為1024m, 每條向量的大小為1kb。該集合中已存在乙個100mb的資料段,客戶端以每秒1條的頻率插入向量。系統配置的auto_flush_interval為1秒,也就是每秒寫一次磁碟。我們來看插入三次過程中後台的合併行為:

經過三次操作後,資料合併為segment_7,大小為 100mb+3kb。而其他六個資料段被標記為軟刪除狀態,但它們的檔案仍然在存在於硬碟中,這些檔案的總大小超過了400mb。在三次插入以及合併過程中,寫入磁碟的資料量為300mb+9kb。可以看到,餘留的檔案大小是實際資料量(100mb)的4倍,磁碟寫入的資料量是實際資料量的3倍。我們稱這種現象為「寫放大」,根本原因是因為被合併的資料段的大小差距過大。

(二)0.9.x版本的合併策略

1)層級合併策略

為了緩解「寫放大」問題,我們在0.9.0中進行了改進。在介紹新的策略之前,我們先來玩乙個遊戲,遊戲名叫做「2048」,可能很多人都玩過,沒玩過的戳這裡:

玩過的都知道,這遊戲裡,數字2只可以跟數字2合併,但不能跟其他數字合併。同樣的,數字4只能跟數字4合併,數字8只能跟數字8合併,以此類推。

新的合併策略將資料段按大小劃分為幾層:0mb~4mb,4mb~16mb,16mb~64mb,64mb~256mb,大於1gb的歸為一層。合併的時候,僅對層內資料段進行合併,這樣就避免了小資料段和大資料段的合併,減少磁碟寫入量,減少過大的臨時檔案。那麼我們來看一下在上一節的場景下,使用新的合併策略後,磁碟的使用量有沒有緩解:

可以看到,三次插入和合併操作完成後,資料合併為segment_6,但segment_1沒有參與合併,其他四個資料段被標記為軟刪除。磁碟佔用量為 100mb+8kb,磁碟寫入資料量為 8kb。基本緩解了「寫放大」問題。

2)適配合併策略

上面這種分層合併策略是在落盤任務完成之後觸發的,我們可以看到對於在不同層級的資料段沒有得到合併(比如上面場景中的segment_1和segment_6)。在對集合建索引之前,要盡可能地把資料段合併到index_file_size指定的大小,這就需要另一種合併策略。適配合併策略就是用來做這個事情的,實際上就是按資料段大小往index_file_size上「湊」。比如,對於下面一組資料段,index_file_size為1024mb,適配合併策略的效果如下:

這裡最終得到了segment_8、segment_9、segment_10三個資料段,前兩個資料段的大小和index_file_size很接近。

(三)新的合併策略的觸發條件

合併操作觸發的時機有以下幾個:

由於「寫放大」問題主要出現在持續插入資料以及落盤過程中,因此,僅在落盤任務完成時使用了層級合併策略,其他幾個都使用了適配合併策略。

hive 建庫建表字段操作基礎

建庫 create database if not exists test03 建庫,並指定位置 查詢所有的資料庫 show databases 使用庫 use test03 展示所有表 show tables 顯示表結構 desc employee 顯示建立表的語句 詳細 show create ...

MySQL建表字段型別參考

1 數值型別 1 int m 說明 標準大小的整數 允許的屬性 不選 可以取正負數 unsigned 無符號,取值範圍增大一倍 unsiged zerofill 在數值前自動填0 auto increment 自動遞增 取值範圍 2147483648 到2147483647 231 到231 1 或...

資料庫統計建表字段資訊

1.統計資料庫中標的字段資訊 欄位名字,字段約束,字段型別,字段注釋等,建表的資訊都儲存在information schema資料庫中,這個資料庫是mysql預設就有的,查詢sql語句如下 只需要把錶名稱換成自己的表名即可執行 use information schema select c.colu...