メインコンテンツまでスキップ

スナップショットの管理

このガイドでは、スナップショットの作成と管理の方法について説明します。内容は次のとおりです。

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

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

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

スナップショットに名前を付ける際は、"daily_backup_20240101" や "v2.1_production_release" など、明確で説明的な名前を使用し、"backup1" や "test" などの一般的な用語は避けてください。バージョン、環境、ステージ間でスナップショットを区別できるよう、スナップショット名を適切に使用してください。

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

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

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

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

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

スナップショットを詳細表示する​

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

python
snapshot_info = client.describe_snapshot(
snapshot_name="backup_20240101",
collection_name="my_collection",
)

print(f"Snapshot name: {snapshot_info.name}")
print(f"Collection: {snapshot_info.collection_name}")
print(f"Created: {snapshot_info.create_ts}")
print(f"Description: {snapshot_info.description}")

Pin/unpin スナップショットデータ​

復元中にスナップショットをピン留めすると、その基盤データをガベージコレクションから一時的に保護できます。ピン留めを解除すると、データが解放されます。

また、ピン操作に有効期限(TTL)を設定すると、期限が切れたときにピン留めされたデータが解放されるようにできます。

python
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 倍のパフォーマンス向上を実現します。

スナップショットを復元するには、次の手順に従います。

python
# Restore snapshot to new collection
job_id = client.restore_snapshot(
snapshot_name="backup_20240101",
source_collection_name="my_collection",
target_collection_name="restored_collection",
)

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

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

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

python
client.drop_snapshot(
snapshot_name="backup_20240101",
collection_name="my_collection"
)

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

この API を使用すると、対象コレクションに対してすでに作成されたスナップショットの一覧を取得できます。

python
# 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_name}")
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 を取得したら、それを使用して復元の進行状況を取得できます。

python
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: {state.collection_name}")
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")