メインコンテンツまでスキップ
バージョン: User Guides (Cloud)

スナップショットの管理
Private Preview

このガイドでは、スナップショットの作成および管理方法を学びます。主な内容は次のとおりです。

スナップショットを作成する

スナップショットを作成する前に、対象コレクションへの書き込みを停止し、データ損失の可能性を避けるために flush() を呼び出すことを推奨します。

📘注意

flush() の呼び出しは必須ではありませんが、データ損失を避けるため強く推奨されます。これを省略すると、スナップショットにはすでに flush 済みのデータのみが含まれます。

スナップショット名には、"daily_backup_20240101""v2.1_production_release" のような明確で説明的な名前を使用し、"backup1""test" のような汎用的な名前は避けてください。バージョン、環境、ステージを区別できるように命名することを推奨します。

以下のコード例は、my_collection という名前のコレクションがすでに存在することを前提としています。

from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

# 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"
)

スナップショットを一覧表示する

既存のスナップショット名を一覧表示できます。

# List all snapshots for a collection
snapshots = client.list_snapshots(
collection_name="my_collection"
)

スナップショットの詳細を確認する

特定のスナップショットの詳細情報を取得できます。

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}")

スナップショットデータをピン留め/解除する

復元中はスナップショットをピン留めして、基盤データが一時的にガベージコレクションされないように保護できます。不要になったらピンを解除してデータを解放します。

また、ピン留めに対して有効期限(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
)

スナップショットを復元する

スナップショットは新しいコレクションに復元できます。この操作は非同期で、復元進行状況を追跡するためのジョブ ID を返します。

復元ではデータインポートではなく copy-segment 方式を使用します。これにより次の利点があります。

  • セグメントファイル(binlog、deltalog、インデックスファイル)をスナップショットストレージから直接コピーする。

  • 既存データファイルとの互換性を保つため、フィールド ID とインデックス ID を維持する。

  • データの再書き込みやインデックス再構築を回避し、復元時間を大幅に短縮する。

  • 従来のバックアップ/復元方式と比べて、10〜100 倍の性能向上を実現する。

スナップショットを復元するには、次のように実行します。

# Restore snapshot to new collection
job_id = client.restore_snapshot(
snapshot_name="backup_20240101",
collection_name="restored_collection",
)

復元ジョブの進行状況監視の詳細は、復元進行状況の監視 を参照してください。

スナップショットを削除する

不要になったスナップショットは削除できます。ストレージ節約のため、古いスナップショットは定期的に削除することを推奨します。

client.drop_snapshot(
snapshot_name="backup_20240101"
)

復元ジョブを一覧表示する

この 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")

復元状態を取得する

復元ジョブ ID を取得した後、この 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")