スナップショットの活用例Compatible with Milvus 3.0.x
このガイドでは、スナップショットの一般的な利用例について解説します。
データのバックアップと復元
スナップショットは、データの特定の時点の状態を素早く取得したイメージであり、迅速なロールバックやテスト(数日から数週間)に適しています。一方、バックアップは独立した完全なコピーであり、長期的な災害復旧(数週間から数年)や、ストレージ全体の障害に対するより確実な保護を目的として、別途保存されます。
以下の表は、スナップショットとバックアップを比較したものです。
バックアップ |
スナップショット |
|
|---|---|---|
バックアップの作成 |
すべてのデータファイルをコピーする(時間がかかる) |
メタデータのみを作成(数ミリ秒) |
復元 |
データをインポートし、インデックスを再構築します |
既存のデータファイルとインデックスファイルのみをコピーします |
パフォーマンス |
処理が遅く、リソースを大量に消費する |
高速で軽量(数秒~数分) |
システムへの影響 |
I/OおよびCPU使用率が高い |
影響は最小限 |
スナップショットの作成には通常ミリ秒単位の時間がかかり、復元にはデータ量に応じて数秒から数分かかります。
スナップショットの制限、制約、およびシステムへの影響の詳細については、「スナップショット」を参照してください。
外部コレクションを使用したデータ処理
スナップショットは、分析や検証ワークロード向けに、特定の時点における安定したデータソースを提供できます。Milvusのスナップショットについては、スナップショットファイルを汎用的なSpark入力として直接読み込むのではなく、milvus-table という外部コレクション形式を使用してください。 Milvusスナップショットには、コレクションのメタデータ、セグメントマニフェスト、削除ログ、および主キーの統計情報が格納されているため、Milvusでは正しいスキーマと削除のセマンティクスを維持するために、スナップショットのメタデータJSONとmilvus-table リーダーが必要です。
このワークフローは、スナップショットデータに対してクエリ可能な外部コレクションを作成します。メインカラムのデータは引き続きスナップショットソースから参照され、リフレッシュ処理によってソースの StorageV3 マニフェストがターゲットの外部セグメントにマッピングされます。
ステップ 1: スナップショットのメタデータパスを取得する
通常の Milvus コレクションからスナップショットを作成するか選択し、そのスナップショットを記述してオブジェクトストレージ上の場所を取得します。
from pymilvus import DataType, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
snapshot_info = client.describe_snapshot(
snapshot_name="analytics_snapshot_20260321",
collection_name="my_collection",
include_collection_info=True
)
external_source = f"s3://bucket/{snapshot_info.s3_location}"
ステップ 2: `milvus-table ` 外部コレクションの作成とリフレッシュ
スナップショットソースコレクションとスキーマが一致する外部コレクションを作成します。「external_spec.format 」を「"milvus-table" 」に設定し、各ターゲットデータフィールドの「external_field 」を対応するソースフィールド名に設定します。
schema = client.create_schema(
external_source=external_source,
external_spec="""{
"format": "milvus-table",
"extfs": {
"cloud_provider": "aws",
"region": "us-west-2",
"access_key_id": "YOUR_ACCESS_KEY",
"access_key_value": "YOUR_SECRET_KEY"
}
}""",
)
schema.add_field(
field_name="id",
datatype=DataType.INT64,
is_primary=True,
external_field="id",
)
schema.add_field(
field_name="embedding",
datatype=DataType.FLOAT_VECTOR,
dim=768,
external_field="embedding",
)
client.create_collection(
collection_name="snapshot_external_collection",
schema=schema,
)
job_id = client.refresh_external_collection(
collection_name="snapshot_external_collection"
)
更新が完了したら、インデックスを作成し、外部コレクションにデータをロードして、スナップショットをバックエンドとするビューに対して検索やクエリ操作を実行できます。