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

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

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

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

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

Имена снимков формируются в формате <file_prefix>_<RFC3339_timestamp>.tar.gz. Очистка по правилу retain учитывает только файлы или объекты с таким форматом имени в настроенной директории или префиксе.

Менеджер снимков проверяет конфигурации раз в минуту. После создания или обновления конфигурации следующий снимок планируется немедленно; последующие снимки планируются от времени начала предыдущего снимка плюс значение interval.

Настройка сервера (пул загрузок в S3)

Необязательные ключи верхнего уровня в HCL-конфигурации сервера Stronghold задают параметры фоновых загрузок снимков в S3. Речь идёт о файле конфигурации сервера, с которым запускается конкретный узел stronghold server -config config.hcl.

КлючТипПо умолчаниюОписание
snapshot_auto_s3_upload_workersЦелое число3Максимум одновременных фоновых загрузок снимков в S3. Параллельная загрузка используется только между разными конфигурациями снимков. При достижении лимита новые загрузки ожидают в очереди. Допустимый диапазон: 132.
snapshot_auto_upload_pool_shutdownСтрока (duration)60sКоличество времени с момента начала остановки цикла автоматических снимков в конкретном узле (по причине завершения процесса, либо потери лидерства узла), после которого происходит принудительное завершение фоновых процессов загрузки. Допустимый диапазон: 1s15m.

Пример:

snapshot_auto_s3_upload_workers = 4
snapshot_auto_upload_pool_shutdown = "90s"

Увеличивайте число фоновых процессов загрузки, если много конфигураций снимков для S3 и есть запас по сети/CPU; уменьшайте при ограничениях со стороны S3 или узком канале.

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

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

Для работы с эндпоинтом требуются права sudo.

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

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

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

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

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

ПараметрТипОбязательныйЗначение по умолчаниюОписание
aws_s3_bucketСтрокаДаИмя бакета для хранения резервных копий
aws_s3_regionСтрокаНетРегион бакета
aws_access_key_idСтрокаНетИдентификатор ключа доступа к бакету
aws_secret_access_keyСтрокаНетСекретный ключ доступа к бакету
aws_s3_endpointСтрокаНетЭндпоинт S3-сервиса
aws_s3_disable_tlsБулевыйНетfalseОтключает TLS для S3-эндпоинта. Используйте только для тестирования
aws_s3_ca_certificateСтрокаНетCA-сертификат для S3-эндпоинта в PEM-формате
retry_enabledБулевыйНетfalseВключает повторные попытки загрузки при неудачной отправке снимка в S3
retry_max_attemptsЦелое числоНет5Максимальное количество повторных попыток загрузки после первой неудачной загрузки. Расписание задержек между попытками: 1 минута, 5 минут, 15 минут, далее каждые 30 минут. Значение 0 отключает лимит количества попыток (бесконечные повторы)

Повторные попытки используют временную копию снимка, оставшуюся после неудачной загрузки. Повторные попытки прекращаются, если достигнут лимит retry_max_attempts, повторные попытки отключены, временный файл недоступен или наступило время следующего планового снимка. Кроме того, повторная попытка должна успеть завершиться минимум за одну минуту до следующего планового снимка; иначе попытка считается неудачной, а следующая планируется согласно расписанию задержек (interval). Ошибки повторных попыток обновляют last_snapshot_error в статусе, но не увеличивают consecutive_errors сверх ошибки исходного планового снимка.

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

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

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

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

Перед применением конфигурации убедитесь, что директория из path_prefix существует и доступна для записи. Ошибка failed to create snapshot directory at destination обычно означает, что директория отсутствует или недоступна.

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

  • Stronghold в DKP
  • 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-узлах кластера DKP. Созданные снимки можно найти и скачать с 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_access_key_id": "<ACCESS_KEY>",
  "aws_secret_access_key": "<SECRET_ACCESS_KEY>",
  "retry_enabled": true,
  "retry_max_attempts": 5
}

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

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

  • Stronghold в DKP
  • 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

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

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

{
  "interval": "3m",
  "retain": "10"
}

После любого успешного обновления следующий снимок планируется немедленно.

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

  • Stronghold в DKP
  • 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 в DKP
  • 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 в DKP
  • 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 в DKP
  • 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 в DKP
  • 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 — адрес последнего успешно созданного снимка;
  • last_rotation_error — текст последней ошибки очистки старых снимков, или n/a, если очистка прошла успешно; ошибка очистки не переводит успешный снимок в статус ошибки;
  • next_snapshot_start — время следующего запуска запланированного снимка;
  • snapshot_start — время начала текущего создаваемого снимка;
  • snapshot_url — адрес текущего создаваемого снимка;

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

  • retry_in_progress — флаг, указывающий что идёт процесс повторных попыток загрузки в S3;
  • retry_attempt — номер текущей попытки загрузки; 0, если повторные попытки не активны;