LLM WikiAccess-protected knowledge portal

WIKI

Milvus 3.0: 데이터를 복사하지 않고 레이크에서 직접 벡터 검색하는 Vector Lakebase 아키텍처

왜 지금 봐야 하나 2026년 7월 16일 Zilliz는 Milvus 3.0 GA를 발표하면서 "Vector Lakebase"라는 신조어를 꺼냈다. 이 단어가 중요한 이유는 마케팅 때문이 아니라 데이터 이동 문제에 대한 설계 응답 이기 때문이다. 기존 Milvus 2.x에서 데이터 레이크 S3/GCS/ADLS 의 데이터를 벡터 검색에 활용하려면 추출 → Milvus 로드 → 인덱스 빌드 과정을 거쳐야 했다. 이 과정은 세 가지

경로human/study/content/database-frontier/59-milvus-3-0-vector-lakebase-external-collection-loon.md
카테고리Study
태그#collection #crawler #external #lakebase #loon #mysql #study #vector

왜 지금 봐야 하나

2026년 7월 16일 Zilliz는 Milvus 3.0 GA를 발표하면서 "Vector Lakebase"라는 신조어를 꺼냈다. 이 단어가 중요한 이유는 마케팅 때문이 아니라 데이터 이동 문제에 대한 설계 응답이기 때문이다.

기존 Milvus 2.x에서 데이터 레이크(S3/GCS/ADLS)의 데이터를 벡터 검색에 활용하려면 추출 → Milvus 로드 → 인덱스 빌드 과정을 거쳐야 했다. 이 과정은 세 가지 문제를 낳는다.

  1. 비용: 동일 데이터가 레이크와 벡터 DB에 각각 복제되어 저장 비용이 두 배가 된다.
  2. 복잡성: 소스 데이터가 바뀔 때마다 ETL 파이프라인이 재실행돼야 한다.
  3. 위험: 로딩 과정에서 데이터가 외부로 이동하므로 프라이버시 경계가 흐려진다.

Milvus 3.0의 External Collection은 이 세 문제를 한꺼번에 겨냥한다. 데이터를 Milvus로 가져오는 대신, Milvus가 데이터가 있는 곳에서 직접 인덱스를 만든다. 데이터는 이동하지 않는다.


아키텍처 전환: Vector Database에서 Vector Lakebase로

Milvus 2.x — 데이터 이동 필요
데이터 레이크
S3 / GCS / ADLS
(Parquet, Iceberg)
ETL 복사
Milvus 로컬 스토리지
데이터 중복 저장
벡터 인덱스
Milvus 3.0 — 제자리 인덱싱 (Zero-Copy)
데이터 레이크
S3 / GCS / ADLS
(Iceberg / Parquet / Lance / Vortex)
인덱스만 참조
External Collection
벡터·전문검색·스칼라 인덱스
데이터 원본 불변
Milvus 2.x vs 3.0 아키텍처 비교

변화의 핵심

항목Milvus 2.xMilvus 3.0
데이터 위치Milvus 내부 스토리지원래 레이크 (불변)
인덱스 위치Milvus 내부Milvus가 레이크 옆에 생성
데이터 복사필요없음
소스 갱신 반영ETL 재실행증분 동기화
지원 형식자체 세그먼트Iceberg / Parquet / Lance / Vortex
스토리지 엔진이전 방식Loon (신규)

External Collection

External Collection은 Milvus 3.0의 핵심 기능이다. 데이터를 Milvus 컬렉션으로 "정의"하되 실제 데이터는 레이크에 그대로 둔다.

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

# 외부 Iceberg 테이블을 Milvus 컬렉션으로 등록
client.create_collection_from_lake(
    collection_name="product_embeddings",
    # 데이터 소스: S3의 Iceberg 테이블
    data_source={
        "type": "iceberg",
        "uri": "s3://my-bucket/warehouse/products",
        "catalog": "glue",  # AWS Glue 카탈로그
    },
    # 필드 매핑: 레이크 스키마 → Milvus 컬렉션 필드
    field_mapping=[
        {"source_field": "product_id", "dest_field": "id", "is_primary": True},
        {"source_field": "name_embedding", "dest_field": "vector", "dim": 768},
        {"source_field": "name", "dest_field": "name"},
        {"source_field": "category", "dest_field": "category"},
    ],
    index_params=[
        {"field_name": "vector", "index_type": "HNSW", "metric_type": "COSINE"},
    ],
)

