一貫性レベル
分散ベクタデータベースとして、Milvusは各ノードやレプリカが読み書きの際に同じデータにアクセスできるように、複数の一貫性レベルを提供しています。現在サポートされている一貫性レベルには、Strong、Bounded、Eventually、Sessionがあり、Boundedはデフォルトの一貫性レベルです。
概要
Milvusはストレージと計算を分離したシステムである。このシステムでは、DataNodesがデータの永続化を担当し、最終的にMinIO/S3などの分散オブジェクトストレージに格納します。QueryNodeは検索などの計算タスクを処理する。これらのタスクは、バッチデータとストリーミングデータの両方を処理する。簡単に言えば、バッチデータはオブジェクトストレージに既に格納されているデータとして理解でき、ストリーミングデータはオブジェクトストレージにまだ格納されていないデータを指す。ネットワーク遅延のため、QueryNodeは最新のストリーミング・データを保持していないことが多い。追加のセーフガードなしにストリーミングデータを直接検索すると、コミットされていない多くのデータポイントが失われ、検索結果の精度に影響を与える可能性があります。
Milvusコマーシャルエディションは、ストレージと計算を分離したシステムです。このシステムでは、DataNodesがデータの永続化を担当し、最終的にMinIO/S3などの分散オブジェクトストレージに格納します。QueryNodeは検索などの計算タスクを処理します。これらのタスクは、バッチデータとストリーミングデータの両方を処理する。簡単に言えば、バッチデータとはオブジェクトストレージに既に格納されているデータのことであり、ストリーミングデータとはオブジェクトストレージにまだ格納されていないデータのことである。ネットワークの待ち時間のため、QueryNode は最新のストリーミング・データを保持していないことが多い。追加的なセーフガードなしにストリーミング・データを直接検索すると、コミットされていない多くのデータ・ポイントが失われ、検索結果の精度に影響する可能性があります。
バッチ・データとストリーミング・データ
上図に示すように、QueryNode は Search リクエストを受信した後、ストリーミング・データとバッチ・データの両方を同時に受信することができる。しかし、ネットワークの遅延により、QueryNodeが取得したストリーミングデータは不完全な場合がある。
この問題に対処するため、Milvusはデータキュー内の各レコードにタイムスタンプを付与し、データキューに同期タイムスタンプを継続的に挿入します。同期タイムスタンプ(syncTs)を受信するたびに、QueryNodesはそれをServiceTimeとして設定し、QueryNodesはそのServiceTime以前のすべてのデータを見ることができるようになります。ServiceTimeに基づき、Milvusは保証タイムスタンプ(GuaranteeTs)を提供し、一貫性と可用性に関する様々なユーザー要件を満たすことができます。ユーザは検索リクエストにGuaranteeTsを指定することで、指定した時点より前のデータを検索スコープに含める必要性をQueryNodeに通知することができます。
ServiceTime と GuaranteeTs
上の図に示されているように、GuaranteeTs が ServiceTime よりも小さい場合、指定された時点より前のすべてのデータがディスクに完全に書き込まれていることを意味し、QueryNode は直ちに検索操作を実行することができる。GuaranteeTsがServiceTimeより大きい場合、QueryNodeはServiceTimeがGuaranteeTsを超えるまで待ってからSearchオペレーションを実行しなければならない。
ユーザは、クエリの精度とクエリの待ち時間をトレードオフする必要があります。ユーザが高い一貫性を要求し、クエリの待ち時間に敏感でない場合、GuaranteeTsを可能な限り大きな値に設定することができます。ユーザが検索結果を迅速に受信することを望み、クエリの精度に寛容である場合、GuaranteeTsをより小さな値に設定することができます。
整合性レベルの図解
Milvusでは、異なるGuaranteeTsを持つ4種類の一貫性レベルを提供しています。
強い
最新のタイムスタンプがGuaranteeTsとして使用され、QueryNodeはServiceTimeがGuaranteeTsを満たすまで待ってからSearchリクエストを実行しなければなりません。
Eventual
QueryNodeがすべてのバッチデータに対して即座にSearchリクエストを実行できるように一貫性チェックを避けるため、GuaranteeTsは1など極端に小さい値に設定される。
制約付き冗長性(Bounded Staleness
GuranteeTs を最新のタイムスタンプよりも早い時点に設定することで、QueryNode が一定のデータ損失を許容しながら検索を実行できるようにする。
セッション
QueryNodesがクライアントによって挿入された全てのデータに対して検索を実行できるように、クライアントがデータを挿入した最新のタイムポイントがGuaranteeTsとして使用される。
milvusはデフォルトの一貫性レベルとしてBounded Stalenessを使用します。GuaranteeTs が指定されていない場合、最新の ServiceTime が GuaranteeTs として使用されます。
一貫性レベルの設定
検索やクエリを実行するときだけでなく、コレクションを作成するときにも異なる一貫性レベルを設定できます。
コレクション作成時の一貫性レベルの設定
コレクションの作成時に、コレクション内の検索とクエリの一貫性レベルを設定できます。以下のコード例では、一貫性レベルをStrong に設定しています。
client.create_collection(
collection_name="my_collection",
schema=schema,
# highlight-next
consistency_level="Strong",
)
CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
.collectionName("my_collection")
.collectionSchema(schema)
// highlight-next
.consistencyLevel(ConsistencyLevel.STRONG)
.build();
client.createCollection(createCollectionReq);
export schema='{
"autoId": true,
"enabledDynamicField": false,
"fields": [
{
"fieldName": "my_id",
"dataType": "Int64",
"isPrimary": true
},
{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": "5"
}
},
{
"fieldName": "my_varchar",
"dataType": "VarChar",
"isClusteringKey": true,
"elementTypeParams": {
"max_length": 512
}
}
]
}'
export params='{
"consistencyLevel": "Strong"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"my_collection\",
\"schema\": $schema,
\"params\": $params
}"
consistency_level
パラメータに指定できる値は、Strong
、Bounded
、Eventually
、およびSession
です。
検索での一貫性レベルの設定
特定の検索の一貫性レベルはいつでも変更できます。以下のコード例では、一貫性レベルを「Bounded」に戻しています。この変更は現在の検索リクエストにのみ適用される。
res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=3,
search_params={"metric_type": "IP"},
# highlight-start
consistency_level="Bounded",
# highlight-next
)
SearchReq searchReq = SearchReq.builder()
.collectionName("my_collection")
.data(Collections.singletonList(queryVector))
.topK(3)
.searchParams(params)
.consistencyLevel(ConsistencyLevel.BOUNDED)
.build();
SearchResp searchResp = client.search(searchReq);
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "my_collection",
"data": [
[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
],
"limit": 3,
"consistencyLevel": "Bounded"
}'
このパラメータはハイブリッド検索と検索イテレータでも使用できます。consistency_level
パラメータに指定できる値はStrong
,Bounded
,Eventually
,Session
です。
クエリーの一貫性レベルの設定
特定の検索の一貫性レベルはいつでも変更できます。以下のコード例では、一貫性レベルをEventuallyに設定しています。この設定は現在のクエリ・リクエストにのみ適用されます。
res = client.query(
collection_name="my_collection",
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit=3,
# highlight-start
consistency_level="Eventually",
# highlight-next
)
QueryReq queryReq = QueryReq.builder()
.collectionName("my_collection")
.filter("color like \"red%\"")
.outputFields(Arrays.asList("vector", "color"))
.limit(3)
.consistencyLevel(ConsistencyLevel.EVENTUALLY)
.build();
QueryResp getResp = client.query(queryReq);
このパラメータは、クエリ・イテレータでも使用できます。consistency_level
パラメータに指定できる値は、Strong
、Bounded
、Eventually
、およびSession
です。