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

Gestire le istantaneeCompatible with Milvus 3.0.x

In questa guida viene illustrato come creare e gestire le istantanee.

Creare un'istantanea

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.

La chiamata a flush() non è obbligatoria, ma è altamente consigliata per evitare la perdita di dati. Se si salta questa operazione, l'istantanea contiene solo i dati che sono già stati scaricati.

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

Elencare le istantanee

È possibile elencare i nomi delle istantanee esistenti.

# List all snapshots for a collection
snapshots = client.list_snapshots(
    collection_name="my_collection"
)
// java
// List snapshots for collection
listOpt := milvusclient.NewListSnapshotsOption().
    WithCollectionName("my_collection")

snapshots, err := client.ListSnapshots(context.Background(), listOpt)
// node.js
# bash

Descrivere le istantanee

È possibile ottenere informazioni dettagliate su una specifica istantanea.

snapshot_info = client.describe_snapshot(
    snapshot_name="backup_20240101",
    include_collection_info=True
)

print(f"Snapshot ID: {snapshot_info.id}")
print(f"Collection: {snapshot_info.collection_name}")
print(f"Created: {snapshot_info.create_ts}")
print(f"Description: {snapshot_info.description}")
// java
describeOpt := milvusclient.NewDescribeSnapshotOption("backup_20240101")
resp, err := client.DescribeSnapshot(context.Background(), describeOpt)

fmt.Printf("Snapshot ID: %d\n", resp.GetSnapshotInfo().GetId())
fmt.Printf("Collection: %s\n", resp.GetSnapshotInfo().GetCollectionName())
// node.js
# restful

Ripristinare l'istantanea

È possibile ripristinare un'istantanea in una nuova raccolta. Questa operazione è asincrona e restituisce un ID 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

Per informazioni dettagliate sul monitoraggio dell'avanzamento di un lavoro di ripristino, consultare Monitoraggio dell'avanzamento del ripristino.

Eliminazione dell'istantanea

È 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

Elenco dei lavori di ripristino

È possibile utilizzare questa API per ottenere un elenco delle istantanee già create per la raccolta di destinazione.

# List all restore jobs
jobs = client.list_restore_snapshot_jobs()

for job in jobs:
    print(f"Job {job.job_id}: {job.snapshot_name} -> Collection {job.collection_id}")
    print(f"  State: {job.state}, Progress: {job.progress}%")

# List restore jobs for a specific collection
jobs = client.list_restore_snapshot_jobs(collection_name="my_collection")
// java
// List all restore jobs
listOpt := milvusclient.NewListRestoreSnapshotJobsOption()
jobs, err := client.ListRestoreSnapshotJobs(context.Background(), listOpt)
if err != nil {
    log.Fatal(err)
}

for _, job := range jobs {
    fmt.Printf("Job %d: %s -> Collection %d\n",
        job.GetJobId(), job.GetSnapshotName(), job.GetCollectionId())
    fmt.Printf("  State: %s, Progress: %d%%\n",
        job.GetState(), job.GetProgress())
}

// List restore jobs for a specific collection
listOpt = milvusclient.NewListRestoreSnapshotJobsOption().
    WithCollectionName("my_collection")
jobs, err = client.ListRestoreSnapshotJobs(context.Background(), listOpt)
// node.js
# restful

Ottenere lo stato di restauro

Una volta ottenuto l'ID di un lavoro di restauro, è possibile utilizzarlo per recuperare l'avanzamento del restauro.

state = client.get_restore_snapshot_state(job_id=12345)

print(f"Job ID: {state.job_id}")
print(f"Snapshot Name: {state.snapshot_name}")
print(f"Collection ID: {state.collection_id}")
print(f"State: {state.state}")
print(f"Progress: {state.progress}%")
if state.state == "RestoreSnapshotFailed":
    print(f"Failure Reason: {state.reason}")
print(f"Time Cost: {state.time_cost}ms")
// java
stateOpt := milvusclient.NewGetRestoreSnapshotStateOption(12345)
state, err := client.GetRestoreSnapshotState(context.Background(), stateOpt)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Job ID: %d\n", state.GetJobId())
fmt.Printf("Snapshot Name: %s\n", state.GetSnapshotName())
fmt.Printf("Collection ID: %d\n", state.GetCollectionId())
fmt.Printf("State: %s\n", state.GetState())
fmt.Printf("Progress: %d%%\n", state.GetProgress())
if state.GetState() == milvuspb.RestoreSnapshotState_RestoreSnapshotFailed {
    fmt.Printf("Failure Reason: %s\n", state.GetReason())
}
fmt.Printf("Time Cost: %dms\n", state.GetTimeCost())
// node.js
# restful