Gestionar instantáneasCompatible with Milvus 3.0.x
En esta guía aprenderás a crear y gestionar instantáneas.
Crear instantáneas
Antes de crear una instantánea, se recomienda dejar de escribir datos en la colección de destino y llamar a flush() para evitar posibles pérdidas de datos.
La llamada a flush() no es obligatoria, pero sí muy recomendable para evitar la pérdida de datos. Si omite este paso, la instantánea sólo contendrá los datos que ya se han vaciado.
Al nombrar una instantánea, utilice nombres claros y descriptivos, como "daily_backup_20240101" o "v2.1_production_release" y evite términos genéricos, como "backup1" y "test". Utilice los nombres de las instantáneas con prudencia para distinguirlas entre versiones, entornos y etapas.
En los siguientes ejemplos de código se asume que ya se dispone de una colección denominada 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
Lista de instantáneas
Puedes listar los nombres de las instantáneas existentes.
# 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
Describir instantánea
Puede obtener información detallada sobre una instantánea específica.
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
Restaurar instantánea
Puede restaurar una instantánea en una nueva colección. Esta operación es asíncrona y devuelve un ID de trabajo para seguir el progreso de la restauración.
La restauración utiliza un mecanismo de copia de segmentos en lugar de la importación de datos, que es más eficiente porque
copia directamente los archivos de segmento (binlogs, deltalogs, archivos de índice) del almacenamiento de instantáneas
conserva los identificadores de campo y de índice para garantizar la compatibilidad con los archivos de datos existentes
evita la reescritura de datos y la reconstrucción de índices, lo que se traduce en tiempos de restauración significativamente más rápidos, y
garantiza un aumento del rendimiento de 10 a 100 veces en comparación con los métodos tradicionales de copia de seguridad y restauración.
Para restaurar una instantánea, haga lo siguiente:
# 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
Para obtener más información sobre cómo supervisar el progreso de un trabajo de restauración, consulte Supervisar el progreso de la restauración.
Eliminar instantánea
Puede eliminar una instantánea si ya no la necesita. Se recomienda eliminar las instantáneas antiguas con regularidad para ahorrar espacio de almacenamiento.
client.drop_snapshot(
snapshot_name="backup_20240101"
)
// java
dropOpt := milvusclient.NewDropSnapshotOption("backup_20240101")
err := client.DropSnapshot(context.Background(), dropOpt)
// node.js
# restful
Lista de tareas de restauración
Puede utilizar esta API para obtener una lista de instantáneas ya creadas para la colección de destino.
# 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
Obtener estado de restauración
Una vez que tenga un ID de trabajo de restauración, puede utilizarlo para recuperar el progreso de la restauración.
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