• 밀버스 소개
  • 시작하기
  • 개념
  • 사용자 가이드
  • 데이터 가져오기
  • AI 도구
  • 관리 가이드
  • 도구
  • 통합
  • 튜토리얼
  • 자주 묻는 질문
  • API Reference

강제 병합 압축Compatible with Milvus 3.0.x

강제 병합은 작고 조각난 세그먼트를 더 적은 수의 더 큰 세그먼트로 통합하여 쿼리 성능과 저장소 효율성을 개선하기 위해 고안된 기능입니다. 이 가이드에서는 강제 병합 압축을 사용하는 방법을 설명합니다.

이 기능은 공개 미리 보기입니다. 프로덕션 환경에서는 사용하지 마세요.

개요

표준 압축은 다대일 병합을 통해 세그먼트 크기를 구성된 maxSize 근처로 유지하지만, 한도를 초과하지 않는 한 더 이상 병합할 수 없는 중간 크기의 조각이 남을 수 있습니다. 예를 들어 아래 그림과 같이 컬렉션에 2MB 세그먼트가 5개 있고 maxSize 이 3MB인 경우 두 세그먼트 중 하나를 병합하면 한도를 초과하므로 표준 압축으로 세그먼트 수를 더 줄일 수 없고 조각화된 레이아웃이 그대로 유지됩니다.

강제 병합은 target_size 매개변수를 추가하고 가능한 경우 엄격한 허용 오차 범위 내에서 원하는 크기로 세그먼트를 재구성할 수 있도록 지원합니다. 아래 그림과 같이 지정된 target_size 이 4MB인 경우 2MB의 작은 세그먼트 5개를 더 적은 수의 큰 세그먼트로 병합할 수 있습니다. 이렇게 하면 초과 세그먼트 수가 줄어들고, 기본 maxSize 설정보다 큰 대상을 지원하며, 대상이 매우 큰 경우 시스템에서 현재 하드웨어 및 QueryNode 토폴로지에 맞는 실제 출력 크기와 세그먼트 수를 선택할 수 있습니다.

어떤 압축 방법을 사용할지 알아보려면 FAQ를 참조하세요.

R8eow3kaqhktokblcmocnvxmnee 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.

파라미터

기본값

설명

dataCoord.segment.maxSize

512

기본 세그먼트 최대 크기(MB)입니다. target_size 이 0이거나 생략된 경우 대상으로 사용됩니다. 명시적 target_size 에 허용되는 최소값으로도 사용됩니다.

dataCoord.compaction.maxFullSegmentThreshold

100

알고리즘 선택을 위한 세그먼트 수 임계값입니다. 세그먼트 수가 이 값을 초과하면 Milvus는 병합 계획에 더 빠른 욕심 알고리즘을 사용합니다.

  • 표준 알고리즘 (세그먼트 수 <= dataCoord.compaction.maxFullSegmentThreshold): 보다 최적의 병합 결과를 생성하지만 계산 시간이 더 오래 걸립니다.

  • 욕심 알고리즘 (세그먼트 수 > dataCoord.compaction.maxFullSegmentThreshold): 세그먼트 그룹화가 약간 덜 최적화되는 대신 훨씬 빠르게 계획을 완료합니다.

dataCoord.compaction.forceMerge.datanodeMemoryFactor

4.0

데이터노드 메모리를 이 계수로 나누어 시스템에서 허용할 수 있는 최대 세그먼트 크기를 계산합니다.

  • 값이 클수록 병합에 더 적은 메모리를 할당하지만 다른 데이터 노드 작업을 위해 더 많은 메모리를 남겨두므로 노드 안정성이 향상됩니다.

  • 값이 작을수록 더 큰 병합이 가능하지만 메모리 부담이 증가합니다.

  • 예를 들어 기본 계수가 4.0이고 메모리가 16GB인 데이터 노드의 경우, 병합 예산은 4GB입니다. 즉, 단일 작업에서 병합되는 세그먼트의 총 크기가 4GB를 초과할 수 없습니다.

dataCoord.compaction.forceMerge.querynodeMemoryFactor

4.0

최소 쿼리 노드 메모리를 이 계수로 나눈 값입니다. 자동 크기 계산(target_size=max_int64) 중에 병합된 세그먼트가 쿼리 노드에 의해 로드될 수 있는지 확인하기 위해 사용됩니다.

  • 값이 클수록 쿼리 노드가 로드하기 쉬운 작은 세그먼트가 생성됩니다.

  • 값이 작을수록 더 큰 세그먼트를 허용하지만 메모리가 제한된 쿼리 노드에서 로드 실패가 발생할 수 있습니다.

  • 예를 들어, 기본 계수가 4.0이고 가장 작은 쿼리 노드의 메모리가 16GB인 경우 자동 계산된 목표 크기는 4GB를 초과하지 않습니다. 이렇게 하면 강제 병합으로 인해 쿼리 노드가 로드할 수 없을 정도로 큰 세그먼트가 생성되는 것을 방지할 수 있습니다.

위의 변경 사항을 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
)

매개변수 참조

다음 표에서는 매개변수에 대해 설명합니다.

매개변수

유형

설명

collection_name

str

필수입니다. 압축할 컬렉션의 이름입니다.

target_size

int

선택 사항입니다. 대상 세그먼트 크기(MB)입니다. 매개변수 값에는 3가지 옵션이 있습니다:

  • 0 또는 생략: 구성된 dataCoord.segment.maxSize (기본값: 512MB)를 사용합니다. 표준 압축과 동일합니다.

  • 명시적 값: 세그먼트를 대략 지정된 크기(MB)로 병합합니다(예: 2048). 구성된 dataCoord.segment.maxSize 보다 크거나 같아야 합니다.

  • max_int64 ((1 << 63) - 1): 현재 세그먼트 분포와 사용 가능한 노드 리소스를 기반으로 최적의 크기를 자동으로 계산합니다.

지정된 target_size 이 설정된 dataCoord.segment.maxSize 보다 작으면 오류와 함께 요청이 거부됩니다.

압축 진행률 확인

강제 병합 압축은 비동기적으로 실행됩니다. 반환된 작업 ID를 사용하여 진행 상황을 확인합니다:

# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")

모범 사례

  • 프로덕션 환경에서는 강제 병합 압축을 사용하지 마세요.

  • 대부분의 경우 자동 크기 계산 모드를 사용하세요. target_sizemax_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 보다 크거나 같아야 합니다.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?