Milvus 벡터 데이터베이스의 일관성 수준 이해 - 2부
Cover_image
이 글은 Jiquan Long이 작성하고 Angela Ni가 번역했습니다.
일관성에 대한 이전 블로그에서는 분산형 벡터 데이터베이스에서 일관성이 갖는 의미에 대해 설명하고, Milvus 벡터 데이터베이스에서 지원되는 네 가지 일관성 수준인 강력, 경계형, 세션, 이벤트에 대해 다루었으며, 각 일관성 수준에 가장 적합한 적용 시나리오에 대해 설명했습니다.
이 게시물에서는 Milvus 벡터 데이터베이스 사용자가 다양한 애플리케이션 시나리오에 적합한 일관성 수준을 유연하게 선택할 수 있는 메커니즘에 대해 계속해서 살펴보겠습니다. 또한 Milvus 벡터 데이터베이스에서 일관성 수준을 조정하는 방법에 대한 기본 튜토리얼도 제공할 예정입니다.
이동하기:
기본 시간 틱 메커니즘
Milvus는 시간 틱 메커니즘을 사용하여 벡터 검색이나 쿼리가 수행될 때 다양한 수준의 일관성을 보장합니다. 타임 틱은 Milvus에서 시계처럼 작동하는 Milvus의 워터마크로, Milvus 시스템이 어느 시점에 있는지를 나타냅니다. Milvus 벡터 데이터베이스에 데이터 조작 언어(DML) 요청이 전송될 때마다 해당 요청에 타임스탬프를 할당합니다. 아래 그림과 같이 예를 들어 메시지 대기열에 새 데이터가 삽입되면 Milvus는 삽입된 데이터에 타임스탬프를 표시할 뿐만 아니라 일정한 간격으로 시간 틱도 삽입합니다.
timetick
위 그림의 syncTs1
을 예로 들어 보겠습니다. 쿼리 노드와 같은 다운스트림 소비자가 syncTs1
을 볼 때, 소비자 구성 요소는 syncTs1
보다 이전에 삽입된 모든 데이터가 소비된 것으로 이해합니다. 즉, 타임스탬프 값이 syncTs1
보다 작은 데이터 삽입 요청은 더 이상 메시지 대기열에 표시되지 않습니다.
타임스탬프 보장
이전 섹션에서 언급했듯이 쿼리 노드와 같은 다운스트림 소비자 구성 요소는 메시지 대기열에서 데이터 삽입 요청 메시지와 타임 틱을 지속적으로 가져옵니다. 타임 틱이 소비될 때마다 쿼리 노드는 이 소비된 타임 틱을 서비스 가능한 시간( ServiceTime
)으로 표시하고 ServiceTime
이전에 삽입된 모든 데이터를 쿼리 노드에 표시합니다.
Milvus는 ServiceTime
외에도 다양한 사용자들의 다양한 수준의 일관성과 가용성에 대한 요구를 충족시키기 위해 타임스탬프의 한 유형인 보증 타임스탬프(GuaranteeTS
)도 채택하고 있습니다. 즉, Milvus 벡터 데이터베이스 사용자는 검색이나 쿼리가 수행될 때 GuaranteeTs
이전의 모든 데이터가 표시되고 관련되어야 한다는 것을 쿼리 노드에 알리기 위해 GuaranteeTs
을 지정할 수 있습니다.
일반적으로 쿼리 노드가 Milvus 벡터 데이터베이스에서 검색 요청을 실행할 때는 두 가지 시나리오가 있습니다.
시나리오 1: 검색 요청을 즉시 실행하는 경우
아래 그림과 같이 GuaranteeTs
가 ServiceTime
보다 작으면 쿼리 노드는 검색 요청을 즉시 실행할 수 있습니다.
execute_immediately
시나리오 2: "서비스 시간 > 보장 시간"까지 기다림
GuaranteeTs
이 ServiceTime
보다 큰 경우 쿼리 노드는 메시지 큐에서 시간 틱을 계속 소비해야 합니다. ServiceTime
이 GuaranteeTs
보다 클 때까지 검색 요청을 실행할 수 없습니다.
wait_search
일관성 수준
따라서 검색 요청에서 GuaranteeTs
을 구성하여 사용자가 지정한 일관성 수준을 달성할 수 있습니다. 값이 큰 GuaranteeTs
은 검색 지연 시간이 길어지지만 강력한 일관성을 보장합니다. 그리고 GuaranteeTs
값이 작으면 검색 지연 시간은 줄어들지만 데이터 가시성이 저하됩니다.
GuaranteeTs
는 하이브리드 타임스탬프 형식입니다. 그리고 사용자는 Milvus 내부의 TSO를 알 수 없습니다. 따라서GuaranteeTs
값을 지정하는 것은 사용자에게 너무 복잡한 작업입니다. 사용자의 수고를 덜어주고 최적의 사용자 경험을 제공하기 위해 Milvus는 사용자가 특정 일관성 수준만 선택하면 Milvus 벡터 데이터베이스가 자동으로 GuaranteeTs
값을 처리합니다. 즉, Milvus 사용자는 네 가지 일관성 수준 중에서 선택하기만 하면 됩니다: Strong
, Bounded
, Session
, Eventually
. 그리고 각 일관성 수준은 특정 GuaranteeTs
값에 해당합니다.
아래 그림은 Milvus 벡터 데이터베이스의 네 가지 일관성 수준 각각에 대한 GuaranteeTs
을 보여줍니다.
guarantee_ts
Milvus 벡터 데이터베이스는 네 가지 일관성 수준을 지원합니다:
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