Автоматические снимки позволяют Stronghold по расписанию создавать резервные копии встроенного Raft-хранилища и сохранять их на локальный диск или в S3-совместимое объектное хранилище.

Автоматические снимки доступны только при использовании интегрированного Raft-хранилища. Для etcd, PostgreSQL и других внешних бэкендов нужно настраивать резервное копирование средствами самого хранилища.

Автоматические снимки подходят для регулярного резервного копирования без ручного запуска команд. Они особенно полезны для production-кластеров, где важно иметь повторяемую политику хранения и выносить резервные копии за пределы самого кластера.

Особенности использования автоматических снимков:

  • можно создать несколько именованных конфигураций снимков;
  • каждая конфигурация определяет интервал запуска, политику хранения и тип хранилища;
  • поддерживаются типы хранилища local и aws-s3;
  • для production-сред используйте внешнее объектное хранилище, а не локальное: активный узел кластера может меняться, а резервные копии нужно хранить отдельно от защищаемой системы.

Имена снимков формируются в формате <file_prefix>-<N>.snap, где <N> — время создания в наносекундах Unix. Очистка по правилу retain учитывает только файлы или объекты с таким форматом имени в настроенной директории или префиксе. Две конфигурации одного типа хранилища не могут использовать одно и то же место назначения (path_prefix и file_prefix; для aws-s3 также тот же бакет и регион).

Каждая конфигурация выполняется отдельной задачей. После создания или изменения конфигурации её задача перезапускается: если сохранённого статуса ещё нет, первый снимок создаётся через одну десятую от interval (но не более чем через 10 минут); иначе — когда с начала последнего снимка пройдёт interval. Последующие снимки создаются через interval после завершения предыдущего. После неудачного снимка следующая попытка выполняется с экспоненциальной задержкой (начиная с 1 минуты, удваивая её, но не более interval). Изменение конфигурации сбрасывает consecutive_errors.

Создание или обновление конфигурации

Чтобы создать или обновить конфигурацию автоматических снимков, используйте эндпоинт:

МетодПуть
POST/sys/storage/raft/snapshot-auto/config/:name

Для работы с эндпоинтом требуются права sudo. Запрос заменяет конфигурацию целиком: частичного обновления нет, поэтому всегда передавайте все обязательные параметры, включая storage_type.

Основные параметры

ПараметрТипОбязательныйЗначение по умолчаниюОписание
nameСтрокаДа—Имя конфигурации, которую нужно создать или обновить
intervalЦелое число или строкаНет1hИнтервал между созданием резервных копий. Можно указывать в секундах или в формате Go duration, например 24h, 1h30m. Допускается значение в днях, например 1d; для комбинирования дней с меньшими единицами используйте эквивалентные часы (например, 25h30m вместо 1d1h30m). Минимальное значение — 1s
retainЦелое числоНет1Сколько резервных копий хранить. Очистка запускается до и после создания каждого снимка. При превышении лимита самые старые копии удаляются. Значение 0 отключает удаление старых снимков. Отрицательные значения недопустимы
storage_typeСтрокаДа—Тип хранилища: local или aws-s3
path_prefixСтрокаДа для local—Для local это директория хранения снимков (значение / недопустимо). Для aws-s3 это префикс объекта в бакете; начальный / игнорируется
file_prefixСтрокаНетvault-snapshotПрефикс имени файла или объекта. Не должен содержать /

Дополнительные параметры для local

ПараметрТипОбязательныйЗначение по умолчаниюОписание
local_max_spaceЦелое числоДа—Максимальный объём в байтах, который можно занять резервными копиями с указанным file_prefix в директории path_prefix. Значение 0 отключает проверку

Дополнительные параметры для aws-s3

ПараметрТипОбязательныйЗначение по умолчаниюОписание
aws_s3_bucketСтрокаДа—Имя бакета для хранения резервных копий
aws_s3_regionСтрокаДа—Регион бакета
aws_access_key_idСтрокаНет—Идентификатор ключа доступа к бакету
aws_secret_access_keyСтрокаНет—Секретный ключ доступа к бакету
aws_session_tokenСтрокаНет—Токен сессии для временных учётных данных AWS
aws_s3_endpointСтрокаНет—Эндпоинт S3-сервиса
aws_s3_disable_tlsБулевыйНетfalseОтключает TLS для S3-эндпоинта. Используйте только для тестирования
aws_s3_ca_certificateСтрокаНет—CA-сертификат для S3-эндпоинта в PEM-формате
aws_s3_server_side_encryptionБулевыйНетfalseШифрует объекты в бакете алгоритмом AES256 (SSE-S3). Нельзя использовать вместе с aws_s3_enable_kms
aws_s3_enable_kmsБулевыйНетfalseШифрует объекты в бакете с помощью AWS KMS. Нельзя использовать вместе с aws_s3_server_side_encryption
aws_s3_kms_keyСтрокаНет—Имя используемого ключа KMS. Требует aws_s3_enable_kms=true

Примеры конфигурации

Локальный диск

Следующий файл local-snapshot.json создаёт конфигурацию, которая сохраняет снимок каждые 5 минут в директорию /stronghold/data/backups, хранит 4 копии, ограничивает занимаемое снимками место 1 ГиБ и использует префикс main_stronghold:

