Milvusでデータをコンパクトにするには?
Binlog カバー画像
Milvus 2.0 GAが正式にリリースされ、多くの新機能がサポートされた。その中でもコンパクションは、ストレージスペースの節約に役立つ新機能の一つだ。
コンパクションとは、小さなセグメントを大きなセグメントにマージし、論理的に削除されたデータをクリーンにするプロセスを指す。言い換えれば、コンパクションは、削除された、または期限切れのエンティティをビンログから削除することにより、ディスクスペースの使用量を削減します。コンパクションはMilvusのデータノードによって実行されるバックグラウンドタスクであり、データコーディネータによってトリガされる。
本記事では、Milvusにおけるコンパクションの概念と実装について解説します。
コンパクションとは?
Milvus2.0におけるコンパクションの実装方法の詳細に入る前に、Milvusにおけるコンパクションとは何かを理解することが重要です。
Milvusのユーザーであれば、ハードディスクの使用量の増加に悩まされたことがあるかもしれません。もう一つの問題は、1,024行未満のセグメントにはインデックスが作成されず、クエリを処理するための総当たり検索しかサポートされないことである。自動フラッシュやユーザーによるフラッシュによって引き起こされる小さなセグメントは、クエリの効率を低下させる可能性があります。
そこで、上記の2つの問題を解決し、ディスク使用量の削減とクエリ効率の向上を支援するために、Milvusはコンパクションをサポートしています。
LevelDBや RocksDBのようなデータベースはソートされた文字列テーブル(SSTables)にデータを追加します。クエリあたりの平均ディスクリードはSSTableの数とともに増加し、非効率なクエリにつながります。読み込みの増幅を減らし、ハードディスク・ドライブのスペースを解放するために、これらのデータベースはSSTableを1つに圧縮します。コンパクション処理はバックグラウンドで自動的に実行される。
同様に、Milvusは挿入および削除されたデータをbinlogに追加します。ビンログの数が増えると、より多くのハードディスク領域が使用されます。ハードディスク領域を解放するために、Milvusは削除および挿入されたデータのbinlogを圧縮します。あるエンティティが挿入され、後に削除された場合、一度コンパクト化されると、データの挿入や削除を記録したビンログにはそのエンティティは存在しなくなる。さらに、Milvusはセグメント(挿入されたデータを保持するためにMilvusが自動的に作成するデータファイル)もコンパクト化します。
コンパクションの設定方法
Milvusのコンパクションの設定には主に2つのパラメータがあります:dataCoord.enableCompaction
とcommon.retentionDuration
.
dataCoord.enableCompaction
はコンパクションを有効にするかどうかを指定します。デフォルト値は です。true
common.retentionDuration
はコンパクションを実行しない期間を指定します。単位は秒です。データをコンパクト化すると、削除されたエンティティはすべてタイムトラベルで検索できなくなる。したがって、Time Travel での検索を計画している場合は、コンパクショ ンが実行されず、削除されたデータに影響しない期間を指定する必要があります。タイムトラベルによる検索結果を正確にするため、Milvusは で指定された期間に操作されたデータを保持します。つまり、この期間に操作されたデータはコンパクションされません。詳細はcommon.retentionDuration
タイムトラベル検索を参照してください。
Milvusではデフォルトでコンパクションが有効になっています。コンパクションを無効にしたが、後で手動で有効にしたい場合は、以下の手順に従ってください:
collection.compact()
メソッドを呼び出し、手動でグローバルコンパクションプロセスをトリガーします。ただし、この操作には時間がかかる可能性があることに注意してください。- メソッドを呼び出すと、コンパクションIDが返されます。
collection.get_compaction_state()
メソッドを呼び出して、コンパクション・ステータスを表示します。
コンパクションが有効になると、バックグラウンドで自動的に実行されます。コンパクション処理には長い時間がかかる可能性があるため、コンパクション要求は時間を節約するために非同期に処理されます。
コンパクションの実装方法
Milvusでは、コンパクションを手動または自動で実装することができます。
binlogやセグメントの手動コンパクションでは、トリガー条件を満たす必要はありません。そのため、手動でコンパクションを実行した場合は、何があってもビンログやセグメントはコンパクションされます。
しかし、自動コンパクションを有効にしたい場合は、特定のコンパクショントリガー条件を満たす必要があります。
一般的に、Milvusでコンパクションできるオブジェクトには、ビンログとセグメントの2種類があります。
ビンログコンパクション
ビンログとは、Milvusベクターデータベース内のデータの更新や変更を記録し、処理するバイナリログ、またはセグメント内の小さな単位です。セグメントのデータは複数のビンログに保存されます。Milvusのビンログコンパクションには、インサートビンログとデルタビンログの2種類があります。
デルタビンログはデータが削除されたときに生成され、インサートビンログは以下の3つの状況で生成される。
- 挿入されたデータが追加される際、セグメントがサイズの上限に達し、自動的にディスクにフラッシュされる。
- DataCoordは、長時間未シール状態のセグメントを自動的にフラッシュする。
collection.num_entities
やcollection.load()
などのいくつかのAPIは、セグメントをディスクに書き込むために自動的にフラッシュを呼び出す。
したがって、ビンログコンパクションとは、その名前が示すように、セグメント内のビンログをコンパクトにすることである。より具体的には、ビンログコンパクションの間、保持されていないすべてのデルタビンログとインサートビンログがコンパクト化される。
ビンログの圧縮
セグメントがディスクにフラッシュされたとき、またはコンパクションが長い間実行されていないため、Milvusがグローバルコンパクションを要求したとき、自動コンパクションをトリガするには、以下の2つの条件のうち少なくとも1つを満たす必要があります:
- デルタビンログの行数が全行数の20%以上である。
- デルタ・ビンログのサイズが10MBを超える。
セグメントコンパクション
セグメントとは、挿入されたデータを保持するためにMilvusが自動的に作成するデータファイルである。Milvusのセグメントには、成長セグメントと密封セグメントの2種類があります。
成長中のセグメントは、封印されるまで新しく挿入されたデータを受け取り続けます。封印されたセグメントは新しいデータを受け取らなくなり、オブジェクトストレージにフラッシュされます。
したがって、セグメントコンパクションとは、密封された複数のセグメントを圧縮することである。より具体的には、セグメントコンパクションでは、小さなセグメントを大きなセグメントに圧縮します。
セグメントコンパクション
コンパクション後に生成される各セグメントは、セグメントサイズの上限(デフォルトでは 512 MB)を超えることはできません。セグメントサイズの上限を変更する方法については、システム設定をお読みください。
セグメントをディスクにフラッシュする場合、またはコンパクションが長時間実行されていないためMilvusがグローバルコンパクションを要求する場合、自動コンパクションをトリガするには以下の条件を満たす必要があります:
- 0.5より小さいセグメント *
MaxSegmentSize
が10以上。
次は?
Milvusでコンパクションの基本を学んだら、次は何をすればいいのでしょうか?現在のところ、コンパクションを設定するためのすべてのパラメータがmilvus.yaml
ファイルにあるわけではありませんし、プラン生成戦略も比較的基本的なものです。興味のある方はオープンソースプロジェクトであるMilvusに貢献しましょう!
また、2.0新機能シリーズのブログでは、新機能の設計を説明することを目指しています。このブログシリーズの続きを読む
- Milvusが分散クラスタのストリーミングデータを削除する方法
- Milvusでデータをコンパクトにするには?
- Milvusはどのようにノード間のクエリ負荷をバランスするのか?
- Bitsetがベクトル類似検索の多様性を可能にする方法
著者について
MilvusプロジェクトのシニアソフトウェアエンジニアであるBingyi Sunは、上海交通大学でソフトウェア工学の修士号を取得した。主に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