スナップショットの使用例Compatible with Milvus 3.0.x
このガイドでは、スナップショットの一般的な使用例を紹介します。
データのバックアップとリストア
スナップショットは、迅速なロールバックやテスト(数日から数週間)に適した、データの迅速なポイントインタイムイメージです。同時に、バックアップは独立した完全なコピーであり、長期的なディザスタリカバリ(数週間から数年)や、ストレージ全体の障害に対する保護を強化するために別々に保存されます。
次の表は、スナップショットとバックアップの比較です。
バックアップ |
スナップショット |
|
|---|---|---|
バックアップの作成 |
すべてのデータ・ファイルをコピー(時間がかかる) |
メタデータのみを作成(ミリ秒単位) |
復元 |
データのインポートとインデックスの再構築 |
既存のデータとインデックスファイルのみをコピー |
パフォーマンス |
低速でリソース集約的 |
高速かつ軽量(数秒から数分単位) |
システムへの影響 |
高いI/OとCPU使用率 |
影響は最小限 |
スナップショットの作成には通常ミリ秒かかり、リストアにはデータ量にもよりますが、数秒から数分かかります。
スナップショットの制限、制約、およびシステム影響の詳細については、スナップショットを参照してください。
スナップショットの作成
スナップショットを作成する前に、ターゲットコレクションへのデータの書き込みを停止し、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
スナップショットのリストア
スナップショットを新しいコレクションにリストアできます。この操作は非同期で、リストアの進捗を追跡するためのジョブIDを返します。
リストアは、データインポートの代わりにコピーセグメントのメカニズムを使用します。
スナップショットストレージからセグメントファイル(ビンログ、デルタログ、インデックスファイル)を直接コピーする。
既存のデータファイルとの互換性を確保するため、フィールド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
Sparkによるデータ処理
スナップショットは、分析ワークロードに安定した一貫性のあるデータソースを提供することで、効率的なオフラインデータ処理を可能にします。オブジェクトストレージに保存されたスナップショットデータには、Milvusクラスタに影響を与えることなく、Sparkやその他のビッグデータ処理フレームワークで直接アクセスできます。
以下のコードでは、"analytics_snapshot_20260321" というスナップショットを作成し、オブジェクトストレージのバケットに格納し、オブジェクトストレージのアクセス認証情報を取得したと仮定しています。
ステップ1:スナップショットメタデータの取得
Sparkを使用してスナップショットデータにアクセスする前に、スナップショットのメタデータを取得して、オブジェクトストレージ内のデータファイルを特定します。
# Get snapshot metadata
snapshot_info = client.describe_snapshot(
snapshot_name=s"analytics_snapshot_20260321",
include_collection_info=True
)
# Locate data files in S3
s3_path = f"s3a://{snapshot_info.s3_location}/binlogs/"
ステップ2:Sparkセッションの開始
オブジェクトストレージ内のデータファイルを使用して、Sparkセッションを開始し、データをデータフレームに読み込みます。
spark = SparkSession.builder \
.appName("VectorAnalytics") \
.config("spark.hadoop.fs.s3a.access.key", "YOUR_ACCESS_KEY") \
.config("spark.hadoop.fs.s3a.secret.key", "YOUR_SECRET_KEY") \
.getOrCreate()