Vector database showroom. Part 6 Milvus — 고속 화물 열차
요약
Milvus는 수십억 개의 벡터를 처리하는 분산형 벡터 데이터베이스입니다. Go와 C++ 코어 기반이며, 프록시, 코디네이터, 워커 노드 등으로 구성된 복잡한 아키텍처를 갖추고 있습니다. GPU 가속 및 DiskANN 지원을 통해 대규모 검색 성능과 용량을 확보했습니다.
핵심 포인트
- 수십억 벡터 처리가 가능한 분산형 구조 (Proxy, Coordinator, Worker).
- GPU 가속(RAPIDS) 및 DiskANN으로 확장성/성능 강화.
- 희소 벡터와 BM25를 지원하는 하이브리드 검색 기능 제공.
- 운영 복잡도가 높으므로 전문적인 인프라 운영 역량이 필수적임.
🚄 Milvus — 고속 화물 열차
수십억 개의 벡터가 실려 메인 라인을 지배합니다. 하지만 레일이 건설되기 전까지는 아무도 탑승하지 않습니다.
내부 구조: Go + C++ 코어, Apache 2.0 라이선스 기반이며 Linux Foundation의 LF AI & Data에서 진행하는 단계적 프로젝트입니다. Zilliz가 주도하고 있으며 (Zilliz Cloud라는 관리형 서비스를 판매하기도 합니다). 분산 배포는 실제 아키텍처를 갖추고 있습니다: 프록시, 코디네이터 서비스, 워커 노드(쿼리, 데이터, 인덱스)로 구성되며 — 이 모든 것이 중앙 로그(Pulsar 또는 Kafka)에 연결되어 있고, 메타데이터 관리는 etcd가, 객체 스토리지는 MinIO/S3이 담당합니다. 벡터는 객체 스토리지에 존재하며; 저장소와 컴퓨팅은 분리됩니다. 세 가지 규격의 하나의 열차: Milvus Lite (임베디드, pip install로 설치 가능, 데스크 규모), Milvus Standalone (레일 버스 — 자체 Milvus, 메타데이터용 etcd, 객체 스토리지를 위한 MinIO의 세 컨테이너), 그리고 Milvus Distributed (메인 라인 — Kubernetes 기반 Helm).
강점:
- 수십억 개의 벡터를 처리하는 홈 스타디움: 용량은 RAM 예산이 아닌 객체 스토리지에 따라 확장됩니다. 수평적 확장은 워커 노드를 추가함으로써 이루어집니다. 이 도구는 '벡터 데이터베이스'라는 카테고리를 만든 주역입니다.
- GPU 가속 (v2.4부터): NVIDIA의 RAPIDS를 기반으로 하는 GPU_CAGRA — 검색이 병목 현상이 발생하고 실리콘 자원이 충분할 때 유용합니다.
- DiskANN (v2.4부터): 인덱스가 SSD에 저장됩니다 — RAM을 초과하는 벡터를 처리하며, 용량을 위해 지연 시간을 희생합니다.
- **희소 벡터(Sparse vectors)**는 v2.4부터 지원되며, v2.5부터 내장된 BM25 전체 텍스트 검색 기능을 제공합니다 — 별도의 희소 임베더가 필요 없는 공장급 하이브리드 기능입니다.
- 문서화된 패턴을 갖춘 다중 테넌시(파티션 키, 개별 데이터베이스), RBAC, TLS 지원과 적절한 관리자 GUI인 Attu를 제공합니다. 쇼룸에 전시된 차량 중 코크핏 디스플레이가 포함된 유일한 제품입니다.
- 이 카테고리에서 가장 큰 OSS 커뮤니티 중 하나이며; Python/Java/Go/Node용 SDK, LangChain/LlamaIndex 통합을 지원합니다. 혹은 철도를 임대하고 싶다면 Zilliz Cloud를 이용할 수 있습니다.
약점:
- 구축 환경(The rails): 분산 배포는 etcd + Pulsar/Kafka + MinIO/S3와 Milvus 파드 자체를 의미합니다. Helm 차트가 도움을 주지만, 운영 역량(ops muscle)은 필수적입니다. (Lite 및 Standalone이 이 복잡성을 실제로 줄여줍니다 — 아래 매뉴얼 참조)
- 임베딩 직접 제공: 임베더(embedder)가 아닌 데이터베이스를 사용해야 합니다 (hatchback과 crossover에 적용되는 것과 동일한 규칙).
- Postgres와 같은 ACID 트랜잭션 부재: 배치 처리(batches)는 트랜잭션이 아닙니다 — 스테이션 왜건은 여전히 그 차선을 차지합니다.
- 튜닝은 계약의 일부: M, efConstruction, nprobe/ef 등 인덱스 유형별 파라미터와 쿼리당 일관성 수준(consistency level)을 설정해야 합니다.
- 백업: 전용 milvus-backup 도구를 통해 실행합니다: 계획하고 리허설해야 합니다. 여기에는 "그냥 내 Postgres 클러스터" 같은 단순함이 없습니다.
매뉴얼을 건너뛰면 문제가 발생하는 경우:
- 거리 모퉁이를 위해 메인라인(mainline)을 구매한 사례. 커뮤니티 채팅에서 나온 복합적인 이야기로, 세부 사항은 변경되었습니다. 한 팀이 분산 Milvus 환경에서 30만 개 문서에 대한 시맨틱 검색을 수행합니다 — 이 파드들 중 정확히 두 가지 종류만이 쿼리를 수락할 수 있습니다. 왜냐하면 대기업 강연에서 수십억 건의 데이터가 언급되었기 때문입니다. 주니어 개발자가 질문합니다: "왜 Postgres를 사용하지 않나요? 이미 Postgres가 있어요." 계산기 결과: 300,000 × 1536 차원 × 4 바이트 ≈ 1.8 GB. 적절한 규모는 처음부터 존재했습니다: 프로토타입용 Milvus Lite, 소규모 운영 환경용 Standalone, 수십억 건을 위한 Distributed입니다. 문제는 Milvus 자체가 아니라 스케일 불일치(scale mismatch)입니다.
- 벤치마크 함정 #2 (hatchback의 사촌): 새로운 삽입 데이터는 성장하는 세그먼트에 도착하며, 이들은 봉인되고 인덱싱될 때까지 무차별 검색(brute force)을 거칩니다. 로딩 직후 또는 아주 작은 컬렉션에 대해 수행된 순진한 벤치마크는 사용자의 인덱스가 아닌 정확한 검색만 측정합니다. 정직한 수치: 운영 환경과 유사한 볼륨, 안정화된 세그먼트, 따뜻한(warm) 쿼리
- 일관성 수준은 쿼리별 적용: (기본값: bounded) strong / bounded / session / eventually가 있습니다. 더 약한 수준에서는 "삽입 → 즉시 검색" 테스트가 택시의 eventual consistency처럼 불안정하게 작동합니다.
필요한 경로에 따라 세션(session) 또는 강함(strong)을 선택하세요
- 메트릭(Metric)과 차원(dimension)은 컬렉션 생성 시 고정됩니다 — 해치백(hatchback)이나 택시(taxi)와 동일한 규칙입니다. 여기서의 탈출구는 실제로 우아합니다: 새 컬렉션을 구축하고 컬렉션 별칭을 전환하면 됩니다 — 제로 다운타임 재인덱싱(zero-downtime re-index)은 문서화된 패턴입니다
- 파티션 키(partition key)(파티션 키 테넌시를 사용하는 경우) 역시 생성 시 고정됩니다 — 나중에 테넌시를 적용하려면 데이터를 다시 전송해야 합니다
소유 비용: 기차 자체는 무료입니다 (Apache 2.0); 하지만 철도 전체가 그렇지 않습니다 — 라이선스뿐만 아니라 운영 인력(ops salary)을 계산하세요. Zilliz Cloud(관리형, 서버리스 티어 포함)는 전체 철도를 임대해줍니다. 셀프 호스팅용 Lite와 Standalone은 각각 노트북과 소규모 서버에 적합합니다.
메커니즘 및 부품: 개발은 Zilliz가 주도하고; LF AI & Data가 중립적인 거버넌스를 제공하며; 커뮤니티는 이 분야에서 가장 큰 규모 중 하나입니다. 'Milvus 엔지니어'는 Postgres 엔지니어보다 더 희귀하지만 — 이것은 DevOps 팀이 실제로 운영할 수 있는 Kubernetes 네이티브 시스템이며, 중요도가 높을 때는 벤더 지원도 받을 수 있습니다.
✅ 다음 경우에 선택하세요: 벡터가 수억 개에서 수십억 개에 달하고, GPU 또는 RAM 이상의 용량이 필요하며, 많은 테넌트를 실행하거나, (혹은 고용할) 실제 운영 인력이 있는 경우 — 또는 Zilliz Cloud를 사용하여 철도 구축 과정을 건너뛰고 싶은 경우
❌ 다음 경우에 보류하세요: 단일 장치에서 1천만 개 미만의 벡터인 경우 (해치백이나 화차로 충분함), '성장할 계획'이 유일한 주장인 경우, 또는 팀원 누구도 Helm 차트(Helm chart)를 소유하고 싶어 하지 않는 경우
테스트 드라이브:
# Milvus Lite는 임베디드 방식으로 실행됩니다 — 컨테이너가 필요하지 않습니다 (Linux/macOS)
# 프로덕션 게이지: Standalone (3-컨테이너 compose) 또는 Distributed (K8s의 Helm)
from pymilvus import MilvusClient, DataType
...
이 기차는 웅장합니다 — 자신이 운행하도록 설계된 본선에서 말이죠. 벡터가 30만 개일 때 물어보세요 — Postgres가 승리합니다. 30억 개일 때 물어보세요 — 기차가 승리합니다. 보유한 규모에 맞춰 구매하고; 도달하는 규모에 맞춰 재검토하세요.
🚦 쇼룸의 마지막 부분: 여섯 대의 차량이 나란히 배치되어 있으며, 소유 비용표(cost-of-ownership table), 의사 결정 트리(decision tree), 그리고 선택한 차량을 위한 하루 체험 주행 체크리스트가 준비되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기