milvus 설치 및 테스트

cloud2000·2026년 4월 26일
post-thumbnail

helm chart clone

git clone https://github.com/zilliztech/milvus-helm.git
git checkout tags/milvus-5.0.19
git describe --tags
milvus-5.0.19

standalone 배포

values.yaml을 수정하여 standalone 배포로 구성한다.

각 컴포넌트 역할
내장 컴포넌트 (별도 설치 불필요)

  • RocksMQ: RocksDB 기반 내장 메시지 큐. Pulsar/Kafka 역할을 단일 노드용으로 대체
  • 모든 Coordinator (Root/Query/Data/Index): 단일 프로세스 내 동작

외부 의존성 (별도 필요)

  • etcd: 메타데이터 저장 (클러스터 상태, 스키마, 세그먼트 정보)
  • MinIO (또는 로컬 디스크): 벡터 인덱스·세그먼트 파일 저장
# ============================================
# [1] 모드 설정 - Standalone 핵심
# ============================================
cluster:
  enabled: false

# ============================================
# [2] Milvus Standalone 컨테이너 설정
# ============================================
standalone:
  messageQueue: rocksmq    # 내장 MQ 사용 (pulsar/kafka 불필요)

  resources:
    requests:
      cpu: "2"
      memory: "4Gi"
    limits:
      cpu: "4"
      memory: "8Gi"

  persistence:
    mountPath: "/var/lib/milvus"
    enabled: true
    persistentVolumeClaim:
      storageClass: "your-storage-class"   # 에어갭 환경 SC명 입력
      accessModes: ReadWriteOnce
      size: 50Gi

# ============================================
# [3] etcd 설정
# ============================================
etcd:
  replicaCount: 1
  resources:
    requests:
      cpu: "100m"
      memory: "256Mi"
  persistence:
    enabled: true
    storageClass: "your-storage-class"
    size: 10Gi

# ============================================
# [4] MinIO 설정
# ============================================
minio:
  enabled: true
  mode: standalone          # distributed → standalone으로 변경 필수
  accessKey: "minioadmin"
  secretKey: "minioadmin"   # 운영시 반드시 변경
  bucketName: "milvus-bucket"
  resources:
    requests:
      memory: 1Gi
  persistence:
    enabled: true
    storageClass: "your-storage-class"
    size: 100Gi

# ============================================
# [5] Pulsar 비활성화
# ============================================
pulsarv3:
  enabled: false

# ============================================
# [6] 이미지 설정 (에어갭 환경 핵심)
# ============================================
image:
  all:
    repository: "repo.utcloud.io/milvusdb/milvus"
    tag: "v2.5.4"
    pullPolicy: IfNotPresent

# ============================================
# [7] Milvus 내부 파라미터 오버라이드
# ============================================
extraConfigFiles:
  user.yaml: |+
    log:
      level: info
      file:
        rootPath: /var/lib/milvus/logs
    cache:
      cacheSize: 2GB        # 메모리의 25~30% 권장
    quotaAndLimits:
      enable: true
      queryRate:
        max: 100            # QPS 제한
helm upgrade milvus --install -f override-values.yaml .

kubectl get svc
NAME                   TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)              AGE
kubernetes             ClusterIP   192.168.194.129   <none>        443/TCP              406d
milvus                 ClusterIP   192.168.194.228   <none>        19530/TCP,9091/TCP   7h56m
milvus-etcd            ClusterIP   192.168.194.156   <none>        2379/TCP,2380/TCP    7h56m
milvus-etcd-headless   ClusterIP   None              <none>        2379/TCP,2380/TCP    7h56m
milvus-minio           ClusterIP   192.168.194.177   <none>        9000/TCP             7h56m

kubectl port-forward svc/milvus 9091:9091

browser로 http://localhost:9091/webui 로 접속하면 됨.


python SDK로 test

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
import numpy as np

# 1. Milvus 서버 연결
HOST = '127.0.0.1' # 로컬포트포워드 사용 시
PORT = '19530' # GRPC 포트

print(f"Connecting to Milvus at {HOST}:{PORT}...")
connections.connect("default", host=HOST, port=PORT)
print("Connected!")

# 2. 컬렉션(테이블) 생성
collection_name = "test_collection"

# 기존 컬렉션 삭제 (테스트 반복용)
if utility.has_collection(collection_name):
    utility.drop_collection(collection_name)

