2. Real Milvus
Milvus Architecture Overview
Milvus는 인기있는 벡터 검색 라이브러리인 Faiss, Annoy, HNSW 등을 기반으로 구축되었으며, 수백만, 수십억 또는 수조의 벡터를 포함하는 밀도가 높은 벡터 데이터셋에 대한 유사성 검색을 위해 설계되었습니다. 진행하기 전에 임베딩 검색의 기본 원칙을 숙지해 보세요.
또한 Milvus는 데이터 샤딩, 데이터 지속성, 스트리밍 데이터 투입, 벡터 및 스칼라 데이터 간의 하이브리드 검색 및 기타 고급 기능을 지원합니다. 이 플랫폼은 필요에 따라 성능을 제공하며 임베딩 검색 시나리오에 맞게 최적화할 수 있습니다. 최상의 가용성과 탄력성을 위해 Milvus를 Kubernetes를 사용하여 배포하는 것을 권장합니다.
Milvus는 수평적 확장을 위한 컴퓨팅 노드용으로 저장 및 계산 분리 및 공유 저장소 아키텍처를 채택합니다. 데이터 평면과 제어 평면 분리 원칙을 따라 Milvus는 액세스 레이어, 코디네이터 서비스, 작업 노드 및 저장소로 구성된 네 개의 레이어로 이루어집니다. 이러한 레이어는 확장 또는 재해 복구에 관해서는 상호 독립적입니다.
Storage/Computing Disaggregation
Milvus는 데이터 평면과 제어 평면 분리 원칙을 따르며, 스케일링 및 재해 복구 관련에서 상호 독립적인 네 개의 레이어로 구성됩니다.
액세스 레이어 (Access layer)
액세스 레이어는 상태를 가지지 않는 프록시 그룹으로 구성되며 시스템의 전면 레이어 및 사용자의 엔드포인트 역할을 합니다. 이 레이어는 클라이언트 요청을 확인하고 반환된 결과를 줄입니다. 이 레이어의 주요 특징은 다음과 같습니다:
- 프록시는 자체적으로 상태를 가지지 않습니다. Nginx, Kubernetes Ingress, NodePort 및 LVS와 같은 로드 밸런싱 구성 요소를 사용하여 통합 서비스 주소를 제공합니다.
- Milvus는 대규모 병렬 처리(MPP) 아키텍처를 사용하므로 프록시는 중간 결과를 집계하고 후처리한 후 최종 결과를 클라이언트에 반환합니다.
코디네이터 서비스 (Coordinator service)
코디네이터 서비스는 작업 노드에 작업을 할당하고 시스템의 두뇌 역할을 합니다. 이 작업에는 클러스터 토폴로지 관리, 로드 밸런싱, 타임스탬프 생성, 데이터 선언 및 데이터 관리 등이 포함됩니다. 코디네이터 서비스에는 루트 코디네이터 (root coord), 데이터 코디네이터 (data coord), 쿼리 코디네이터 (query coord) 및 인덱스 코디네이터 (index coord)와 같은 네 가지 유형이 있습니다.
- 루트 코디네이터 (root coord): DDL 및 DCL(데이터 제어 언어) 요청을 처리하고, 컬렉션, 파티션 또는 인덱스 생성 또는 삭제와 같은 작업을 처리하며, TSO (타임스탬프 오라클) 및 타임 티커 발급을 관리합니다.
- 쿼리 코디네이터 (query coord): 쿼리 노드의 토폴로지 및 로드 밸런싱을 관리하며, 성장 중인 세그먼트에서 봉인된 세그먼트로의 전환을 처리합니다.
- 데이터 코디네이터 (data coord): 데이터 노드의 토폴로지를 관리하고 메타데이터를 유지 관리하며 플러시, 컴팩트 및 기타 백그라운드 데이터 작업을 트리거합니다.
- 인덱스 코디네이터 (index coord): 인덱스 노드의 토폴로지를 관리하고 인덱스를 작성하며 인덱스 메타데이터를 유지 관리합니다.
작업 노드 (Worker nodes)
작업 노드는 시스템의 "팔과 다리" 역할을 합니다. 작업 노드는 코디네이터 서비스의 지시를 따르고 프록시로부터 DML(데이터 조작 언어) 명령을 실행하는 상태를 가지지 않는 덤파(무능한 실행자)입니다. 저장 및 계산의 분리로 인해 작업 노드는 Kubenetes에 배치할 때 시스템 확장 및 재해 복구를 용이하게 합니다. 작업 노드에는 세 가지 유형이 있습니다:
- 쿼리 노드 (Query node): 쿼리 노드는 증분 로그 데이터를 검색하고 이를 로그 브로커에 가입하여 성장 중인 세그먼트로 변환하며, 객체 저장소에서 기존 데이터를 로드하고 벡터 및 스칼라 데이터 간의 하이브리드 검색을 실행합니다.
- 데이터 노드 (Data node): 데이터 노드는 로그 브로커에 가입하여 증분 로그 데이터를 검색하고 변이 요청을 처리하며, 로그 데이터를 로그 스냅샷으로 패킹하고 객체 저장소에 저장합니다.
- 인덱스 노드 (Index node): 인덱스 노드는 인덱스를 작성하며, 메모리 상주형일 필요가 없으며 서버리스 프레임워크를 사용하여 구현할 수 있습니다.
저장소 (Storage)
저장소는 시스템의 핵심 역할을 하며 데이터 지속성을 담당합니다. 이는 메타 스토리지, 로그 브로커 및 객체 저장소로 구성됩니다.
- 메타 스토리지 (Meta storage): 메타 스토리지는 컬렉션 스키마, 노드 상태 및 메시지 소비 지점과 같은 메타데이터 스냅샷을 저장합니다. 메타데이터를 저장하는 것은 매우 높은 가용성, 강력한 일관성 및 트랜잭션 지원을 필요로 하므로 Milvus는 메타 스토어로 etcd를 선택했습니다. 또한 Milvus는 서비스 등록 및 헬스 체크를 위해 etcd를 사용합니다.
- 객체 저장소 (Object storage): 객체 저장소는 로그의 스냅샷 파일, 스칼라 및 벡터 데이터에 대한 인덱스 파일 및 중간 쿼리 결과를 저장합니다. Milvus는 객체 저장소로 MinIO를 사용하며, 전 세계에서 가장 인기 있는 경제적인 저장 서비스 중 두 개인 AWS S3와 Azure Blob에 손쉽게 배포할 수 있습니다. 그러나 객체 저장소는 높은 액세스 지연 시간과 쿼리 수에 따른 비용이 발생합니다. 성능을 향상시키고 비용을 줄이기 위해 Milvus는 메모리 또는 SSD 기반 캐시 풀에 대한 냉온 데이터 분리를 구현할 계획입니다.
- 로그 브로커 (Log broker): 로그 브로커는 재생을 지원하는 발행-구독 시스템으로, 스트리밍 데이터 지속성, 신뢰할 수 있는 비동기 쿼리 실행, 이벤트 통지 및 쿼리 결과 반환을 담당합니다. 또한 작업 노드가 시스템 장애로부터 복구할 때 증분 데이터의 무결성을 보장합니다. Milvus 클러스터는 로그 브로커로 Pulsar를 사용하며, Milvus 스탠드얼론은 로그 브로커로 RocksDB를 사용합니다. 또한 로그 브로커는 Kafka와 Pravega와 같은 스트리밍 데이터 저장 플랫폼으로 쉽게 대체할 수 있습니다. Milvus는 로그 지속성 및 스냅샷 로그를 통해 데이터 신뢰성을 보장하지만 물리적인 테이블을 유지하지 않는 "데이터로 로깅" 원칙을 따릅니다.
이 글은 https://milvus.io/docs를 chatGPT를 활용해 번역한 글입니다.