タイムスタンプ
このトピックでは、タイムスタンプの概念を説明し、Milvusベクトルデータベースの4つの主要なタイムスタンプ関連パラメータを紹介します。
概要
Milvusは非構造化データから変換されたベクトルを検索・照会することができるベクトルデータベースです。Milvusでは、データの挿入や削除などのデータ操作言語(DML)操作を行う際に、操作に関わるエンティティにタイムスタンプを付与します。したがって、Milvusのすべてのエンティティはタイムスタンプ属性を持っている。また、同じDML操作のエンティティのバッチは同じタイムスタンプ値を共有します。
タイムスタンプパラメータ
Milvusでベクトル類似検索やクエリを実行する際には、いくつかのタイムスタンプ関連のパラメータが関係します。
Guarantee_timestamp
Service_timestamp
Graceful_time
Travel_timestamp
Guarantee_timestamp
Guarantee_timestamp
はタイムスタンプの一種で、 より前の DML 操作によるすべてのデータ更新がベクトル類似性検索またはクエリの実行時に表示されるようにするために使用されます。例えば、午後3時にデータのバッチを挿入し、午後5時に別のバッチを挿入した場合、ベクトルの類似性検索中に の値が午後6時に設定されます。これは、それぞれ午後3時と午後5時に挿入された2つのデータバッチが検索に関与することを意味する。Guarantee_timestamp
Guarantee_timestamp
Guarantee_timestamp
が設定されていない場合、Milvus は検索要求がなされた時点を自動的に採用する。従って、検索は検索前のDML操作により全てのデータが更新されたデータビューに対して行われます。
Milvus内部でTSOを理解する手間を省くため、ユーザーとしてGuarantee_timestamp
パラメータを直接設定する必要はありません。一貫性レベルを選択するだけで、Milvusは自動的にGuarantee_timestamp
パラメータを処理します。各整合性レベルは特定のGuarantee_timestamp
値に対応しています。
Guarantee_Timestamp.
例
上の図のように、Guarantee_timestamp
の値を2021-08-26T18:15:00
と設定します(簡単のため、この例ではタイムスタンプを物理的な時間で表しています)。検索またはクエリを実行すると、2021-08-26T18:15:00 より前のすべてのデータが検索またはクエリされます。
Service_timestamp
Service_timestamp
はmilvusのクエリノードが自動的に生成・管理するタイムスタンプの一種です。どのDML操作がクエリノードによって実行されるかを示すために使用されます。
クエリノードが管理するデータは2種類に分類されます:
履歴データ(バッチデータとも呼ばれる)
インクリメンタルデータ(ストリーミングデータとも呼ばれる)。
Milvusでは、検索やクエリを実行する前にデータをロードする必要があります。そのため、コレクション内のバッチデータは検索やクエリ要求が行われる前にクエリノードによってロードされます。しかし、ストリーミングデータはその場でMilvusに挿入またはMilvusから削除されるため、クエリノードはDML操作と検索またはクエリ要求のタイムラインを保持する必要があります。その結果、クエリノードはService_timestamp
を使用してタイムラインを保持します。Service_timestamp
は、クエリノードがService_timestamp
より前のすべてのDML操作が完了していることを確認できるため、特定のデータが表示される時点とみなすことができます。
検索またはクエリ要求が来ると、クエリノードはService_timestamp
とGuarantee_timestamp
の値を比較する。主に2つのシナリオがある。
Service_Timestamp.
シナリオ1:Service_timestamp
>=Guarantee_timestamp
図1に示すように、Guarantee_timestamp
の値は2021-08-26T18:15:00
として設定される。Service_timestamp
の値が2021-08-26T18:15:01
に成長すると、Guarantee_timestamp
で示される時刻より前の DML 操作を含め、この時点より前のすべての DML 操作がクエリ・ノードによって実行され、完了することを意味します。その結果、検索またはクエリ要求は即座に実行できる。
シナリオ2:Service_timestamp
<Guarantee_timestamp
図2に示すように、Guarantee_timestamp
の値は2021-08-26T18:15:00
に設定され、Service_timestamp
の現在の値は2021-08-26T18:14:55
のみである。これは、2021-08-26T18:14:55
より前の DML オペレーションのみが実行され完了することを意味し、この時点より後、Guarantee_timestamp
より前の DML オペレーションの一部は未完了のままである。この時点で検索やクエリを実行すると、必要なデータの一部が不可視でまだ利用できないため、検索やクエリの結果の精度に深刻な影響を与える。そのため、クエリ・ノードはguarantee_timestamp
の前のDML操作が完了するまで(つまり、Service_timestamp
>=Guarantee_timestamp
)、検索やクエリのリクエストを延期する必要があります。
Graceful_time
技術的に言えば、Graceful_time
はタイムスタンプではなく、期間(例えば100ms)である。しかしながら、Graceful_time
は、Guarantee_timestamp
とService_timestamp
に強く関連しているため、言及する価値がある。Graceful_time
は、Milvusの設定ファイルで設定可能なパラメータである。これは特定のデータが表示されるまでに許容できる時間を示すために使用されます。つまり、Graceful_time
中の未完了の DML 操作は許容されます。
検索またはクエリ要求があった場合、2つのシナリオが考えられます。
Graceful_Time.
シナリオ1:Service_timestamp
+Graceful_time
>=Guarantee_timestamp
図1に示すように、Guarantee_timestamp
の値を2021-08-26T18:15:01
とし、Graceful_time
の値を2s
とする。Service_timestamp
2021-08-26T18:15:00
Service_timestamp
の値は の値よりまだ小さく、 より前のすべての DML 操作が完了したわけではありませんが、 の値で示されるように、2 秒間のデータ不可視期間が許容されます。したがって、入力された検索またはクエリ要求は直ちに実行することができます。Guarantee_timestamp
2021-08-26T18:15:01
Graceful_time
シナリオ2:Service_timestamp
+Graceful_time
<Guarantee_timestamp
図2に示すように、Guarantee_timestamp
の値は2021-08-26T18:15:01
として設定され、Graceful_time
は2s
として設定される。Service_timestamp
2021-08-26T18:14:54
これは、期待されるDML操作がまだ完了していないことを意味し、2秒の猶予時間を考慮しても、データの不可視化はまだ耐えられない。したがって、クエリノードは特定のDML要求が完了するまで(すなわち、Service_timestamp
+Graceful_time
>=Guarantee_timestamp
)、検索またはクエリ要求を延期する必要があります。
次のページ
- ギャランティタイムスタンプがmilvusでどのように整合性を調整できるかを学ぶ。