Cas d'utilisation des instantanésCompatible with Milvus 3.0.x
Dans ce guide, vous trouverez des cas d'utilisation courants pour les instantanés.
Sauvegarde et restauration des données
Les instantanés sont des images rapides et ponctuelles des données, adaptées à des retours en arrière rapides ou à des tests (quelques jours à quelques semaines). Parallèlement, les sauvegardes sont des copies indépendantes et complètes, stockées séparément pour la reprise après sinistre à long terme (de quelques semaines à quelques années) et pour une meilleure protection contre les pannes totales de stockage.
Le tableau suivant compare les instantanés et les sauvegardes.
Sauvegarde |
Instantané |
|
|---|---|---|
Création d'une sauvegarde |
Copie tous les fichiers de données (chronophage) |
Crée uniquement les métadonnées (en millisecondes) |
Restauration |
Importe les données et reconstruit les index |
Copie uniquement les fichiers de données et d'index existants |
Performances |
Lent et gourmand en ressources |
Rapide et léger (de quelques secondes à quelques minutes) |
Impact sur le système |
Utilisation élevée des E/S et de l'unité centrale |
Impact minimal |
La création d'un instantané prend généralement quelques millisecondes, et sa restauration prend de quelques secondes à quelques minutes, en fonction du volume de données.
Pour plus de détails sur les limites et les restrictions des instantanés, ainsi que sur leur impact sur le système, reportez-vous à la section Instantanés.
Créer des instantanés
Avant de créer un instantané, il est conseillé d'arrêter d'écrire des données dans la collection cible et d'appeler flush() pour éviter toute perte de données.
Lorsque vous nommez un instantané, utilisez des noms clairs et descriptifs, tels que "daily_backup_20240101" ou "v2.1_production_release", et évitez les termes génériques, tels que "backup1" et "test". Utilisez les noms d'instantanés à bon escient pour distinguer les instantanés entre les versions, les environnements et les étapes.
Les exemples de code ci-dessous supposent que vous disposez déjà d'une collection nommée 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
Restauration d'instantanés
Vous pouvez restaurer un instantané dans une nouvelle collection. Cette opération est asynchrone et renvoie un identifiant de travail permettant de suivre la progression de la restauration.
La restauration utilise un mécanisme de copie de segments au lieu d'une importation de données, ce qui est plus efficace car cela permet de
copie directement les fichiers de segments (binlogs, deltalogs, fichiers d'index) à partir du stockage d'instantanés
préserve les identifiants des champs et des index pour assurer la compatibilité avec les fichiers de données existants
évite la réécriture des données et la reconstruction des index, ce qui accélère considérablement les temps de restauration, et
garantit une augmentation des performances de 10 à 100 fois par rapport aux méthodes de sauvegarde et de restauration traditionnelles.
Pour restaurer un instantané, procédez comme suit :
# 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
Abandon d'instantanés
Vous pouvez supprimer un instantané s'il n'est plus nécessaire. Il est conseillé de supprimer régulièrement les anciens clichés afin d'économiser de l'espace de stockage.
client.drop_snapshot(
snapshot_name="backup_20240101"
)
// java
dropOpt := milvusclient.NewDropSnapshotOption("backup_20240101")
err := client.DropSnapshot(context.Background(), dropOpt)
// node.js
# restful
Traitement des données avec Spark
Les snapshots permettent un traitement efficace des données hors ligne en fournissant des sources de données stables et cohérentes pour les charges de travail analytiques. Vous pouvez accéder directement aux données des snapshots stockées dans le stockage objet avec Spark ou d'autres frameworks de traitement des big data sans avoir d'impact sur le cluster Milvus en direct.
Le code suivant suppose que vous avez créé un instantané nommé "analytics_snapshot_20260321", que vous l'avez stocké dans un seau de stockage d'objets et que vous avez obtenu les informations d'identification d'accès au stockage d'objets.
Etape 1 : Obtenir les métadonnées de l'instantané
Avant d'utiliser Spark pour accéder aux données de l'instantané, obtenez les métadonnées de l'instantané pour localiser les fichiers de données dans le stockage d'objets.
# 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/"
Etape 2 : Démarrer une session Spark
Avec les fichiers de données dans le stockage d'objets, lancez une session Spark et lisez les données dans un cadre de données.
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()