• О Милвусе
  • Начать
  • Концепции
  • Руководство пользователя
  • Импорт данных
  • Инструменты искусственного интеллекта
  • Руководство по администрированию
  • Инструменты
  • Интеграции
  • Учебники
  • Вопросы и ответы
  • API Reference

Примеры использования моментальных снимков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()