フォース・マージ・コンパクションCompatible with Milvus 3.0.x

強制マージは、クエリのパフォーマンスとストレージの効率を向上させるために、小さくて断片化されたセグメントを、より少なくて大きなセグメントに統合するように設計されています。このガイドでは、強制マージ圧縮の使用方法を説明します。

この機能はパブリック・プレビューです。本番環境では使用しないでください。

概要

標準的なコンパクションでは、多対一のマージによってセグメント・サイズを設定されたmaxSize の近くに維持しますが、それでも、制限を超えないとそれ以上マージできない中間のサイズの断片が残ることがあります。たとえば、下図のように、コレクションに 2 MB のセグメントが 5 つあり、maxSize が 3 MB の場合、2 つのセグメントをマージすると制限を超えるため、標準のコンパクションではセグメント数をこれ以上減らすことができず、断片化されたレイアウトが残ります。

Force merge はtarget_size パラメータを追加し、可能な限り厳しい許容範囲内でセグメントを希望のサイズに再編成します。下図のように、指定されたtarget_size が 4 MB の場合、5 つの 2 MB の小さなセグメントをより少ない大きなセグメントにマージすることができます。これは過剰なセグメント数を減らし、デフォルトのmaxSize 設定よりも大きなターゲットをサポートし、ターゲットが非常に大きい場合、システムは現在のハードウェアとQueryNodeトポロジーに対して実用的な出力サイズとセグメント数を選択することができます。

どのコンパクション方法を使用するかについては、FAQを参照してください。

R8eow3kaqhktokblcmocnvxmnee R8eow3kaqhktokblcmocnvxmnee

強制マージコンパクションは、既存の CompactionAPIをtarget_size 。これは完全な下位互換性があります。target_size を使用しない既存のコンパクション呼び出しは、従来どおり動作します。

強制マージは非同期に動作します。検索操作やクエリ操作をブロックすることはありませんが、実行中に I/O やメモリのリソースを消費します。

強制マージコンパクションの使用

前提条件

  • Milvusバージョン3.0以降

  • PyMilvus 3.0以降

グローバル設定

以下の設定パラメータは強制併合の動作を制御します。Milvusの設定ファイルまたは環境変数で設定してください。

dataCoord:
  segment:
    maxSize: 512         # Default segment max size (MB).
                         # Used when target_size is 0 or omitted.
  compaction:
    maxFullSegmentThreshold: 100
                         # When segment count exceeds this threshold,
                         # a faster greedy algorithm is used instead
                         # of the standard merge algorithm.
    forceMerge:
      datanodeMemoryFactor: 4.0
                         # DataNode memory divided by this factor
                         # determines the the largest segment
                         # size the system can allow.
      querynodeMemoryFactor: 4.0
                         # Minimum QueryNode memory divided by this
                         # factor. Used in automatic size calculation
                         # to ensure merged segments can be loaded.

パラメータ

デフォルト値

説明

dataCoord.segment.maxSize

512

デフォルトのセグメント最大サイズ(MB)。target_size が 0 または省略されたときにターゲットとして使用される。また、明示的なtarget_size の最小許容値としても機能する。

dataCoord.compaction.maxFullSegmentThreshold

100

アルゴリズム選択のためのセグメント数のしきい値。セグメント数がこの値を超えると、Milvusはより高速な貪欲アルゴリズムを使用してマージ計画を行います。

  • 標準アルゴリズム(セグメント数 <=dataCoord.compaction.maxFullSegmentThreshold のときに使用):より最適なマージ結果が得られるが、計算に時間がかかる。

  • 貪欲なアルゴリズム(セグメント数 >dataCoord.compaction.maxFullSegmentThreshold のときに使用):最適なセグメントグルーピングがわずかに劣る代償として、計画をはるかに速く完了する。

dataCoord.compaction.forceMerge.datanodeMemoryFactor

4.0

