데이터 통신 최적화: Milvus, NATS 메시징 도입
데이터 처리의 복잡한 태피스트리에서, 원활한 커뮤니케이션은 작업을 하나로 묶는 실과 같습니다. 선구적인 오픈 소스 벡터 데이터베이스인 Milvus는 최신 기능인 NATS 메시징 통합을 통해 혁신적인 여정을 시작했습니다. 이 포괄적인 블로그 게시물에서는 이 통합의 복잡한 세부 사항을 풀어내며, 핵심 기능, 설정 과정, 마이그레이션 이점, 그리고 이전 버전인 RocksMQ와 비교했을 때 어떤 차이가 있는지 살펴보겠습니다.
Milvus에서 메시지 큐의 역할 이해하기
Milvus의 클라우드 네이티브 아키텍처에서 메시지 큐, 즉 Log Broker는 핵심적인 중요성을 지닙니다. 이는 지속적인 데이터 스트림, 동기화, 이벤트 알림, 시스템 복구 중 데이터 무결성을 보장하는 중추입니다. 전통적으로 RocksMQ는 특히 Pulsar 및 Kafka와 비교했을 때 Milvus Standalone 모드에서 가장 간단한 선택이었지만, 방대한 데이터와 복잡한 시나리오에서는 그 한계가 분명해졌습니다.
Milvus 2.3은 단일 노드 MQ 구현인 NATS를 도입하여 데이터 스트림을 관리하는 방식을 재정의합니다. 이전 솔루션들과 달리 NATS는 Milvus 사용자를 성능 제약에서 해방시켜, 상당한 데이터 볼륨을 처리할 때 원활한 경험을 제공합니다.
NATS란 무엇인가요?
NATS는 Go로 구현된 분산 시스템 연결 기술입니다. 시스템 전반에서 Request-Reply 및 Publish-Subscribe와 같은 다양한 통신 모드를 지원하고, JetStream을 통해 데이터 영속성을 제공하며, 내장 RAFT를 통해 분산 기능을 제공합니다. NATS에 대해 더 자세히 이해하려면 NATS 공식 웹사이트를 참고할 수 있습니다.
Milvus 2.3 Standalone 모드에서 NATS, JetStream, PubSub은 Milvus에 강력한 MQ 기능을 제공합니다.
NATS 활성화하기
Milvus 2.3은 사용자가 사용하려는 MQ 유형을 지정할 수 있는 새로운 제어 옵션인 mq.type을 제공합니다. NATS를 활성화하려면 mq.type=natsmq로 설정하세요. Milvus 인스턴스를 시작한 후 아래와 유사한 로그가 표시된다면, 메시지 큐로 NATS를 성공적으로 활성화한 것입니다.
[INFO] [dependency/factory.go:83] ["try to init mq"] [standalone=true] [mqType=natsmq]
Milvus용 NATS 구성하기
NATS 사용자 지정 옵션에는 수신 포트, JetStream 저장 디렉터리, 최대 페이로드 크기, 초기화 시간 제한 지정이 포함됩니다. 이러한 설정을 세밀하게 조정하면 최적의 성능과 안정성을 보장할 수 있습니다.
natsmq:
server: # server side configuration for natsmq.
port: 4222 # 4222 by default, Port for nats server listening.
storeDir: /var/lib/milvus/nats # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
maxFileStore: 17179869184 # (B) 16GB by default, Maximum size of the 'file' storage.
maxPayload: 8388608 # (B) 8MB by default, Maximum number of bytes in a message payload.
maxPending: 67108864 # (B) 64MB by default, Maximum number of bytes buffered for a connection Applies to client connections.
initializeTimeout: 4000 # (ms) 4s by default, waiting for initialization of natsmq finished.
monitor:
trace: false # false by default, If true enable protocol trace log messages.
debug: false # false by default, If true enable debug log messages.
logTime: true # true by default, If set to false, log without timestamps.
logFile: /tmp/milvus/logs/nats.log # /tmp/milvus/logs/nats.log by default, Log file path relative to .. of milvus binary if use relative path.
logSizeLimit: 536870912 # (B) 512MB by default, Size in bytes after the log file rolls over to a new one.
retention:
maxAge: 4320 # (min) 3 days by default, Maximum age of any message in the P-channel.
maxBytes: # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
maxMsgs: # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.
참고:
NATS 서버 리스닝을 위해
server.port를 지정해야 합니다. 포트 충돌이 있는 경우 Milvus를 시작할 수 없습니다. 포트를 무작위로 선택하려면server.port=-1로 설정하세요.storeDir은 JetStream 스토리지의 디렉터리를 지정합니다. Milvus의 읽기/쓰기 처리량을 향상하기 위해 이 디렉터리를 고성능 솔리드 스테이트 드라이브(SSD)에 저장하는 것을 권장합니다.maxFileStore는 JetStream 스토리지 크기의 상한을 설정합니다. 이 제한을 초과하면 추가 데이터 쓰기가 방지됩니다.maxPayload는 개별 메시지 크기를 제한합니다. 쓰기 거부를 방지하려면 5MB 이상으로 유지해야 합니다.initializeTimeout은 NATS 서버 시작 시간 초과를 제어합니다.monitor는 NATS의 독립 로그를 구성합니다.retention은 NATS 메시지의 보존 메커니즘을 제어합니다.
자세한 내용은 NATS 공식 문서를 참조하세요.
RocksMQ에서 NATS로 마이그레이션
RocksMQ에서 NATS로의 마이그레이션은 쓰기 작업 중지, 데이터 플러시, 구성 수정, Milvus 로그를 통한 마이그레이션 확인 등의 단계를 포함하는 원활한 프로세스입니다.
마이그레이션을 시작하기 전에 Milvus의 모든 쓰기 작업을 중지합니다.
Milvus에서
FlushALL작업을 실행하고 완료될 때까지 기다립니다. 이 단계는 보류 중인 모든 데이터가 플러시되고 시스템이 종료 준비가 되었는지 확인합니다.mq.type=natsmq를 설정하고natsmq섹션 아래의 관련 옵션을 조정하여 Milvus 구성 파일을 수정합니다.Milvus 2.3을 시작합니다.
rocksmq.path디렉터리에 저장된 원본 데이터를 백업하고 정리합니다. (선택 사항)
NATS vs. RocksMQ: 성능 대결
Pub/Sub 성능 테스트
테스트 플랫폼: M1 Pro Chip / Memory: 16GB
테스트 시나리오: 마지막 게시 결과가 수신될 때까지 주제에 무작위 데이터 패킷을 반복적으로 구독하고 게시합니다.
결과:
더 작은 데이터 패킷(< 64kb)의 경우 RocksMQ가 메모리, CPU 및 응답 속도 측면에서 NATS보다 우수합니다.
더 큰 데이터 패킷(> 64kb)의 경우 NATS가 RocksMQ보다 뛰어나 훨씬 더 빠른 응답 시간을 제공합니다.
| 테스트 유형 | MQ | op count | op당 비용 | 메모리 비용 | CPU 총 시간 | 스토리지 비용 |
|---|---|---|---|---|---|---|
| 5MB*100 Pub/Sub | NATS | 50 | 1.650328186 s/op | 4.29 GB | 85.58 | 25G |
| 5MB*100 Pub/Sub | RocksMQ | 50 | 2.475595131 s/op | 1.18 GB | 81.42 | 19G |
| 1MB*500 Pub/Sub | NATS | 50 | 2.248722593 s/op | 2.60 GB | 96.50 | 25G |
| 1MB*500 Pub/Sub | RocksMQ | 50 | 2.554614279 s/op | 614.9 MB | 80.19 | 19G |
| 64KB*10000 Pub/Sub | NATS | 50 | 2.133345262 s/op | 3.29 GB | 97.59 | 31G |
| 64KB*10000 Pub/Sub | RocksMQ | 50 | 3.253778195 s/op | 331.2 MB | 134.6 | 24G |
| 1KB*50000 Pub/Sub | NATS | 50 | 2.629391004 s/op | 635.1 MB | 179.67 | 2.6G |
| 1KB*50000 Pub/Sub | RocksMQ | 50 | 0.897638581 s/op | 232.3 MB | 60.42 | 521M |
표 1: Pub/Sub 성능 테스트 결과
Milvus 통합 테스트
데이터 크기: 100M
결과: 1억 개 벡터 데이터셋을 사용한 광범위한 테스트에서 NATS는 더 낮은 벡터 검색 및 쿼리 지연 시간을 보여주었습니다.
| 지표 | RocksMQ (ms) | NATS (ms) |
|---|---|---|
| 평균 벡터 검색 지연 시간 | 23.55 | 20.17 |
| 초당 벡터 검색 요청 수(RPS) | 2.95 | 3.07 |
| 평균 쿼리 지연 시간 | 7.2 | 6.74 |
| 초당 쿼리 요청 수(RPS) | 1.47 | 1.54 |
표 2: 100m 데이터셋을 사용한 Milvus 통합 테스트 결과
데이터셋: <100M
결과: 100M보다 작은 데이터셋의 경우, NATS와 RocksMQ는 유사한 성능을 보입니다.
결론: NATS 메시징으로 Milvus 강화하기
Milvus 내 NATS의 통합은 데이터 처리에서 중요한 진전을 의미합니다. 실시간 분석, 머신 러닝 애플리케이션, 또는 데이터 집약적인 모든 프로젝트를 탐구하든, NATS는 효율성, 신뢰성, 속도로 여러분의 프로젝트를 강화합니다. 데이터 환경이 발전함에 따라, Milvus 내에 NATS와 같은 강력한 메시징 시스템을 갖추면 원활하고 신뢰할 수 있으며 고성능의 데이터 통신이 보장됩니다.
계속 읽기

How to Install and Run OpenClaw (Previously Clawdbot/Moltbot) on Mac
Turn your Mac into an AI gateway for WhatsApp, Telegram, Discord, iMessage, and more — in under 5 minutes.

Introducing Zilliz MCP Server: Natural Language Access to Your Vector Database
Developers can easily manage and query vector databases with natural language via Zilliz MCP Server in AI-native environments.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



