Milvusベクターデータベースの一貫性レベルを理解する - 後編
表紙画像
この記事はJiquan Longが執筆し、Angela Niが翻訳したものです。
前回の一貫性に関するブログでは、分散ベクトルデータベースにおける一貫性とは何かを説明し、Milvusベクトルデータベースでサポートされている4つの一貫性レベル(strong、bounded staleness、session、eventual)を取り上げ、それぞれの一貫性レベルに最適なアプリケーションシナリオを説明しました。
今回の投稿では、Milvusベクトルデータベースのユーザが様々なアプリケーションシナリオに対して理想的な一貫性レベルを柔軟に選択することを可能にする背後にあるメカニズムについて引き続き考察します。また、Milvusベクトルデータベースの一貫性レベルを調整する方法についての基本的なチュートリアルも提供します。
ジャンプ
基礎となるタイムティック機構
Milvusでは、ベクトル検索やクエリを実行する際に、タイムティックメカニズムを使用して様々なレベルの一貫性を保証しています。タイムティックはMilvusの透かしであり、Milvusの時計のような役割を果たし、Milvusシステムがどの時点にあるかを示します。Milvusベクトルデータベースにデータ操作言語(DML)リクエストが送信されると、そのリクエストにタイムスタンプが割り当てられます。下図に示すように、例えば新しいデータがメッセージキューに挿入されると、Milvusは挿入されたデータにタイムスタンプを付けるだけでなく、一定の間隔でタイムティックを挿入します。
タイムティック
上図のsyncTs1
。クエリ・ノードのようなダウンストリームのコンシューマーがsyncTs1
を見ると、コンシューマー・コンポーネントは、syncTs1
より前に挿入されたすべてのデータが消費されたことを理解する。言い換えると、タイムスタンプ値がsyncTs1
より小さいデータ挿入リクエストは、メッセージキューに表示されなくなる。
タイムスタンプの保証
前のセクションで述べたように、クエリーノードのような下流のコンシューマーコンポーネントは、メッセージキューからデータ挿入要求とタイムティックのメッセージを継続的に取得します。タイム・ティックが消費されるたびに、クエリ・ノードはこの消費されたタイム・ティックをサービス可能時間としてマークする。ServiceTime
、ServiceTime
より前に挿入されたすべてのデータがクエリ・ノードから見えるようになる。
また、Milvusでは、ServiceTime
に加え、保証タイムスタンプ(GuaranteeTS
)というタイムスタンプも採用しており、様々なユーザーによる様々なレベルの一貫性と可用性のニーズを満たしています。つまり、Milvusベクトルデータベースのユーザは、検索やクエリを実行する際に、GuaranteeTs
以前の全てのデータが表示され、関与していることをクエリノードに通知するために、GuaranteeTs
を指定することができる。
Milvusベクトルデータベースで検索ノードが検索要求を実行する場合、通常2つのシナリオがある。
シナリオ1:検索要求を即座に実行する
下図に示すように、GuaranteeTs
がServiceTime
よりも小さい場合、クエリ・ノードは検索要求を直ちに実行することができる。
実行_即時
シナリオ2:"ServiceTime > GuaranteeTs "まで待つ。
GuaranteeTs
がServiceTime
より大きい場合、クエリ・ノードはメッセージ・ キューからタイム・ティックを消費し続けなければならない。ServiceTime
がGuaranteeTs
より大きくなるまで、検索リクエストは実行できない。
wait_search
一貫性レベル
したがって、GuaranteeTs
は、指定した一貫性レベルを達成するために、検索リクエストで設定可能です。大きな値を持つGuaranteeTs
は、高い検索レイテンシを犠牲にして、強力な一貫性を保証します。また、GuaranteeTs
の値を小さくすると、検索待ち時間は短縮されますが、データの可視性は損なわれます。
GuaranteeTs
Milvusはハイブリッドタイムスタンプフォーマットです。そして、ユーザーはMilvus内部のTSOを知らない。従って、 の値を指定することは、ユーザーにとってあまりにも複雑な作業である。ユーザーの手間を省き、最適なユーザーエクスペリエンスを提供するために、Milvusはユーザーが特定の一貫性レベルを選択するだけで、Milvusベクトルデータベースが自動的に 。つまり、Milvusユーザは4つの整合性レベルから選択するだけでよい: , , .そして、それぞれの整合性レベルは、ある 値に対応している。GuaranteeTs
GuaranteeTs
Strong
Bounded
Session
Eventually
GuaranteeTs
下図は、Milvusベクトル・データベースにおける4つの一貫性レベルのそれぞれについて、GuaranteeTs
。
ギャランティー
Milvusベクトル・データベースは4つの整合性レベルをサポートしています:
CONSISTENCY_STRONG
GuaranteeTs
は最新のシステム・タイムスタンプと同じ値に設定され、クエリ・ノードはサービス時間が最新のシステム・タイムスタンプに進むまで、検索またはクエリ要求を処理するのを待ちます。CONSISTENCY_EVENTUALLY
:GuaranteeTs
は、一貫性チェックをスキップするために、最新のシステム・タイムスタンプよりも有意に小さい値に設定される。クエリ・ノードは既存のデータ・ビューを即座に検索します。CONSISTENCY_BOUNDED
:GuaranteeTs
は最新のシステム・タイムスタンプよりも比較的小さい値に設定され、クエリ・ノードは許容範囲内で更新されたデータ・ビューを検索する。CONSISTENCY_SESSION
:クライアントは最後の書き込み操作のタイムスタンプをGuaranteeTs
として使用し、各クライアントが少なくとも自分自身で挿入されたデータを取得できるようにする。
Milvusで一貫性レベルを調整するには?
Milvusはコレクション作成時、検索時、クエリ時の一貫性レベルのチューニングをサポートしています。
ベクトル類似検索の実行
希望する一貫性レベルでベクトル類似性検索を行うには、パラメータconsistency_level
の値をStrong
,Bounded
,Session
,Eventually
のいずれかに設定するだけです。パラメータconsistency_level
の値を設定しない場合、一貫性レベルはデフォルトでBounded
になります。この例では、Strong
の一貫性でベクトル類似性検索を実行します。
results = collection.search(
data=[[0.1, 0.2]],
anns_field="book_intro",
param=search_params,
limit=10,
expr=None,
consistency_level="Strong"
)
ベクトル・クエリの実行
ベクトル類似検索の実行と同様に、ベクトル検索を実行するときに、パラメータconsistency_level
の値を指定できます。この例では、Strong
の一貫性でベクトル検索を行います。
res = collection.query(
expr = "book_id in [2,4,6,8]",
output_fields = ["book_id", "book_intro"],
consistency_level="Strong"
)
今後の予定
Milvus 2.1の正式リリースに伴い、新機能を紹介するブログシリーズを用意しました。このブログシリーズの続きを読む:
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word