🚀 완전 관리형 Milvus인 Zilliz Cloud를 무료로 체험해보세요—10배 더 빠른 성능을 경험하세요! 지금 체험하기>>

milvus-logo
LFAI
  • Home
  • Blog
  • 인메모리 복제본으로 벡터 데이터베이스 읽기 처리량 증대

인메모리 복제본으로 벡터 데이터베이스 읽기 처리량 증대

  • Engineering
August 22, 2022
Congqi Xia

Cover_image Cover_image

이 글은 콩치 샤와 안젤라 니가 공동 집필했습니다.

공식 출시와 함께 Milvus 2.1은 편의성과 더 나은 사용자 경험을 제공하기 위해 많은 새로운 기능을 제공합니다. 인메모리 복제본이라는 개념은 분산 데이터베이스의 세계에서 새로운 것은 아니지만, 시스템 성능을 높이고 시스템 가용성을 손쉽게 향상시키는 데 도움이 되는 중요한 기능입니다. 따라서 이 게시물에서는 인메모리 복제본이 무엇이며 왜 중요한지 설명한 다음, AI용 벡터 데이터베이스인 Milvus에서 이 새로운 기능을 활성화하는 방법을 소개합니다.

건너뛰기:

인메모리 복제본이 무엇이며 왜 중요한지 알기 전에 먼저 복제본 그룹, 샤드 복제본, 스트리밍 복제본, 히스토리 복제본, 샤드 리더 등 몇 가지 관련 개념을 이해해야 합니다. 아래 이미지는 이러한 개념을 설명하는 그림입니다.

Replica_concepts 레플리카_개념

레플리카 그룹

복제본 그룹은 기록 데이터 및 복제본 처리를 담당하는 여러 쿼리 노드로 구성됩니다.

샤드 복제본

샤드 복제본은 스트리밍 복제본과 기록 복제본으로 구성되며, 둘 다 동일한 샤드 (즉, DML 채널)에 속합니다. 여러 개의 샤드 복제본이 하나의 복제본 그룹을 구성합니다. 그리고 복제본 그룹의 정확한 샤드 복제본 수는 지정된 컬렉션의 샤드 수에 따라 결정됩니다.

스트리밍 복제본

스트리밍 복제본에는 동일한 DML 채널에서 성장하는 모든 세그먼트가 포함됩니다. 기술적으로 스트리밍 복제본은 하나의 복제본에서 하나의 쿼리 노드만 제공해야 합니다.

기록 복제본

기록 복제본에는 동일한 DML 채널의 모든 봉인된 세그먼트가 포함됩니다. 하나의 기록 복제본의 봉인된 세그먼트는 동일한 복제본 그룹 내의 여러 쿼리 노드에 분산될 수 있습니다.

샤드 리더

샤드 리더는 샤드 복제본에서 스트리밍 복제본을 제공하는 쿼리 노드입니다.

인메모리 복제본이란 무엇인가요?

인메모리 복제본을 활성화하면 여러 쿼리 노드에서 컬렉션의 데이터를 로드할 수 있으므로 추가 CPU 및 메모리 리소스를 활용할 수 있습니다. 이 기능은 데이터 세트가 비교적 작지만 읽기 처리량을 늘리고 하드웨어 리소스의 활용도를 높이고자 하는 경우에 매우 유용합니다.

현재 Milvus 벡터 데이터베이스는 각 세그먼트에 대해 하나의 복제본을 메모리에 보관합니다. 그러나 인메모리 복제본을 사용하면 서로 다른 쿼리 노드에 세그먼트의 복제본을 여러 개 가질 수 있습니다. 즉, 한 쿼리 노드가 세그먼트에 대한 검색을 수행하는 경우, 이 쿼리 노드가 정확히 동일한 세그먼트의 복제본을 가지고 있기 때문에 들어오는 새 검색 요청을 다른 유휴 쿼리 노드에 할당할 수 있습니다.

또한 인메모리 복제본이 여러 개 있으면 쿼리 노드가 충돌하는 상황에 더 잘 대처할 수 있습니다. 이전에는 다른 쿼리 노드에서 검색을 계속하기 위해 세그먼트가 다시 로드될 때까지 기다려야 했습니다. 하지만 인메모리 복제를 사용하면 데이터를 다시 로드할 필요 없이 검색 요청을 즉시 새 쿼리 노드로 재전송할 수 있습니다.

Replication 복제

인메모리 복제본이 중요한 이유는 무엇인가요?

인메모리 복제본을 활성화하면 얻을 수 있는 가장 중요한 이점 중 하나는 전체 QPS(초당 쿼리 수)와 처리량이 증가한다는 것입니다. 또한, 여러 세그먼트 복제본을 유지 관리할 수 있으며 장애 조치 시에도 시스템의 복원력이 향상됩니다.

Milvus 벡터 데이터베이스에서 인메모리 복제본 활성화

Milvus 벡터 데이터베이스에서 인메모리 복제본의 새로운 기능을 활성화하는 것은 매우 쉽습니다. 컬렉션을 로드할 때 원하는 복제본 수를 지정하기만 하면 됩니다(예: collection.load() 호출 ).

다음 예제 튜토리얼에서는 이미 "book"이라는 이름의 컬렉션을 만들고 여기에 데이터를 삽입했다고 가정합니다. 그런 다음 다음 명령을 실행하여 책 컬렉션을 로드할 때 두 개의 복제본을 만들 수 있습니다.

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load(replica_number=2) # load collection as 2 replicas

위 예제 코드의 복제본 수는 애플리케이션 시나리오에 가장 적합하도록 유연하게 수정할 수 있습니다. 그러면 추가 명령을 실행하지 않고도 여러 복제본에 대해 벡터 유사도 검색 또는 쿼리를 직접 수행할 수 있습니다. 그러나 허용되는 최대 복제본 수는 쿼리 노드를 실행하는 데 사용할 수 있는 총 메모리 양에 의해 제한된다는 점에 유의해야 합니다. 지정한 복제본 수가 사용 가능한 메모리 제한을 초과하면 데이터 로드 중에 오류가 반환됩니다.

collection.get_replicas() 을 실행하여 생성한 인메모리 복제본의 정보를 확인할 수도 있습니다. 복제본 그룹과 해당 쿼리 노드 및 샤드에 대한 정보가 반환됩니다. 다음은 출력 예시입니다.

Replica groups:
- Group: <group_id:435309823872729305>, <group_nodes:(21, 20)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:21>, <shard_nodes:[21]>, Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:20>, <shard_nodes:[20, 21]>]>
- Group: <group_id:435309823872729304>, <group_nodes:(25,)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:25>, <shard_nodes:[25]>, Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:25>, <shard_nodes:[25]>]>

다음 단계

Milvus 2.1의 공식 출시와 함께 새로운 기능을 소개하는 블로그 시리즈를 준비했습니다. 이 블로그 시리즈에서 자세히 읽어보세요:

Like the article? Spread the word

계속 읽기