일관성 수준
분산형 벡터 데이터베이스로서 Milvus는 읽기 및 쓰기 작업 중에 각 노드 또는 복제본이 동일한 데이터에 액세스할 수 있도록 여러 수준의 일관성을 제공합니다. 현재 지원되는 일관성 수준에는 강함, 경계, 결국, 세션이 있으며, 기본 일관성 수준은 경계가 사용됩니다.
개요
Milvus는 저장과 계산을 분리하는 시스템입니다. 이 시스템에서 데이터 노드는 데이터의 지속성을 담당하며 궁극적으로 MinIO/S3와 같은 분산형 객체 스토리지에 데이터를 저장합니다. 쿼리 노드는 검색과 같은 계산 작업을 처리합니다. 이러한 작업에는 배치 데이터와 스트리밍 데이터 처리가 모두 포함됩니다. 간단히 말해, 배치 데이터는 이미 객체 스토리지에 저장된 데이터로 이해할 수 있으며, 스트리밍 데이터는 아직 객체 스토리지에 저장되지 않은 데이터를 의미합니다. 네트워크 지연 시간으로 인해 쿼리 노드는 종종 가장 최근의 스트리밍 데이터를 보유하지 않습니다. 추가적인 안전장치 없이 스트리밍 데이터에서 직접 검색을 수행하면 커밋되지 않은 많은 데이터 포인트가 손실되어 검색 결과의 정확도에 영향을 미칠 수 있습니다.
밀버스 커머셜 에디션은 저장과 계산을 분리한 시스템입니다. 이 시스템에서 데이터 노드는 데이터의 지속성을 담당하며 궁극적으로 MinIO/S3와 같은 분산형 객체 스토리지에 데이터를 저장합니다. 쿼리 노드는 검색과 같은 계산 작업을 처리합니다. 이러한 작업에는 배치 데이터와 스트리밍 데이터 처리가 모두 포함됩니다. 간단히 말해, 배치 데이터는 이미 객체 스토리지에 저장된 데이터로 이해할 수 있으며, 스트리밍 데이터는 아직 객체 스토리지에 저장되지 않은 데이터를 말합니다. 네트워크 지연 시간으로 인해 쿼리 노드는 종종 가장 최근의 스트리밍 데이터를 보유하지 않습니다. 추가적인 안전장치 없이 스트리밍 데이터에서 직접 검색을 수행하면 커밋되지 않은 많은 데이터 포인트가 손실되어 검색 결과의 정확도에 영향을 미칠 수 있습니다.
배치 데이터와 스트리밍 데이터
위 그림에서 보듯이, 쿼리 노드는 검색 요청을 받은 후 스트리밍 데이터와 배치 데이터를 동시에 수신할 수 있습니다. 하지만 네트워크 지연 시간으로 인해 쿼리 노드가 얻은 스트리밍 데이터는 불완전할 수 있습니다.
이 문제를 해결하기 위해 Milvus는 데이터 대기열의 각 레코드에 타임스탬프를 찍고 데이터 대기열에 동기화 타임스탬프를 지속적으로 삽입합니다. 동기화 타임스탬프(syncT)가 수신될 때마다 쿼리 노드는 이를 서비스 시간으로 설정하며, 이는 쿼리 노드가 해당 서비스 시간 이전의 모든 데이터를 볼 수 있다는 것을 의미합니다. 밀버스는 서비스 타임을 기반으로 일관성과 가용성에 대한 다양한 사용자 요구 사항을 충족하기 위해 보증 타임스탬프(GuaranteeT)를 제공할 수 있습니다. 사용자는 검색 요청에 GuaranteeT를 지정하여 검색 범위에 특정 시점 이전의 데이터를 포함해야 할 필요성을 쿼리 노드에 알릴 수 있습니다.
서비스 시간 및 보장 시간
위 그림에서 보듯이, GuaranteeTs가 ServiceTime보다 작으면 지정된 시점 이전의 모든 데이터가 디스크에 완전히 기록되었으므로 쿼리 노드가 즉시 검색 작업을 수행할 수 있음을 의미합니다. GuaranteeTs가 ServiceTime보다 큰 경우, 쿼리 노드는 검색 작업을 실행하기 전에 ServiceTime이 GuaranteeTs를 초과할 때까지 기다려야 합니다.
사용자는 쿼리 정확도와 쿼리 지연 시간 사이에서 절충점을 찾아야 합니다. 일관성 요구 사항이 높고 쿼리 지연 시간에 민감하지 않은 사용자는 GuaranteeT를 가능한 한 큰 값으로 설정할 수 있으며, 검색 결과를 빠르게 받기를 원하고 쿼리 정확도에 더 관대한 사용자는 GuaranteeT를 더 작은 값으로 설정할 수 있습니다.
일관성 수준 예시
Milvus는 서로 다른 보장값을 가진 네 가지 유형의 일관성 수준을 제공합니다.
강함
가장 최근의 타임스탬프가 보장 시간으로 사용되며, 쿼리 노드는 검색 요청을 실행하기 전에 서비스 시간이 보장 시간을 충족할 때까지 기다려야 합니다.
최종
모든 배치 데이터에 대해 쿼리 노드가 즉시 검색 요청을 실행할 수 있도록 일관성 검사를 피하기 위해 GuaranteeTs를 1과 같이 매우 작은 값으로 설정합니다.
바운드 스탤렌니스
쿼리 노드가 특정 데이터 손실을 허용하면서 검색을 수행하도록 하기 위해 최신 타임스탬프보다 앞선 시점으로 GuranteeTs를 설정합니다.
세션
클라이언트가 데이터를 삽입하는 최신 시점을 보장 시점으로 사용하여 쿼리 노드가 클라이언트가 삽입한 모든 데이터에 대해 검색을 수행할 수 있도록 합니다.
Milvus는 기본 일관성 수준으로 Bounded Staleness를 사용합니다. GuaranteeT를 지정하지 않으면 가장 최근의 ServiceTime이 GuaranteeT로 사용됩니다.
일관성 수준 설정
컬렉션을 만들 때와 검색 및 쿼리를 수행할 때 서로 다른 일관성 수준을 설정할 수 있습니다.
컬렉션 생성 시 일관성 수준 설정
컬렉션을 만들 때 컬렉션 내의 검색 및 쿼리에 대한 일관성 수준을 설정할 수 있습니다. 다음 코드 예제는 일관성 수준을 강함으로 설정합니다.
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
입니다.