딱따구리 사용Compatible with Milvus 2.6.x
이 가이드에서는 Milvus 2.6.x에서 Woodpecker를 미리 쓰기 로그(WAL)로 활성화하고 사용하는 방법을 설명합니다. Woodpecker는 개체 스토리지용으로 설계된 클라우드 네이티브 WAL로, 높은 처리량, 낮은 운영 오버헤드, 원활한 확장성을 제공합니다. 아키텍처 및 벤치마크에 대한 자세한 내용은 Woodpecker를 참조하세요.
개요
- Milvus 2.6부터 추가된 Woodpecker는 로깅 서비스로서 순서대로 쓰기 및 복구 기능을 제공하는 선택적 WAL입니다.
- 메시지 큐 선택 사항으로, Pulsar/Kafka와 유사하게 작동하며 구성을 통해 활성화할 수 있습니다.
- 로컬 파일 시스템(
local)과 객체 스토리지(minio/S3 호환)의 두 가지 스토리지 백엔드가 지원됩니다.
빠른 시작
딱따구리를 활성화하려면 MQ 유형을 딱따구리로 설정합니다:
mq:
type: woodpecker
참고: 실행 중인 클러스터에 대해 mq.type 로 전환하는 것은 업그레이드 작업입니다. 프로덕션을 전환하기 전에 업그레이드 절차를 주의 깊게 따르고 새 클러스터에서 유효성을 검사하세요.
구성
아래는 전체 Woodpecker 구성 블록입니다( milvus.yaml 수정 또는 user.yaml 에서 재정의):
# Related configuration of woodpecker, used to manage Milvus logs of recent mutation operations, output streaming log, and provide embedded log sequential read and write.
woodpecker:
meta:
type: etcd # The Type of the metadata provider. currently only support etcd.
prefix: woodpecker # The Prefix of the metadata provider. default is woodpecker.
client:
segmentAppend:
queueSize: 10000 # The size of the queue for pending messages to be sent of each log.
maxRetries: 3 # Maximum number of retries for segment append operations.
segmentRollingPolicy:
maxSize: 256M # Maximum size of a segment.
maxInterval: 10m # Maximum interval between two segments, default is 10 minutes.
maxBlocks: 1000 # Maximum number of blocks in a segment
auditor:
maxInterval: 10s # Maximum interval between two auditing operations, default is 10 seconds.
logstore:
segmentSyncPolicy:
maxInterval: 200ms # Maximum interval between two sync operations, default is 200 milliseconds.
maxIntervalForLocalStorage: 10ms # Maximum interval between two sync operations local storage backend, default is 10 milliseconds.
maxBytes: 256M # Maximum size of write buffer in bytes.
maxEntries: 10000 # Maximum entries number of write buffer.
maxFlushRetries: 5 # Maximum size of write buffer in bytes.
retryInterval: 1000ms # Maximum interval between two retries. default is 1000 milliseconds.
maxFlushSize: 2M # Maximum size of a fragment in bytes to flush.
maxFlushThreads: 32 # Maximum number of threads to flush data
segmentCompactionPolicy:
maxSize: 2M # The maximum size of the merged files.
maxParallelUploads: 4 # The maximum number of parallel upload threads for compaction.
maxParallelReads: 8 # The maximum number of parallel read threads for compaction.
segmentReadPolicy:
maxBatchSize: 16M # Maximum size of a batch in bytes.
maxFetchThreads: 32 # Maximum number of threads to fetch data.
storage:
type: minio # The Type of the storage provider. Valid values: [minio, local]
rootPath: /var/lib/milvus/woodpecker # The root path of the storage provider.
주요 참고 사항:
woodpecker.meta- 유형: 현재
etcd만 지원됩니다. 경량 메타데이터를 저장하기 위해 Milvus와 동일한 etcd를 재사용하세요. - 접두사: 메타데이터의 키 접두사. 기본값:
woodpecker.
- 유형: 현재
woodpecker.client- 클라이언트 측에서 세그먼트 추가/롤링/감사 동작을 제어하여 처리량과 엔드투엔드 지연 시간의 균형을 맞춥니다.
woodpecker.logstore- 로그 세그먼트에 대한 동기화/ 플러시/ 압축/ 읽기 정책을 제어합니다. 처리량/레이턴시 조정을 위한 기본 노브입니다.
woodpecker.storage- 유형: MinIO/S3 호환 개체 스토리지(MinIO/S3/GCS/OSS 등)의 경우
minio, 로컬/공유 파일 시스템의 경우local. - rootPath: 스토리지 백엔드의 루트 경로(
local에 유효,minio의 경우 버킷/접두사로 경로가 지정됨).
- 유형: MinIO/S3 호환 개체 스토리지(MinIO/S3/GCS/OSS 등)의 경우
배포 모드
Milvus는 독립형과 클러스터 모드를 모두 지원합니다. 딱따구리 스토리지 백엔드 지원 매트릭스:
storage.type=local | storage.type=minio | |
|---|---|---|
| Milvus 독립형 | 지원됨 | 지원됨 |
| Milvus 클러스터 | 제한적(공유 FS 필요) | 지원됨 |
참고:
minio를 사용하면 딱따구리는 Milvus와 동일한 오브젝트 스토리지를 공유합니다(MinIO/S3/GCS/OSS 등).local를 사용하면 단일 노드 로컬 디스크는 독립형에만 적합합니다. 모든 파드가 공유 파일 시스템(예: NFS)에 액세스할 수 있는 경우 클러스터 모드에서도local을 사용할 수 있다.
배포 가이드
쿠버네티스에서 밀버스 클러스터에 딱따구리 활성화(밀버스 오퍼레이터, 스토리지=미니오)
밀버스 오퍼레이터를 설치한 후, 공식 샘플을 사용하여 Woodpecker를 활성화한 밀버스 클러스터를 시작하세요:
kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_woodpecker.yaml
이 샘플은 Woodpecker를 메시지 큐로 구성하고 스트리밍 노드를 활성화합니다. 처음 시작할 때 이미지를 가져오는 데 시간이 걸릴 수 있으므로 모든 파드가 준비될 때까지 기다리세요:
kubectl get pods
kubectl get milvus my-release -o yaml | grep -A2 status
준비가 되면 다음과 유사한 파드가 표시됩니다:
NAME READY STATUS RESTARTS AGE
my-release-etcd-0 1/1 Running 0 17m
my-release-etcd-1 1/1 Running 0 17m
my-release-etcd-2 1/1 Running 0 17m
my-release-milvus-datanode-7f8f88499d-kc66r 1/1 Running 0 16m
my-release-milvus-mixcoord-7cd7998d-x59kg 1/1 Running 0 16m
my-release-milvus-proxy-5b56cf8446-pbnjm 1/1 Running 0 16m
my-release-milvus-querynode-0-558d9cdd57-sgbfx 1/1 Running 0 16m
my-release-milvus-streamingnode-58fbfdfdd8-vtxfd 1/1 Running 0 16m
my-release-minio-0 1/1 Running 0 17m
my-release-minio-1 1/1 Running 0 17m
my-release-minio-2 1/1 Running 0 17m
my-release-minio-3 1/1 Running 0 17m
다음 명령을 실행하여 Milvus 클러스터를 제거합니다.
kubectl delete milvus my-release
Woodpecker 매개변수를 조정해야 하는 경우 메시지 저장소 구성에 설명된 설정을 따르세요.
쿠버네티스(헬름 차트, 저장소=미니오)에서 Milvus 클러스터에 Woodpecker 활성화하기
먼저 헬름으로 쿠버네티스에서 밀버스 실행에 설명된 대로 밀버스 헬름 차트를 추가하고 업데이트합니다.
그런 다음 다음 예제 중 하나를 사용하여 배포합니다:
- 클러스터 배포(우드페커 및 스트리밍 노드를 활성화한 권장 설정):
helm install my-release zilliztech/milvus \
--set image.all.tag=v2.6.0 \
--set pulsarv3.enabled=false \
--set woodpecker.enabled=true \
--set streaming.enabled=true \
--set indexNode.enabled=false
- 독립 실행형 배포(우드페커 활성화):
helm install my-release zilliztech/milvus \
--set image.all.tag=v2.6.0 \
--set cluster.enabled=false \
--set pulsarv3.enabled=false \
--set standalone.messageQueue=woodpecker \
--set woodpecker.enabled=true \
--set streaming.enabled=true
배포 후 문서에 따라 포트 포워딩하고 연결합니다. Woodpecker 매개변수를 조정하려면 메시지 저장소 구성에 설명된 설정을 따르세요.
Docker에서 Milvus 독립 실행형(저장소=로컬)에 Woodpecker 사용 설정
Docker에서 Milvus 실행을 따릅니다. 예시:
mkdir milvus-wp && cd milvus-wp
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
# Create user.yaml to enable Woodpecker with local filesystem
cat > user.yaml <<'EOF'
mq:
type: woodpecker
woodpecker:
storage:
type: local
rootPath: /var/lib/milvus/woodpecker
EOF
bash standalone_embed.sh start
Woodpecker 설정을 추가로 변경하려면 user.yaml 을 업데이트하고 bash standalone_embed.sh restart 을 실행합니다.
도커 컴포즈(저장소=minio)를 사용하여 Milvus Standalone용 Woodpecker 활성화(저장소=minio)
Docker Compose로 Milvus 실행을 따릅니다. 예시:
mkdir milvus-wp-compose && cd milvus-wp-compose
wget https://github.com/milvus-io/milvus/releases/download/v2.6.0/milvus-standalone-docker-compose.yml -O docker-compose.yml
# By default, the Docker Compose standalone uses Woodpecker
sudo docker compose up -d
# If you need to change Woodpecker parameters further, write an override:
docker exec -it milvus-standalone bash -lc 'cat > /milvus/configs/user.yaml <<EOF
mq:
type: woodpecker
woodpecker:
logstore:
segmentSyncPolicy:
maxFlushThreads: 16
storage:
type: minio
EOF'
# Restart the container to apply the changes
docker restart milvus-standalone
처리량 튜닝 팁
우드펙커의 벤치마크 및 백엔드 제한에 따라 다음 측면에서 엔드투엔드 쓰기 처리량을 최적화하세요:
- 스토리지 측면
- 오브젝트 스토리지(미니오/S3 호환): 동시성 및 오브젝트 크기를 늘립니다(작은 오브젝트는 피하세요). 네트워크 및 버킷 대역폭 제한을 주의하세요. SSD의 단일 MinIO 노드는 로컬에서 약 100MB/s로 제한되는 경우가 많으며, 단일 EC2~S3는 GB/s에 도달할 수 있습니다.
- 로컬/공유 파일 시스템(로컬): NVMe/고속 디스크를 선호합니다. FS가 작은 쓰기와 fsync 대기 시간을 잘 처리하는지 확인하세요.
- 딱따구리 노브
- 더 큰 플래시와 더 높은 병렬 처리를 위해
logstore.segmentSyncPolicy.maxFlushSize및maxFlushThreads을 늘립니다. - 미디어 특성에 따라
maxInterval을 조정합니다(지연 시간을 더 긴 집계와 처리량과 교환). - 오브젝트 스토리지의 경우
segmentRollingPolicy.maxSize을 늘려 세그먼트 스위치를 줄이는 것을 고려하세요.
- 더 큰 플래시와 더 높은 병렬 처리를 위해
- 클라이언트/애플리케이션 측
- 더 큰 배치 크기와 더 많은 동시 작성자/클라이언트를 사용하세요.
- 새로 고침/색인 빌드 타이밍을 제어하여(트리거하기 전에 일괄 처리) 빈번한 소규모 쓰기를 방지하세요.
배치 삽입 데모
from pymilvus import MilvusClient
import random
# 1. Set up a Milvus client
client = MilvusClient(
uri="http://<Proxy Pod IP>:27017",
)
# 2. Create a collection
res = client.create_collection(
collection_name="test_milvus_wp",
dimension=512,
metric_type="IP",
shards_num=2,
)
print(res)
# 3. Insert randomly generated vectors
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = []
batch_size = 1000
batch_count = 2000
for j in range(batch_count):
start_time = time.time()
print(f"Inserting {j}th vectors {j * batch_size} startTime{start_time}")
for i in range(batch_size):
current_color = random.choice(colors)
data.append({
"id": (j*batch_size + i),
"vector": [ random.uniform(-1, 1) for _ in range(512) ],
"color": current_color,
"color_tag": f"{current_color}_{str(random.randint(1000, 9999))}"
})
res = client.insert(
collection_name="test_milvus_wp",
data=data
)
data = []
print(f"Inserted {j}th vectors endTime:{time.time()} costTime:{time.time() - start_time}")
지연 시간
딱따구리는 처리량, 비용, 지연 시간 간의 균형을 고려해 오브젝트 스토리지용으로 설계된 클라우드 네이티브 WAL입니다. 현재 지원되는 경량 임베디드 모드는 대부분의 시나리오에서 개별 쓰기 요청에 대해 짧은 지연 시간을 요구하기보다는 특정 시간 내에 데이터를 쓰기만 하면 되기 때문에 비용과 처리량 최적화에 우선순위를 둡니다. 따라서 우드페커는 로컬 파일 시스템 스토리지 백엔드의 경우 기본 간격이 10ms, MinIO와 유사한 스토리지 백엔드의 경우 기본 간격이 200ms인 일괄 쓰기를 사용합니다. 느린 쓰기 작업 중 최대 지연 시간은 간격 시간에 플러시 시간을 더한 값과 같습니다.
배치 삽입은 시간 간격뿐만 아니라 기본값이 2MB인 배치 크기에 의해서도 트리거된다는 점에 유의하세요.
아키텍처, 배포 모드(메모리버퍼/쿼럼버퍼) 및 성능에 대한 자세한 내용은 딱따구리 아키텍처를 참조하세요.
매개변수에 대한 자세한 내용은 Woodpecker GitHub 리포지토리를 참조하세요.