DataNodeのメモリをこの係数で割って、システムが許容する最大のセグメントサイズを計算します。

  • 値を大きくすると、マージに割り当てられるメモリは少なくなりますが、他のDataNode操作に割り当てられるメモリが増えるため、ノードの安定性が向上します。

  • 値を小さくすると、より大きなマージが可能になりますが、メモリ圧迫が大きくなります。

  • 例えば、デフォルトのファクターが4.0で、16GBのメモリを持つDataNodeの場合、マージバジェットは4GBです。つまり、1回の操作でマージされるセグメントの合計サイズが4 GBを超えることはありません。

dataCoord.compaction.forceMerge.querynodeMemoryFactor

4.0

QueryNodeの最小メモリをこの係数で割ります。自動サイズ計算 (target_size=max_int64) の際に使用され、マージされたセグメントを QueryNode がロードできるようにします。

  • 値を大きくすると、QueryNode がロードしやすい小さなセグメントになります。

  • 値を小さくすると、より大きなセグメントをロードできるようになりますが、メモリに制約のある QueryNode ではロードに失敗する可能性があります。

  • 例えば、デフォルトのファクターが 4.0 で、最小の QueryNode のメモリが 16 GB の場合、自動計算されるターゲットサイズは 4 GB を超えません。これにより、QueryNode がロードできないほど大きなセグメントを Force Merge が生成するのを防ぐことができます。

上記の変更をMilvusクラスタに適用するには、HelmによるMilvusの設定およびMilvus OperatorsによるMilvusの設定の手順に従ってください。

強制マージコンパクションのトリガ

強制マージコンパクションをトリガするには、target_size パラメータを指定してcompact() を呼び出します。パラメータの詳細については、以下のパラメータリファレンスを参照してください。

3つのフォース マージ コンパクション モードが利用可能です:

compact("my_collection", target_size=?)
│
├─ Mode 1: target_size = 0 (or omitted)
│  Uses config maxSize (default 512 MB)
│  Equivalent to standard compaction
│
├─ Mode 2: target_size = 2048
│  Merges segments to ~2 GB each
│  Must be >= config maxSize
│
└─ Mode 3: target_size = max_int64
   Auto-calculates optimal size based on
   segment distribution and node memory

以下に、各フォース・マージ・カンパクション・モードの使用例を示す。

デフォルト(標準コンパクション)

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

# Standard compaction — uses config maxSize (default 512 MB)
job_id = client.compact("target_collection")

明示的ターゲットサイズ

# Merge segments to approximately 2 GB each
job_id = client.compact(
    "target_collection",
    target_size="2048"  # The unit is MB
)

自動サイズ計算

# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
    "target_collection",
    target_size=max_int64
)

パラメータ参照

以下の表は、パラメータについて説明したものです。

パラメータ

タイプ

説明

collection_name

str

必須。コンパクトにするコレクションの名前。

target_size

int

オプション。MB 単位のターゲット・セグメント・サイズ。パラメータ値には3つのオプションがあります:

  • 0 または省略: 設定されたdataCoord.segment.maxSize を使用します (デフォルト: 512 MB)。標準のコンパクションと同じ。

  • 明示的な値:セグメントをMB単位で指定されたサイズ(例:2048)にマージする。設定されたdataCoord.segment.maxSize 以上でなければならない。

  • max_int64 ((1 << 63) - 1):現在のセグメント分布と利用可能なノードリソースに基づいて最適なサイズを自動的に計算する。

指定されたtarget_size が設定されたdataCoord.segment.maxSize より小さい場合、リクエストはエラーで拒否される。

コンパクションの進行状況の確認

強制マージ コンパクションは非同期で実行されます。返されたジョブ ID を使用して進行状況を確認します:

# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")

ベストプラクティス

  • 本番環境では強制マージ コンパクションを使用しないでください。

  • ほとんどの場合、自動サイズ計算モードを使用してください。 target_sizemax_int64 に設定すると、Milvus がセグメント分布とノードリソースを分析して最適なサイズを決定します。特定のサイズ決定要件がない限り、この方法が推奨されます。

  • パフォーマンスのトレードオフを考慮してください。強制マージコンパクションはリソースを大量に消費します。セグメントデータを読み取り、マージし、書き換えます。クエリーレイテンシーへの影響を最小にするため、トラフィックの少ない時間帯にスケジュールしてください。

  • その前後でセグメント数を監視する。 get_compaction_state() およびlist_persistent_segments を使用して、コンパクションによって予想よりも少ない、より大きなセグメントが生成されたことを確認します。

