🚀 Zilliz Cloudを無料で試す、完全管理型のMilvus—10倍の高速パフォーマンスを体験しよう!今すぐ試す>>

milvus-logo
LFAI
  • Home
  • Blog
  • Milvusベクターデータベースの一貫性レベルを理解する - 後編

Milvusベクターデータベースの一貫性レベルを理解する - 後編

  • Engineering
September 13, 2022
Jiquan Long

Cover_image 表紙画像

この記事はJiquan Longが執筆し、Angela Niが翻訳したものです。

前回の一貫性に関するブログでは、分散ベクトルデータベースにおける一貫性とは何かを説明し、Milvusベクトルデータベースでサポートされている4つの一貫性レベル(strong、bounded staleness、session、eventual)を取り上げ、それぞれの一貫性レベルに最適なアプリケーションシナリオを説明しました。

今回の投稿では、Milvusベクトルデータベースのユーザが様々なアプリケーションシナリオに対して理想的な一貫性レベルを柔軟に選択することを可能にする背後にあるメカニズムについて引き続き考察します。また、Milvusベクトルデータベースの一貫性レベルを調整する方法についての基本的なチュートリアルも提供します。

ジャンプ

基礎となるタイムティック機構

Milvusでは、ベクトル検索やクエリを実行する際に、タイムティックメカニズムを使用して様々なレベルの一貫性を保証しています。タイムティックはMilvusの透かしであり、Milvusの時計のような役割を果たし、Milvusシステムがどの時点にあるかを示します。Milvusベクトルデータベースにデータ操作言語(DML)リクエストが送信されると、そのリクエストにタイムスタンプが割り当てられます。下図に示すように、例えば新しいデータがメッセージキューに挿入されると、Milvusは挿入されたデータにタイムスタンプを付けるだけでなく、一定の間隔でタイムティックを挿入します。

timetick タイムティック

上図のsyncTs1 。クエリ・ノードのようなダウンストリームのコンシューマーがsyncTs1 を見ると、コンシューマー・コンポーネントは、syncTs1 より前に挿入されたすべてのデータが消費されたことを理解する。言い換えると、タイムスタンプ値がsyncTs1 より小さいデータ挿入リクエストは、メッセージキューに表示されなくなる。

タイムスタンプの保証

前のセクションで述べたように、クエリーノードのような下流のコンシューマーコンポーネントは、メッセージキューからデータ挿入要求とタイムティックのメッセージを継続的に取得します。タイム・ティックが消費されるたびに、クエリ・ノードはこの消費されたタイム・ティックをサービス可能時間としてマークする。ServiceTimeServiceTime より前に挿入されたすべてのデータがクエリ・ノードから見えるようになる。

また、Milvusでは、ServiceTime に加え、保証タイムスタンプ(GuaranteeTS)というタイムスタンプも採用しており、様々なユーザーによる様々なレベルの一貫性と可用性のニーズを満たしています。つまり、Milvusベクトルデータベースのユーザは、検索やクエリを実行する際に、GuaranteeTs 以前の全てのデータが表示され、関与していることをクエリノードに通知するために、GuaranteeTs を指定することができる。

Milvusベクトルデータベースで検索ノードが検索要求を実行する場合、通常2つのシナリオがある。

シナリオ1:検索要求を即座に実行する

下図に示すように、GuaranteeTsServiceTime よりも小さい場合、クエリ・ノードは検索要求を直ちに実行することができる。

execute_immediately 実行_即時

シナリオ2:"ServiceTime > GuaranteeTs "まで待つ。

GuaranteeTsServiceTime より大きい場合、クエリ・ノードはメッセージ・ キューからタイム・ティックを消費し続けなければならない。ServiceTimeGuaranteeTs より大きくなるまで、検索リクエストは実行できない。

wait_search wait_search

一貫性レベル

したがって、GuaranteeTs は、指定した一貫性レベルを達成するために、検索リクエストで設定可能です。大きな値を持つGuaranteeTs は、高い検索レイテンシを犠牲にして、強力な一貫性を保証します。また、GuaranteeTs の値を小さくすると、検索待ち時間は短縮されますが、データの可視性は損なわれます。

GuaranteeTs Milvusはハイブリッドタイムスタンプフォーマットです。そして、ユーザーはMilvus内部のTSOを知らない。従って、 の値を指定することは、ユーザーにとってあまりにも複雑な作業である。ユーザーの手間を省き、最適なユーザーエクスペリエンスを提供するために、Milvusはユーザーが特定の一貫性レベルを選択するだけで、Milvusベクトルデータベースが自動的に 。つまり、Milvusユーザは4つの整合性レベルから選択するだけでよい: , , .そして、それぞれの整合性レベルは、ある 値に対応している。GuaranteeTs GuaranteeTs Strong Bounded Session Eventually GuaranteeTs

下図は、Milvusベクトル・データベースにおける4つの一貫性レベルのそれぞれについて、GuaranteeTs

guarantee_ts ギャランティー

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の正式リリースに伴い、新機能を紹介するブログシリーズを用意しました。このブログシリーズの続きを読む:

Like the article? Spread the word

続けて読む