스냅샷 관리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
스냅샷 복원
스냅샷을 새 컬렉션으로 복원할 수 있습니다. 이 작업은 비동기식이며 복원 진행 상황을 추적하기 위한 작업 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