등록 후에는 일반 Milvus 컬렉션과 동일하게 검색할 수 있다.

results = client.search(
    collection_name="product_embeddings",
    data=[query_embedding],
    anns_field="vector",
    search_params={"metric_type": "COSINE", "params": {"ef": 128}},
    limit=10,
    output_fields=["name", "category"],
)

지원 포맷:


새 스토리지 엔진: Loon

Milvus 3.0은 Loon이라는 새 스토리지 엔진을 도입했다. 기존 스토리지 엔진이 세그먼트 파일을 직접 관리했다면, Loon은 매니페스트(manifest) 기반으로 스토리지를 관리한다.

Loon의 설계 목표:

Loon Storage Engine
Manifest Layer
파일 위치·버전·변경 이력
Vortex Files
Arrow 호환 컬럼형 포맷
벡터 + 스칼라 혼합 저장
Index Files
HNSW / Scalar / 전문검색
오브젝트 스토리지
S3 / GCS / Azure Blob
매니페스트가 변경 이력을 추적하므로 랜덤 읽기 없이 필요한 청크만 접근
Loon 스토리지 엔진 구조

Snapshot: 프로덕션을 멈추지 않는 포인트인타임 뷰

Snapshot은 컬렉션의 특정 시점 읽기 전용 뷰다. 프로덕션 컬렉션이 실시간으로 업데이트되는 동안, 평가·검증·오프라인 분석 작업을 별도 Snapshot에서 실행할 수 있다.

# 현재 상태의 스냅샷 생성
snapshot = client.create_snapshot(
    collection_name="product_embeddings",
    snapshot_name="eval-2026-07-29",
)

# 스냅샷을 대상으로 검색 (프로덕션 컬렉션과 독립적)
eval_results = client.search(
    collection_name="product_embeddings",
    snapshot_name="eval-2026-07-29",
    data=[query_embedding],
    anns_field="vector",
    limit=5,
)

Snapshot의 실제 활용 패턴:


네이티브 하이브리드 검색

Milvus 2.x에서도 하이브리드 검색이 가능했지만, 전문 검색(full-text search)을 위해 Elasticsearch 클러스터를 따로 운영해야 하는 경우가 많았다. Milvus 3.0은 벡터 검색과 전문 검색을 단일 엔진에서 처리한다.

from pymilvus import AnnSearchRequest, RRFRanker

# 벡터 검색 요청
vector_req = AnnSearchRequest(
    data=[query_embedding],
    anns_field="vector",
    param={"metric_type": "COSINE", "params": {"ef": 128}},
    limit=20,
)

# 전문 검색 요청
text_req = AnnSearchRequest(
    data=["노트북 배터리 교체"],
    anns_field="title_bm25",
    param={"metric_type": "BM25"},
    limit=20,
)

# Reciprocal Rank Fusion으로 결과 통합
results = client.hybrid_search(
    collection_name="products",
    reqs=[vector_req, text_req],
    ranker=RRFRanker(k=60),
    limit=10,
    output_fields=["title", "category"],
)

단일 엔진에서 하이브리드 검색이 가능해지면서 Elasticsearch/OpenSearch를 벡터 파이프라인에서 제거할 수 있는 경우가 생긴다. 단, 복잡한 전문 검색(언어별 형태소 분석, 커스텀 Analyzer)이 필요한 경우에는 전문 검색 엔진이 더 적합할 수 있다.


배포 방식

Milvus 3.0은 K8s와 Docker 배포를 공식 지원한다.

# Helm 차트로 K8s 배포 (간략화)
helm install milvus milvus/milvus \
  --set cluster.enabled=true \
  --set minio.enabled=false \
  --set externalS3.enabled=true \
  --set externalS3.host=s3.amazonaws.com \
  --set externalS3.bucketName=my-milvus-bucket

지원 오브젝트 스토리지:

SDK 지원:


운영 체크리스트

External Collection 도입 전 확인

Snapshot 운영

Loon + Vortex 스토리지

하이브리드 검색


Milvus 2.x에서 3.0으로 마이그레이션

주요 변경점:

# 버전 확인
python -c "import pymilvus; print(pymilvus.__version__)"

# 3.0 호환 SDK 설치
pip install "pymilvus>=3.0"

Open question


References