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

스냅샷 사용 사례Compatible with Milvus 3.0.x

이 가이드에서는 스냅샷의 일반적인 사용 사례에 대해 설명합니다.

데이터 백업 및 복원

스냅샷은 데이터의 빠른 특정 시점 이미지로, 빠른 롤백이나 테스트(며칠에서 몇 주)에 적합합니다. 동시에 백업은 장기적인 재해 복구(몇 주에서 몇 년)와 전체 스토리지 장애에 대한 더 나은 보호를 위해 별도로 저장된 독립적이고 완전한 사본입니다.

다음 표는 스냅샷과 백업을 비교한 것입니다.

백업

스냅샷

백업 생성

모든 데이터 파일 복사(시간이 많이 소요됨)

메타데이터만 생성(밀리초 단위)

복원

데이터를 가져오고 인덱스를 다시 빌드합니다.

기존 데이터 및 인덱스 파일만 복사

성능

느리고 리소스 집약적

빠르고 가벼움(몇 초에서 몇 분 내)

시스템에 미치는 영향

높은 I/O 및 CPU 사용량

최소한의 영향

스냅샷을 만드는 데는 일반적으로 밀리초가 걸리며, 복원하는 데는 데이터 볼륨에 따라 몇 초에서 몇 분이 걸립니다.

스냅샷 제한, 제한 사항 및 시스템에 미치는 영향에 대한 자세한 내용은 스냅샷을 참조하세요.

스냅샷 만들기

스냅샷을 만들기 전에 데이터 손실을 방지하기 위해 대상 컬렉션에 대한 데이터 쓰기를 중지하고 flush() 으로 문의하는 것이 좋습니다.

스냅샷 이름을 지정할 때는 "daily_backup_20240101" 또는 "v2.1_production_release" 과 같이 명확하고 설명이 포함된 이름을 사용하고 "backup1""test" 과 같은 일반적인 용어는 피하세요. 스냅샷 이름을 현명하게 사용하여 버전, 환경, 단계별로 스냅샷을 구분하세요.

아래 코드 예제에서는 my_collection 이라는 이름의 컬렉션이 이미 있다고 가정합니다.

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

# Recommended: Flush data before creating snapshot to ensure all data is included
client.flush(collection_name="my_collection")

# Create snapshot for entire collection
client.create_snapshot(
    collection_name="my_collection",
    snapshot_name="backup_20240101",
    description="Daily backup for January 1st, 2024"
)
// java
import (
    "context"
    "github.com/milvus-io/milvus/client/v2/milvusclient"
)

client, err := milvusclient.New(context.Background(), &milvusclient.ClientConfig{
    Address: "localhost:19530",
    Token: "root:Milvus",
})

// Recommended: Flush data before creating snapshot to ensure all data is included
err = client.Flush(context.Background(), milvusclient.NewFlushOption("my_collection"))
if err != nil {
    log.Fatal(err)
}

// Create snapshot
createOpt := milvusclient.NewCreateSnapshotOption("backup_20240101", "my_collection").
    WithDescription("Daily backup for January 1st, 2024")

err = client.CreateSnapshot(context.Background(), createOpt)
// node.js
# restful

스냅샷 복원

스냅샷을 새 컬렉션으로 복원할 수 있습니다. 이 작업은 비동기식이며 복원 진행 상황을 추적하기 위한 작업 ID를 반환합니다.

이 복원은 데이터 가져오기 대신 세그먼트 복사 메커니즘을 사용하므로 다음과 같이 더 효율적입니다.

  • 스냅샷 스토리지에서 세그먼트 파일(binlog, deltalog, 인덱스 파일)을 직접 복사합니다.

  • 기존 데이터 파일과의 호환성을 보장하기 위해 필드 ID와 인덱스 ID를 보존합니다.

  • 데이터 재작성 및 인덱스 재구축을 방지하여 복원 시간이 훨씬 빨라집니다.

  • 기존 백업 및 복원 방법에 비해 10~100배의 성능 향상을 보장합니다.

스냅샷을 복원하려면 다음과 같이 하세요:

# Restore snapshot to new collection
job_id = client.restore_snapshot(
    snapshot_name="backup_20240101",
    collection_name="restored_collection",
)
// java
restoreOpt := milvusclient.NewRestoreSnapshotOption(
    "backup_20240101",
    "restored_collection"
)

jobID, err := client.RestoreSnapshot(context.Background(), restoreOpt)
if err != nil {
    log.Fatal(err)
}
// node.js
# restful

스냅샷 삭제

스냅샷이 더 이상 필요하지 않은 경우 삭제할 수 있습니다. 저장 공간을 절약하려면 오래된 스냅샷을 정기적으로 삭제하는 것이 좋습니다.

client.drop_snapshot(
    snapshot_name="backup_20240101"
)
// java
dropOpt := milvusclient.NewDropSnapshotOption("backup_20240101")
err := client.DropSnapshot(context.Background(), dropOpt)
// node.js
# restful

Spark로 데이터 처리

스냅샷은 분석 워크로드를 위한 안정적이고 일관된 데이터 소스를 제공함으로써 효율적인 오프라인 데이터 처리를 가능하게 합니다. Spark 또는 다른 빅데이터 처리 프레임워크를 사용해 객체 스토리지에 저장된 스냅샷 데이터에 직접 액세스할 수 있으며, 라이브 Milvus 클러스터에 영향을 주지 않습니다.

다음 코드는 "analytics_snapshot_20260321" 이라는 이름의 스냅샷을 생성하여 객체 스토리지 버킷에 저장하고 객체 스토리지 액세스 자격 증명을 획득했다고 가정합니다.

1단계: 스냅샷 메타데이터 가져오기

Spark를 사용하여 스냅샷 데이터에 액세스하기 전에 스냅샷 메타데이터를 가져와서 오브젝트 스토리지에서 데이터 파일을 찾습니다.

# Get snapshot metadata
snapshot_info = client.describe_snapshot(
    snapshot_name=s"analytics_snapshot_20260321",
    include_collection_info=True
)

# Locate data files in S3
s3_path = f"s3a://{snapshot_info.s3_location}/binlogs/"

2단계: Spark 세션 시작하기

객체 스토리지에 있는 데이터 파일을 사용하여 Spark 세션을 시작하고 데이터를 데이터 프레임으로 읽습니다.

spark = SparkSession.builder \
    .appName("VectorAnalytics") \
    .config("spark.hadoop.fs.s3a.access.key", "YOUR_ACCESS_KEY") \
    .config("spark.hadoop.fs.s3a.secret.key", "YOUR_SECRET_KEY") \
    .getOrCreate()