Примеры использования моментальных снимковCompatible with Milvus 3.0.x
В этом руководстве вы найдете общие случаи использования моментальных снимков.
Резервное копирование и восстановление данных
Снимки - это быстрые, точечные образы данных, подходящие для быстрого отката или тестирования (от нескольких дней до нескольких недель). В то же время резервные копии - это независимые, полные копии, хранящиеся отдельно для долгосрочного аварийного восстановления (от нескольких недель до нескольких лет) и для лучшей защиты от полного отказа хранилища.
В следующей таблице приведено сравнение моментальных снимков и резервных копий.
Резервное копирование |
Снимок |
|
|---|---|---|
Создание резервной копии |
Копирует все файлы данных (занимает много времени). |
Создает только метаданные (в миллисекундах) |
Восстановление |
Импортирует данные и перестраивает индексы |
Копирует только существующие файлы данных и индексов |
Производительность |
Медленный и ресурсоемкий |
Быстрая и легкая (от нескольких секунд до нескольких минут) |
Влияние на систему |
Высокое использование операций ввода-вывода и процессора |
Минимальное воздействие |
Создание моментального снимка обычно занимает миллисекунды, а его восстановление - от нескольких секунд до нескольких минут, в зависимости от объема данных.
Более подробную информацию о лимитах, ограничениях и влиянии моментальных снимков на систему см. в разделе "Моментальные снимки".
Создание моментальных снимков
Перед созданием моментального снимка рекомендуется прекратить запись данных в целевую коллекцию и вызвать 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
Восстановление моментальных снимков
Вы можете восстановить снимок в новую коллекцию. Эта операция является асинхронной и возвращает идентификатор задания для отслеживания хода восстановления.
При восстановлении используется механизм копирования сегментов вместо импорта данных, который более эффективен, поскольку
напрямую копирует файлы сегментов (бинлоги, дельталоги, индексные файлы) из хранилища моментальных снимков
сохраняет идентификаторы полей и индексов для обеспечения совместимости с существующими файлами данных
позволяет избежать перезаписи данных и восстановления индексов, что значительно ускоряет процесс восстановления, и
обеспечивает 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
Обработка данных с помощью Spark
Снимки позволяют эффективно обрабатывать данные в автономном режиме, предоставляя стабильные и согласованные источники данных для аналитических рабочих нагрузок. Вы можете напрямую обращаться к данным снимков, хранящимся в объектном хранилище, с помощью Spark или других фреймворков для обработки больших данных, не затрагивая живой кластер Milvus.
Следующий код предполагает, что вы создали моментальный снимок с именем "analytics_snapshot_20260321", сохранили его в ведре объектного хранилища и получили учетные данные доступа к объектному хранилищу.
Шаг 1: Получение метаданных моментального снимка
Прежде чем использовать Spark для доступа к данным моментального снимка, получите метаданные моментального снимка, чтобы найти файлы данных в объектном хранилище.
# 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/"
Шаг 2: инициируйте сеанс Spark
Получив файлы данных в объектном хранилище, инициируйте сеанс Spark и считайте данные в кадр.
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()