Управление моментальными снимкамиCompatible with Milvus 3.0.x
В этом руководстве вы узнаете, как создавать и управлять моментальными снимками.
Создание моментального снимка
Перед созданием моментального снимка рекомендуется прекратить запись данных в целевую коллекцию и вызвать flush(), чтобы избежать возможной потери данных.
Вызов flush() не является обязательным, но настоятельно рекомендуется во избежание потери данных. Если это пропустить, моментальный снимок будет содержать только те данные, которые уже были выгружены.
При именовании моментального снимка используйте четкие, описательные имена, например "daily_backup_20240101" или "v2.1_production_release", и избегайте общих терминов, таких как "backup1" и "test". Используйте имена снимков с умом, чтобы различать снимки разных версий, окружений и этапов.
В приведенных ниже примерах кода предполагается, что у вас уже есть коллекция с именем 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
Список моментальных снимков
Вы можете перечислить имена существующих моментальных снимков.
# 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
Описать моментальный снимок
Вы можете получить подробную информацию о конкретном снимке.
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
Восстановление моментального снимка
Вы можете восстановить снимок в новую коллекцию. Эта операция является асинхронной и возвращает идентификатор задания для отслеживания хода восстановления.
При восстановлении используется механизм копирования сегментов вместо импорта данных, который более эффективен, поскольку
непосредственно копирует файлы сегментов (бинлоги, дельталоги, индексные файлы) из хранилища моментальных снимков
сохраняет идентификаторы полей и индексов для обеспечения совместимости с существующими файлами данных
позволяет избежать перезаписи данных и восстановления индексов, что значительно ускоряет процесс восстановления, и
обеспечивает 10- или 100-кратное увеличение производительности по сравнению с традиционными методами резервного копирования и восстановления.
Чтобы восстановить моментальный снимок, выполните следующие действия:
# 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
Подробные сведения о мониторинге хода выполнения задания восстановления см. в разделе Мониторинг хода восстановления.
Сброс моментального снимка
Вы можете удалить снимок, если он больше не нужен. Рекомендуется регулярно удалять старые снимки для экономии места.
client.drop_snapshot(
snapshot_name="backup_20240101"
)
// java
dropOpt := milvusclient.NewDropSnapshotOption("backup_20240101")
err := client.DropSnapshot(context.Background(), dropOpt)
// node.js
# restful
Список заданий на восстановление
Вы можете использовать этот API для получения списка снимков, уже созданных для целевой коллекции.
# 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
Получить состояние восстановления
Получив идентификатор задания восстановления, вы можете использовать его для получения информации о ходе восстановления.
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