# 스키마 정의
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=4, is_primary=False)
]
schema = CollectionSchema(fields, "test collection schema")
collection = Collection(collection_name, schema)

# 3. 데이터 삽입
vectors = [[1.0, 0.5, 0.2, 0.1], [0.1, 0.2, 0.3, 0.4], [0.5, 0.5, 0.5, 0.5]]
collection.insert([vectors])
print(f"Inserted {collection.num_entities} entities.")

# 4. 인덱스 생성 및 로드
collection.create_index(field_name="vector", index_params={"index_type": "IVF_FLAT", "params": {"nlist": 128}, "metric_type": "L2"})
collection.load()

# 5. 유사도 검색
search_vectors = [[0.1, 0.2, 0.3, 0.4]]
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(search_vectors, "vector", search_params, limit=1, output_fields=["id"])

# 6. 결과 출력
for hits in results:
    for hit in hits:
        print(f"Hit: {hit}, Distance: {hit.distance}")

# 연결 종료
connections.disconnect("default")

참고 - Apache Pulsar

Apache Pulsar는 Yahoo!에서 개발하고 2016년 오픈소스로 공개된 클라우드 네이티브 분산 메시징 및 스트리밍 플랫폼임. 현재는 Apache Software Foundation 최상위 프로젝트임.


핵심 아키텍처

Pulsar의 가장 큰 특징은 컴퓨팅과 스토리지를 분리한 2계층 구조입니다.

Producer → [Broker 계층] → [BookKeeper 계층(Bookie)] → Consumer
             (stateless)        (stateful storage)
  • Broker: 메시지 라우팅·처리 담당. 상태를 갖지 않아 수평 확장이 쉬움
  • Apache BookKeeper (Bookie): 실제 데이터를 저장하는 분산 로그 스토리지. Broker와 독립적으로 확장 가능
  • ZooKeeper / etcd: 메타데이터·클러스터 코디네이션

Kafka와의 주요 차이점

항목PulsarKafka
아키텍처컴퓨팅/스토리지 분리일체형 (Broker가 스토리지 담당)
구독 모델4가지 (Exclusive, Shared, Failover, Key_Shared)Consumer Group
멀티 테넌시기본 지원 (Tenant/Namespace)별도 설정 필요
Geo-Replication기본 내장MirrorMaker 별도 필요
메시지 TTL/보존Topic 레벨 세밀 제어Log retention
확장성Broker·Bookie 독립 확장Partition 재배치 필요

핵심 기능

1. 유연한 구독 모델

  • Exclusive: 하나의 Consumer만 수신
  • Shared (Round-robin): 여러 Consumer가 분산 수신 → 큐 방식
  • Failover: 주 Consumer 장애 시 자동 전환
  • Key_Shared: Key 기반 라우팅 (순서 보장)

2. 멀티 테넌시

tenant/namespace/topic 계층 구조
예: my-company/payments/transactions

팀·서비스별 격리, 할당량(Quota), 권한 관리가 기본 내장

3. Pulsar Functions

  • 경량 서버리스 컴퓨팅 레이어
  • Kafka Streams/Flink 없이 Topic 간 간단한 스트림 처리 가능

4. Pulsar IO (Connectors)

  • Kafka, Kinesis, JDBC, Elasticsearch 등 다양한 Source/Sink 커넥터 내장

5. Tiered Storage

  • 오래된 데이터를 S3, GCS, HDFS 등 오브젝트 스토리지로 자동 오프로드

적합한 사용 사례

  • 대규모 멀티 테넌트 환경 (여러 팀·서비스가 하나의 클러스터 공유)
  • 글로벌 서비스 (Active-Active Geo-Replication 필요 시)
  • IoT / 엣지 (대량의 소규모 메시지, 다양한 구독 패턴)
  • 금융 트랜잭션 (순서 보장 + 내구성 요구)
  • 클라우드 네이티브 K8s 환경 (Broker 독립 확장이 유리)

단점 / 고려사항

  • 운영 복잡도: Broker + BookKeeper + ZooKeeper 3가지 컴포넌트 관리
  • 생태계: Kafka에 비해 커뮤니티·라이브러리가 상대적으로 작음
  • 메모리 사용: BookKeeper가 JVM 기반으로 메모리 튜닝 필요
  • 학습 곡선: Kafka 대비 개념(Namespace, Bookie 등)이 낯설 수 있음
profile
유티클라우드

0개의 댓글