• Milvus 소개
  • 시작하기
  • 개념
  • 사용자 안내서
  • 데이터 가져오기
  • AI 도구
  • 관리 가이드
  • 도구
  • 연동 기능
  • 튜토리얼
  • 자주 묻는 질문
  • API Reference

스냅샷 관리Compatible with Milvus 3.0.x

이 가이드에서는 다음을 포함하여 스냅샷을 생성하고 관리하는 방법을 알아봅니다.

스냅샷 생성

스냅샷을 생성하기 전에, 데이터 손실을 방지하기 위해 대상 컬렉션에 대한 데이터 쓰기를 중지하고 ` flush() `를 호출하는 것이 좋습니다.

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

스냅샷 나열

기존 스냅샷의 이름을 나열할 수 있습니다.

# List all snapshots for a collection
snapshots = client.list_snapshots(
    collection_name="my_collection"
)
// java
// List snapshots for collection
listOpt := milvusclient.NewListSnapshotsOption().
    WithCollectionName("my_collection")

snapshots, err := client.ListSnapshots(context.Background(), listOpt)
// node.js
# bash

스냅샷 설명 조회

특정 스냅샷에 대한 상세 정보를 조회할 수 있습니다.

snapshot_info = client.describe_snapshot(
    snapshot_name="backup_20240101",
    include_collection_info=True
)

print(f"Snapshot ID: {snapshot_info.id}")
print(f"Collection: {snapshot_info.collection_name}")
print(f"Created: {snapshot_info.create_ts}")
print(f"Description: {snapshot_info.description}")
// java
describeOpt := milvusclient.NewDescribeSnapshotOption("backup_20240101")
resp, err := client.DescribeSnapshot(context.Background(), describeOpt)

fmt.Printf("Snapshot ID: %d\n", resp.GetSnapshotInfo().GetId())
fmt.Printf("Collection: %s\n", resp.GetSnapshotInfo().GetCollectionName())
// node.js
# restful

스냅샷 데이터 고정/고정 해제

복원 과정에서 스냅샷을 고정하여 기본 데이터를 가비지 컬렉션으로부터 일시적으로 보호할 수 있으며, 고정을 해제하여 데이터를 해제할 수 있습니다.

또한 고정 작업에 대한 유효 기간(TTL)을 설정하여, 해당 기간이 만료되면 고정된 데이터가 해제되도록 할 수 있습니다.

pin_id = client.pin_snapshot_data(
    snapshot_name="backup_20240101",
    collection_name="my_collection",
    ttl_seconds=3600,
)

client.unpin_snapshot_data(
    pin_id=pin_id
)
// java
pinID, err := client.PinSnapshotData(
    context.Background(),
    milvusclient.NewPinSnapshotDataOption("backup_20240101", "my_collection").WithTTL(3600),
)
if err != nil {
    log.Fatal(err)
}

defer func() {
    _ = client.UnpinSnapshotData(
        context.Background(),
        milvusclient.NewUnpinSnapshotDataOption(pinID),
    )
}()

// Do work with pinned snapshot data.
// 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

복원 작업 나열

이 API를 사용하여 대상 컬렉션에 대해 이미 생성된 스냅샷 목록을 가져올 수 있습니다.

# List all restore jobs
jobs = client.list_restore_snapshot_jobs()

for job in jobs:
    print(f"Job {job.job_id}: {job.snapshot_name} -> Collection {job.collection_id}")
    print(f"  State: {job.state}, Progress: {job.progress}%")

# List restore jobs for a specific collection
jobs = client.list_restore_snapshot_jobs(collection_name="my_collection")
// java
// List all restore jobs
listOpt := milvusclient.NewListRestoreSnapshotJobsOption()
jobs, err := client.ListRestoreSnapshotJobs(context.Background(), listOpt)
if err != nil {
    log.Fatal(err)
}

for _, job := range jobs {
    fmt.Printf("Job %d: %s -> Collection %d\n",
        job.GetJobId(), job.GetSnapshotName(), job.GetCollectionId())
    fmt.Printf("  State: %s, Progress: %d%%\n",
        job.GetState(), job.GetProgress())
}

// List restore jobs for a specific collection
listOpt = milvusclient.NewListRestoreSnapshotJobsOption().
    WithCollectionName("my_collection")
jobs, err = client.ListRestoreSnapshotJobs(context.Background(), listOpt)
// node.js
# restful

복원 상태 조회

복원 작업 ID를 확보한 후에는 이를 사용하여 복원 진행 상황을 조회할 수 있습니다.

state = client.get_restore_snapshot_state(job_id=12345)

print(f"Job ID: {state.job_id}")
print(f"Snapshot Name: {state.snapshot_name}")
print(f"Collection ID: {state.collection_id}")
print(f"State: {state.state}")
print(f"Progress: {state.progress}%")
if state.state == "RestoreSnapshotFailed":
    print(f"Failure Reason: {state.reason}")
print(f"Time Cost: {state.time_cost}ms")
// java
stateOpt := milvusclient.NewGetRestoreSnapshotStateOption(12345)
state, err := client.GetRestoreSnapshotState(context.Background(), stateOpt)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Job ID: %d\n", state.GetJobId())
fmt.Printf("Snapshot Name: %s\n", state.GetSnapshotName())
fmt.Printf("Collection ID: %d\n", state.GetCollectionId())
fmt.Printf("State: %s\n", state.GetState())
fmt.Printf("Progress: %d%%\n", state.GetProgress())
if state.GetState() == milvuspb.RestoreSnapshotState_RestoreSnapshotFailed {
    fmt.Printf("Failure Reason: %s\n", state.GetReason())
}
fmt.Printf("Time Cost: %dms\n", state.GetTimeCost())
// node.js
# restful

번역DeepL

관리형 Milvus를 무료로 사용해 보세요

Zilliz Cloud는 번거로움이 없으며, Milvus 기반으로 10배 더 빠릅니다.

시작하기
피드백

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