• Informazioni su Milvus
  • Iniziare
  • Concetti
  • Guida per l'utente
  • Importazione dei dati
  • Strumenti AI
  • Guida all'amministrazione
  • Strumenti
  • Integrazioni
  • Tutorial
  • Domande frequenti
  • API Reference

Casi d'uso delle istantaneeCompatible with Milvus 3.0.x

In questa guida sono descritti i casi d'uso più comuni delle snapshot.

Backup e ripristino dei dati

Le istantanee sono immagini rapide e puntuali dei dati, adatte per rollback o test veloci (da giorni a settimane). Allo stesso tempo, i backup sono copie complete e indipendenti, conservate separatamente per il ripristino di emergenza a lungo termine (da settimane a anni) e per una migliore protezione contro i guasti totali dello storage.

La tabella seguente mette a confronto le istantanee e i backup.

Backup

Istantanea

Creazione del backup

Copia tutti i file di dati (richiede molto tempo).

Crea solo i metadati (in millisecondi)

Ripristino

Importa i dati e ricostruisce gli indici

Copia solo i file di dati e indici esistenti

Prestazioni

Lento e ad alta intensità di risorse

Veloce e leggero (in pochi secondi o minuti)

Impatto sul sistema

Elevato utilizzo di I/O e CPU

Impatto minimo

La creazione di un'istantanea richiede in genere millisecondi, mentre il suo ripristino richiede da secondi a minuti, a seconda del volume di dati.

Per ulteriori dettagli sui limiti e le restrizioni delle istantanee e sul loro impatto sul sistema, consultare la sezione Istantanee.

Creare le istantanee

Prima di creare un'istantanea, si consiglia di interrompere la scrittura dei dati nella raccolta di destinazione e di chiamare flush() per evitare una possibile perdita di dati.

Quando si assegna un nome a un'istantanea, utilizzare nomi chiari e descrittivi, come "daily_backup_20240101" o "v2.1_production_release" ed evitare termini generici, come "backup1" e "test". Usate saggiamente i nomi delle istantanee per distinguere le istantanee tra le varie versioni, ambienti e fasi.

Gli esempi di codice che seguono presuppongono che si abbia già un insieme chiamato 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

Ripristinare le istantanee

È possibile ripristinare un'istantanea in una nuova raccolta. Questa operazione è asincrona e restituisce un ID di lavoro per tracciare l'avanzamento del ripristino.

Il ripristino utilizza un meccanismo di copia dei segmenti al posto dell'importazione dei dati, che è più efficiente in quanto

  • copia direttamente i file di segmento (binlog, deltalog, file di indice) dalla memoria snapshot

  • conserva gli ID dei campi e gli ID degli indici per garantire la compatibilità con i file di dati esistenti

  • evita la riscrittura dei dati e la ricostruzione degli indici, con conseguenti tempi di ripristino significativamente più rapidi, e

  • garantisce un aumento delle prestazioni da 10 a 100 volte rispetto ai metodi di backup e ripristino tradizionali.

Per ripristinare un'istantanea, procedere come segue:

# 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

Eliminare le istantanee

È possibile eliminare un'istantanea se non è più necessaria. Si consiglia di rimuovere regolarmente le vecchie istantanee per risparmiare spazio di archiviazione.

client.drop_snapshot(
    snapshot_name="backup_20240101"
)
// java
dropOpt := milvusclient.NewDropSnapshotOption("backup_20240101")
err := client.DropSnapshot(context.Background(), dropOpt)
// node.js
# restful

Elaborazione dei dati con Spark

Le istantanee consentono un'efficiente elaborazione dei dati offline, fornendo fonti di dati stabili e coerenti per i carichi di lavoro analitici. È possibile accedere direttamente ai dati delle istantanee memorizzati nello storage a oggetti con Spark o con altri framework di elaborazione dei big data senza impattare il cluster Milvus in funzione.

Il codice seguente presuppone che sia stata creata un'istantanea denominata "analytics_snapshot_20260321", memorizzata in un bucket di object storage e ottenute le credenziali di accesso all'object storage.

Passo 1: Ottenere i metadati dell'istantanea

Prima di utilizzare Spark per accedere ai dati dell'istantanea, è necessario ottenere i metadati dell'istantanea per individuare i file di dati nell'object storage.

# 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/"

Passo 2: Avviare una sessione Spark

Con i file di dati nello storage a oggetti, avviare una sessione Spark e leggere i dati in un dataframe.

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()