{
  "interval": "5m",
  "path_prefix": "/stronghold/data/backups",
  "file_prefix": "main_stronghold",
  "retain": "4",
  "storage_type": "local",
  "local_max_space": 1073741824
}

Если директории из path_prefix не существует, Stronghold пытается создать её (с правами 0700) при создании снимка. Убедитесь, что у процесса Stronghold есть права на запись в родительскую директорию; при ошибке создания директории в last_snapshot_error будет сообщение failed to create ....

Примените конфигурацию из файла local-snapshot.json следующей командой:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold write sys/storage/raft/snapshot-auto/config/my-local-snapshots @local-snapshot.json
stronghold write sys/storage/raft/snapshot-auto/config/my-local-snapshots @local-snapshot.json

В примере путь /stronghold/data/ — это путь внутри контейнера, и по умолчанию он смонтирован по пути /var/lib/deckhouse/stronghold/ на master-узлах кластера DP. Созданные снимки можно найти и скачать с master-узлов по пути /var/lib/deckhouse/stronghold/backups/. При перезагрузке подов снимки останутся неизменными.

S3-совместимое хранилище

Следующий файл minio-snapshot.json сохраняет снимки в S3-совместимое хранилище:

{
  "interval": "3m",
  "path_prefix": "snapshots",
  "file_prefix": "stronghold_backup",
  "retain": "15",
  "storage_type": "aws-s3",
  "aws_s3_bucket": "my_bucket",
  "aws_s3_endpoint": "minio.domain.ru",
  "aws_s3_region": "us-east-1",
  "aws_access_key_id": "<ACCESS_KEY>",
  "aws_secret_access_key": "<SECRET_ACCESS_KEY>"
}

Перед применением конфигурации убедитесь, что бакет уже существует, а указанные учётные данные имеют права на чтение и запись.

Примените конфигурацию из файла minio-snapshot.json следующей командой:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold write sys/storage/raft/snapshot-auto/config/my-remote-snapshots @minio-snapshot.json
stronghold write sys/storage/raft/snapshot-auto/config/my-remote-snapshots @minio-snapshot.json

Обновление существующей конфигурации

Конфигурация заменяется целиком, поэтому для изменения части параметров передайте полный документ с новыми значениями (включая storage_type и обязательные параметры выбранного типа хранилища):

{
  "interval": "3m",
  "path_prefix": "/stronghold/data/backups",
  "file_prefix": "main_stronghold",
  "retain": "10",
  "storage_type": "local",
  "local_max_space": 1073741824
}

После любого успешного обновления задача этой конфигурации перезапускается, а расписание пересчитывается.

Примените обновлённую конфигурацию из файла local-snapshot-update.json следующей командой:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold write sys/storage/raft/snapshot-auto/config/my-local-snapshots @local-snapshot-update.json
stronghold write sys/storage/raft/snapshot-auto/config/my-local-snapshots @local-snapshot-update.json

Просмотр списка конфигураций

Чтобы получить список конфигураций автоматических снимков, используйте эндпоинт:

МетодПуть
LIST/sys/storage/raft/snapshot-auto/config

Пример команды:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold list sys/storage/raft/snapshot-auto/config
stronghold list sys/storage/raft/snapshot-auto/config

Получение параметров конфигурации

Чтобы получить параметры конфигурации автоматических снимков, используйте эндпоинт:

МетодПуть
GET/sys/storage/raft/snapshot-auto/config/:name

Пример команды:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold read sys/storage/raft/snapshot-auto/config/my-remote-snapshots
stronghold read sys/storage/raft/snapshot-auto/config/my-remote-snapshots

Для aws-s3 ответ содержит aws_access_key_id и aws_secret_access_key в открытом виде, поэтому ограничьте доступ к этому эндпоинту.

Удаление конфигурации

Чтобы удалить конфигурацию автоматических снимков, используйте эндпоинт:

МетодПуть
DELETE/sys/storage/raft/snapshot-auto/config/:name

Пример команды:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold delete sys/storage/raft/snapshot-auto/config/my-remote-snapshots
stronghold delete sys/storage/raft/snapshot-auto/config/my-remote-snapshots

Удаление конфигурации автоматического резервного копирования не удаляет уже созданные файлы снимков из локального или объектного хранилища.

Получение статуса

Чтобы получить статус автоматических снимков, используйте эндпоинт:

МетодПуть
GET/sys/storage/raft/snapshot-auto/status/:name

Пример команды:

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold read sys/storage/raft/snapshot-auto/status/my-remote-snapshots
stronghold read sys/storage/raft/snapshot-auto/status/my-remote-snapshots

Ключевые поля статуса:

  • consecutive_errors — количество идущих подряд ошибок резервного копирования; обнуляется после успешно завершённой процедуры резервного копирования;
  • last_snapshot_end — время завершения создания последнего успешного снимка;
  • last_snapshot_error — текст последней ошибки при выполнении снимка;
  • last_snapshot_start — время начала создания последнего снимка;
  • last_snapshot_url — адрес последнего успешно созданного снимка;
  • next_snapshot_start — время следующего запуска запланированного снимка;
  • snapshot_start — время начала текущего создаваемого снимка;
  • snapshot_url — адрес текущего создаваемого снимка.