• Informazioni su Milvus
  • Inizia
  • Concetti
  • Guida per l'utente
  • Importazione dei dati
  • Strumenti di intelligenza artificiale
  • Guida all'amministrazione
  • Strumenti
  • Integrazioni
  • Tutorial
  • Domande frequenti
  • API Reference

Gestione degli snapshotCompatible with Milvus 3.0.x

In questa guida imparerai come creare e gestire le istantanee, tra cui

Creare uno snapshot

Prima di creare uno snapshot, si consiglia di interrompere la scrittura dei dati nella raccolta di destinazione e di chiamare flush() per evitare possibili perdite di dati.

L'esecuzione di ` flush() ` non è obbligatoria, ma è altamente raccomandata per evitare la perdita di dati. Se si salta questo passaggio, lo snapshot conterrà solo i dati che sono già stati salvati.

Quando si assegna un nome a uno snapshot, utilizzare nomi chiari e descrittivi, come "daily_backup_20240101" o "v2.1_production_release", ed evitare termini generici, come "backup1" e "test". Utilizzare i nomi degli snapshot con attenzione per distinguerli tra versioni, ambienti e fasi.

Gli esempi di codice riportati di seguito presuppongono che si disponga già di una raccolta denominata 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 gli snapshot

È possibile elencare i nomi degli snapshot 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

Descrizione di uno snapshot

È possibile ottenere informazioni dettagliate su uno snapshot specifico.

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

Bloccare/sbloccare i dati di uno snapshot

Durante il ripristino, è possibile fissare uno snapshot per proteggere temporaneamente i dati sottostanti dalla garbage collection e sbloccarlo per liberare i dati.

È inoltre possibile impostare una durata (time-to-live, TTL) per l'operazione di blocco, in modo che i dati bloccati vengano rilasciati allo scadere di tale durata.

pin_id = client.pin_snapshot_data(
    snapshot_name="backup_20240101",
    collection_name="my_collection",
    ttl_seconds=3600,
)

client.unpin_snapshot_data(
    pin_id=pin_id
)
// java
pinID, err := client.PinSnapshotData(
    context.Background(),
    milvusclient.NewPinSnapshotDataOption("backup_20240101", "my_collection").WithTTL(3600),
)
if err != nil {
    log.Fatal(err)
}

defer func() {
    _ = client.UnpinSnapshotData(
        context.Background(),
        milvusclient.NewUnpinSnapshotDataOption(pinID),
    )
}()

// Do work with pinned snapshot data.
// node.js
# restful

Ripristino di uno snapshot

È possibile ripristinare uno snapshot in una nuova raccolta. Questa operazione è asincrona e restituisce un ID del processo per monitorare lo stato di avanzamento del ripristino.

Il ripristino utilizza un meccanismo di copia dei segmenti anziché l’importazione dei dati, il che risulta più efficiente poiché

  • copia direttamente i file di segmento (binlog, deltalog, file di indice) dall’archivio degli 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 tempi di ripristino notevolmente più rapidi, e
  • garantisce un aumento delle prestazioni da 10 a 100 volte rispetto ai metodi tradizionali di backup e ripristino

Per ripristinare uno snapshot, 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 ulteriori dettagli sul monitoraggio dello stato di avanzamento di un'operazione di ripristino, consultare la sezione Ottenere lo stato del ripristino.

Eliminazione di uno snapshot

È possibile eliminare uno snapshot se non è più necessario. Si consiglia di rimuovere regolarmente gli snapshot obsoleti 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 processi di ripristino

È possibile utilizzare questa API per ottenere un elenco degli snapshot già creati 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 del ripristino

Una volta ottenuto l'ID di un'operazione di ripristino, è possibile utilizzarlo per recuperare lo stato di avanzamento del ripristino.

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