よくある質問

Force Merge は標準的なコンパクションとどう違うのですか?

これら 2 種類のコンパクション操作は目的が異なります。

  • 標準的なコンパクション(targetSize=0 または省略)は、最善の努力による漸進的なクリーンアップ・パスです。

  • 強制マージ (targetSize>0) は、コレクションレベルの再パッキングパスで、より少ない、より大きな、ターゲットに近いセグメントを作成します。

標準的なコンパクションはタスクごとに m → 1 となるが、フォースマージはグループ化された入力全体で m → n となる。これが、標準的なコンパクションでは解決できないセグメントレイアウトを、フォースマージで解決できる理由です。次の表は、2 種類のオペレーションを比較したものである。

寸法

標準コンパクション(デフォルト)

フォース・マージ

APIトリガー

targetSize=0(または未設定)、Major/L0フラグなし

ターゲットサイズ>0 (MB)

主な目標

明らかなフラグメントのインクリメンタルなクリーンアップ。

検索とバランスのためのコレクション全体の統合

セグメントサイズのソース

固定dataCoord.segment.maxSize (サーバ設定)

ユーザーのtargetSize、その後maxSafeSizeで安全クランプ

パラメータの有効性

ユーザーサイズのチューニングなし

ユーザ targetSize は >= dataCoord.segment.maxSize でなければならない。

安全上限

コンフィグキャップのみ

maxSafeSize = min(QueryNode mem, DataNode mem) / memory_factor (スタンドアロン非プーリング:さらに半分になる)

マージ形状

m → 1タスクあたり、出力 <= configMaxSize

m → n, 出力がtargetSizeの近く

中分割の挙動

永久にスタックする可能性あり(例えば、2つの60%セグメントを合法的に1つの120%セグメントにすることはできない)

リパック+分割が機能。「60%でスタック」パターンはない

コレクションをフラットにする能力

限定的。繰り返し実行しても、多くのミディアムセグメントが残る可能性がある。

セグメント数を減らし、充実度を高めるように設計されている。

トポロジーの認識

なし

あり。QueryNode/レプリカ/シャードレイアウトを使用。

リードパス並列性チューニング

なし

有効な場合、queryNodeCount / (replica × shards)を使用して出力数を調整する。

典型的な使用例

書き込み/削除後の毎日の高負荷クリーンアップ

ベンチマーク準備、検索最適化、負荷並列アライメント

スコープ

コレクション全体のリパックを期待しない

コレクションレベルのリパック結果を意図

選択の指針

  • 低リスクでインクリメンタルなクリーンアップには標準的なコンパクションを選択する。

  • 強制マージを選択するのは、検索や読み込みの動作に合わせて、コレクションをより少ない、より大きなセグメントに再形成したい場合です。

強制マージはクラスタリングコンパクションとどう違うのですか?

クラスタリングコンパクション(is_clustering=True) は、クラスタリングキーに基づいてセグメント内のデータを再編成し、検索の枝刈りを改善します。強制マージ (target_size=N) は、データの分布を変えずにセグメントサイズを最適化します。最初にクラスタリングコンパクションを実行してデータを整理し、次に Force Merge を実行して結果のセグメントを統合します。

クエリ実行中のコレクションに対して Force Merge を実行できますか?

はい。Force Merge は非同期に実行され、クエリーをブロックしません。しかし、DataNode とディスク I/O リソースを消費するため、コンパクション中にクエリの待ち時間が増加する可能性があります。最良の結果を得るには、トラフィックの少ない時間帯に Force Merge をスケジュールしてください。

target_size を maxSize より小さく設定するとどうなりますか?

リクエストはエラーで拒否されます。ターゲット・サイズは設定されたdataCoord.segment.maxSize 以上でなければなりません。