강제 병합 압축Compatible with Milvus 3.0.x
강제 병합은 작고 조각난 세그먼트를 더 적은 수의 더 큰 세그먼트로 통합하여 쿼리 성능과 저장소 효율성을 개선하기 위해 고안된 기능입니다. 이 가이드에서는 강제 병합 압축을 사용하는 방법을 설명합니다.
이 기능은 공개 미리 보기입니다. 프로덕션 환경에서는 사용하지 마세요.
개요
표준 압축은 다대일 병합을 통해 세그먼트 크기를 구성된 maxSize 근처로 유지하지만, 한도를 초과하지 않는 한 더 이상 병합할 수 없는 중간 크기의 조각이 남을 수 있습니다. 예를 들어 아래 그림과 같이 컬렉션에 2MB 세그먼트가 5개 있고 maxSize 이 3MB인 경우 두 세그먼트 중 하나를 병합하면 한도를 초과하므로 표준 압축으로 세그먼트 수를 더 줄일 수 없고 조각화된 레이아웃이 그대로 유지됩니다.
강제 병합은 target_size 매개변수를 추가하고 가능한 경우 엄격한 허용 오차 범위 내에서 원하는 크기로 세그먼트를 재구성할 수 있도록 지원합니다. 아래 그림과 같이 지정된 target_size 이 4MB인 경우 2MB의 작은 세그먼트 5개를 더 적은 수의 큰 세그먼트로 병합할 수 있습니다. 이렇게 하면 초과 세그먼트 수가 줄어들고, 기본 maxSize 설정보다 큰 대상을 지원하며, 대상이 매우 큰 경우 시스템에서 현재 하드웨어 및 QueryNode 토폴로지에 맞는 실제 출력 크기와 세그먼트 수를 선택할 수 있습니다.
어떤 압축 방법을 사용할지 알아보려면 FAQ를 참조하세요.
R8eow3kaqhktokblcmocnvxmnee
강제 병합 압축은 기존 Compaction API를 target_size 매개변수로 확장합니다. 이전 버전과 완전히 호환되므로 target_size 없는 기존 압축 호출은 이전처럼 계속 작동합니다.
강제 병합은 비동기적으로 작동합니다. 실행 중에 I/O 및 메모리 리소스를 사용하지만 검색 또는 쿼리 작업을 차단하지는 않습니다.
강제 병합 압축 사용
전제 조건
Milvus 버전 3.0 이상
PyMilvus 3.0 이상
전역 구성
다음 구성 매개변수는 강제 병합 동작을 제어합니다. Milvus 구성 파일 또는 환경 변수를 통해 설정합니다.
dataCoord:
segment:
maxSize: 512 # Default segment max size (MB).
# Used when target_size is 0 or omitted.
compaction:
maxFullSegmentThreshold: 100
# When segment count exceeds this threshold,
# a faster greedy algorithm is used instead
# of the standard merge algorithm.
forceMerge:
datanodeMemoryFactor: 4.0
# DataNode memory divided by this factor
# determines the the largest segment
# size the system can allow.
querynodeMemoryFactor: 4.0
# Minimum QueryNode memory divided by this
# factor. Used in automatic size calculation
# to ensure merged segments can be loaded.
파라미터 |
기본값 |
설명 |
|---|---|---|
|
512 |
기본 세그먼트 최대 크기(MB)입니다. |
|
100 |
알고리즘 선택을 위한 세그먼트 수 임계값입니다. 세그먼트 수가 이 값을 초과하면 Milvus는 병합 계획에 더 빠른 욕심 알고리즘을 사용합니다.
|
|
4.0 |
데이터노드 메모리를 이 계수로 나누어 시스템에서 허용할 수 있는 최대 세그먼트 크기를 계산합니다.
|
|
4.0 |
최소 쿼리 노드 메모리를 이 계수로 나눈 값입니다. 자동 크기 계산(
|
위의 변경 사항을 Milvus 클러스터에 적용하려면 헬름으로 Milvus 구성하기 및 Milvus 오퍼레이터로 Milvus 구성하기의 단계를 따르세요.
강제 병합 압축 트리거
target_size 파라미터와 함께 compact() 를 호출하여 강제 병합 압축을 트리거합니다. 매개변수에 대한 자세한 내용은 아래 매개변수 참조를 참조 하세요.
세 가지 강제 병합 압축 모드를 사용할 수 있습니다:
compact("my_collection", target_size=?)
│
├─ Mode 1: target_size = 0 (or omitted)
│ Uses config maxSize (default 512 MB)
│ Equivalent to standard compaction
│
├─ Mode 2: target_size = 2048
│ Merges segments to ~2 GB each
│ Must be >= config maxSize
│
└─ Mode 3: target_size = max_int64
Auto-calculates optimal size based on
segment distribution and node memory
다음은 각 강제 병합 압축 모드의 사용 방법을 보여주는 예시입니다.
기본값(표준 압축)
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# Standard compaction — uses config maxSize (default 512 MB)
job_id = client.compact("target_collection")
명시적 목표 크기
# Merge segments to approximately 2 GB each
job_id = client.compact(
"target_collection",
target_size="2048" # The unit is MB
)
자동 크기 계산
# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
"target_collection",
target_size=max_int64
)
매개변수 참조
다음 표에서는 매개변수에 대해 설명합니다.
매개변수 |
유형 |
설명 |
|---|---|---|
|
str |
필수입니다. 압축할 컬렉션의 이름입니다. |
|
int |
선택 사항입니다. 대상 세그먼트 크기(MB)입니다. 매개변수 값에는 3가지 옵션이 있습니다:
|
지정된 target_size 이 설정된 dataCoord.segment.maxSize 보다 작으면 오류와 함께 요청이 거부됩니다.
압축 진행률 확인
강제 병합 압축은 비동기적으로 실행됩니다. 반환된 작업 ID를 사용하여 진행 상황을 확인합니다:
# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")
모범 사례
프로덕션 환경에서는 강제 병합 압축을 사용하지 마세요.
대부분의 경우 자동 크기 계산 모드를 사용하세요.
target_size을max_int64으로 설정하면 Milvus가 세그먼트 분포와 노드 리소스를 분석하여 최적의 크기를 결정합니다. 특별한 크기 조정 요구 사항이 없는 한 이 방법을 권장합니다.성능 절충안을 고려하세요. 강제 병합 압축은 리소스 집약적인 작업입니다. 세그먼트 데이터를 읽고, 병합하고, 다시 씁니다. 쿼리 지연 시간에 미치는 영향을 최소화하려면 트래픽이 적은 시간대에 예약하세요.
이전과 이후의 세그먼트 수를 모니터링합니다.
get_compaction_state()및list_persistent_segments을 사용하여 압축이 예상대로 더 적은 수의 더 큰 세그먼트를 생성했는지 확인합니다.
FAQ
강제 병합은 표준 압축과 어떻게 다른가요?
이 두 가지 유형의 압축 작업은 서로 다른 용도로 사용됩니다.
표준 압축(targetSize=0 또는 생략)은 최선의 노력으로 점진적으로 정리하는 경로입니다.
강제 병합(targetSize>0)은 더 적은 수의, 더 큰, 목표에 가까운 세그먼트를 생성하기 위한 컬렉션 수준의 재포장 경로입니다.
주요 차이점은 병합 형태입니다. 표준 압축은 사실상 작업당 m → 1이지만, 강제 병합은 그룹화된 입력 전체에 걸쳐 m → n입니다. 그렇기 때문에 강제 병합은 표준 압축으로는 해결할 수 없는 세그먼트 레이아웃을 해결할 수 있습니다. 다음 표는 두 가지 유형의 작업을 비교한 것입니다.
차원 |
표준 압축(기본값) |
강제 병합 |
|---|---|---|
API 트리거 |
targetSize=0(또는 설정되지 않음), Major/L0 플래그 없음 |
targetSize>0 (MB) |
주요 목표 |
명백한 조각의 점진적 정리, 일상적인 유지 관리 |
검색 및 균형을 위한 컬렉션 전반의 통합 |
세그먼트 크기 소스 |
고정 dataCoord.segment.maxSize(서버 구성) |
사용자 targetSize, 이후 maxSafeSize에 의해 안전 클램핑됨 |
매개변수 유효성 |
사용자 크기 조정 없음 |
사용자 targetSize는 >= dataCoord.segment.maxSize여야 하며, 그렇지 않으면 거부됩니다. |
안전 상한 |
구성 상한만 |
maxSafeSize = 최소(쿼리 노드 mem, 데이터 노드 mem) / memory_factor(독립형 비풀링: 추가로 절반으로 감소) |
병합 모양 |
작업당 m → 1, 출력 <= configMaxSize |
m → n, targetSize에 가까운 출력 |
중간 세그먼트 동작 |
영구적으로 멈출 수 있음(예: 두 개의 60% 세그먼트는 법적으로 하나의 120% 세그먼트가 될 수 없음). |
재포장 + 분할 작동, "60%에서 멈춤" 패턴 없음 |
컬렉션 평탄화 기능 |
제한적; 반복 실행 시 여전히 중간 세그먼트가 많이 남을 수 있음 |
강력함; 세그먼트 수를 줄이고 충만도를 높이도록 설계됨 |
토폴로지 인식 |
없음 |
있음; 쿼리노드/레플리카/샤드 레이아웃 사용 |
읽기 경로 병렬 처리 튜닝 |
없음 |
유효한 경우 쿼리 노드 카운트 / (레플리카 × 샤드)를 사용하여 출력 카운트 조정 |
일반적인 사용 사례 |
쓰기/삭제 후 이탈률이 높은 일일 정리 |
벤치마크 준비, 검색 최적화, 로드 병렬 처리 정렬 |
예상 범위 |
전체 컬렉션 리패킹은 기대하지 않음 |
컬렉션 수준의 리패킹 결과를 위한 목적 |
선택 지침
위험이 낮은 점진적 정리를 위해서는 표준 압축을 선택하세요.
검색 및 로딩 동작에 맞춰 컬렉션을 더 적은 수의 더 큰 세그먼트로 재구성하려는 경우 강제 병합을 선택하세요.
강제 병합은 클러스터링 압축과 어떻게 다른가요?
클러스터링 압축(is_clustering=True)은 클러스터링 키를 기반으로 세그먼트 내의 데이터를 재구성하여 검색 가지치기를 개선합니다. 강제 병합(target_size=N)은 데이터 분포를 변경하지 않고 세그먼트 크기를 최적화합니다. 클러스터링 압축을 먼저 실행하여 데이터를 정리한 다음 강제 병합을 실행하여 결과 세그먼트를 통합하는 등 서로 다른 용도로 함께 사용할 수 있습니다.
쿼리 중인 컬렉션에서 강제 병합을 실행할 수 있나요?
예. 강제 병합은 비동기적으로 실행되며 쿼리를 차단하지 않습니다. 하지만 데이터 노드 및 디스크 I/O 리소스를 사용하므로 압축 중에 쿼리 대기 시간이 늘어날 수 있습니다. 최상의 결과를 얻으려면 트래픽이 적은 시간대에 강제 병합을 예약하세요.
target_size를 maxSize보다 작게 설정하면 어떻게 되나요?
요청이 오류와 함께 거부됩니다. 목표 크기는 구성된 dataCoord.segment.maxSize 보다 크거나 같아야 합니다.