• Milvusについて
  • スタート
  • コンセプト
  • ユーザーガイド
  • データインポート
  • AIツール
  • 管理ガイド
  • ツール
  • 統合
  • チュートリアル
  • よくあるご質問
  • API Reference

スナップショットの使用例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()