Резервное копирование данных
Deckhouse Observability Platform предоставляет возможность выполнить резервное копирование данных путём копирования содержимого S3-бакетов. Помимо метрик и логов, которые сохраняются в S3 во время нормальной работы платформы, модуль также автоматически создаёт резервную копию базы данных PostgreSQL и сохраняет её дамп в S3.
Таким образом, для полного резервного копирования данных необходимо скопировать содержимое трёх S3-бакетов:
mimir
— для метрик,loki
— для логов,backup
— для дампов базы данных PostgreSQL.
Настройки резервного копирования базы данных PostgreSQL указываются в ModuleConfig
модуля observability-platform
. Подробнее см. в описании параметров модуля.
Резервное копирование метрик
Метрики хранятся в S3-бакете в формате TSDB-блоков. Для резервного копирования достаточно скопировать содержимое бакета, например, с использованием утилиты rclone
(описана ниже).
⚠️ Обратите внимание: резервное копирование не гарантирует сохранение всех метрик. Метрики за последние два часа могут находиться исключительно в памяти
ingester
и ещё не быть выгруженными в S3. Это необходимо учитывать при оценке допустимых потерь данных.
Особенности устройства блоков
- TSDB-блоки иммутабельны (неизменяемы) и имеют уникальные имена. Это позволяет безопасно использовать простые утилиты копирования, без остановки процессов записи.
- Блок считается завершённым только после появления в нём файла
meta.json
, который создаётся последним. - В резервной копии могут встречаться два типа блоков:
- Полные блоки (с
meta.json
) — готовы к восстановлению. - Неполные блоки (без
meta.json
, также называемые partial) — не участвуют в запросах, автоматически удаляются системой через некоторое время и могут присутствовать в бэкапе.
- Полные блоки (с
- Если блок содержит
meta.json
, но отсутствуют данные (chunks
,index
), такой блок считается повреждённым. Такие блоки появляются только при сбоях копирования и устраняются при повторном резервном копировании.
Способы резервного копирования S3-бакетов
Для резервного копирования S3-бакетов можно использовать следующие подходы:
- Утилиты
rclone
илиminio-client
для синхронизации содержимого S3-бакетов с другим хранилищем (локальным или S3-совместимым). - Монтирование S3-бакетов в файловую систему сервера с помощью утилит
s3fs
илиgeesefs
, после чего используются стандартные корпоративные средства резервного копирования.
Использование geesefs
-
Установите
geesefs
на сервер, где будет выполняться монтирование:curl -L https://github.com/yandex-cloud/geesefs/releases/download/v0.43.0/geesefs-linux-amd64 -o /usr/local/bin/geesefs chmod +x /usr/local/bin/geesefs
-
Создайте точки монтирования для соответствующих S3-бакетов:
mkdir -p /mnt/dop-backup/mimir /mnt/dop-backup/loki /mnt/dop-backup/backup
-
Получите файл с учетными данными для подключения к S3. На управляющем узле Kubernetes выполните:
kubectl -n d8-observability-platform get secrets backup-s3 loki-s3 mimir-s3 -o json | jq -r '.items[] | reduce . as $elt ({}; .[$elt.metadata.name|sub("-s3$"; "")] += [($elt.data | map_values(@base64d) | with_entries(.key |= ascii_downcase) | to_entries[] | "\(.key) = \(.value)")]) | to_entries[] | "[\(.key)]\n\(.value|join("\n"))"'
Сохраните вывод в файл
/etc/dop-s3-credentials
на сервере. -
Сгенерируйте строки для
/etc/fstab
. На управляющем узле Kubernetes выполните:kubectl -n d8-observability-platform get cm backup-s3 loki-s3 mimir-s3 -o json | jq --arg endpoint $(kubectl get mc observability-platform -o json | jq -r '"https://s3." + .spec.settings.general.baseDomain') -r '.items[] | (.metadata.name|sub("-s3$"; "")) as $name | "\(.data.BUCKET_NAME) /mnt/dop-backup/\($name) fuse.geesefs _netdev,allow_other,--file-mode=0644,--dir-mode=0755,--shared-config=/etc/dop-s3-credentials,--profile=\($name),--endpoint=\($endpoint) 0 0"'
Сохраните вывод в файл
/etc/fstab
. -
Смонтируйте бакеты:
mount -a
-
Убедитесь, что S3-бакеты успешно смонтированы:
ls -l /mnt/dop-backup/backup/postgres-backup
-
Выполняйте резервное копирование с помощью корпоративных инструментов с заданной периодичностью.
Использование rclone
-
Установите
rclone
:curl -L https://github.com/rclone/rclone/releases/download/v1.69.1/rclone-v1.69.1-linux-amd64.zip -o rclone.zip unzip -p rclone.zip rclone-*-linux-amd64/rclone | sudo tee /usr/local/bin/rclone > /dev/null sudo chmod +x /usr/local/bin/rclone rm rclone.zip
-
Сформируйте файл
rclone.conf
. На управляющем узле Kubernetes выполните:
kubectl -n d8-observability-platform get secrets backup-s3 loki-s3 mimir-s3 -o json | jq -r \
--arg endpoint $(kubectl get mc observability-platform -o json | jq -r '"https://s3." + .spec.settings.general.baseDomain') \
--argjson buckets $(kubectl -n d8-observability-platform get cm backup-s3 loki-s3 mimir-s3 -o json | jq -cM 'reduce .items[] as $elt ({}; .[$elt.metadata.name] = $elt.data.BUCKET_NAME)') \
'.items[] | reduce . as $elt ({}; .[$elt.metadata.name] += [($elt.data | map_values(@base64d) | with_entries(.key |= ascii_downcase) | with_entries(.key |= sub("^aws_"; "")) | . += {type: "s3", provider: "Ceph", endpoint: $endpoint} | to_entries[] | "\(.key) = \(.value)")] | .[($elt.metadata.name|sub("-s3$"; ""))] = ["type = alias", "remote = " + ($elt.metadata.name + ":" + $buckets[$elt.metadata.name])]) | to_entries[] | "[\(.key)]\n\(.value|join("\n"))\n"'
-
Сохраните вывод команды в файл
rclone.conf
на сервере. -
Проверьте доступ к бакету:
rclone --config rclone.conf ls backup:
-
Используйте команды rclone
sync
/copy
для создания резервных копий.
Пример резервного копирования метрик с использованием rclone
rclone --config rclone.conf sync -v --delete-before --exclude-if-present deletion-mark.json --exclude '*/markers/*' --exclude '*/bucket-index.json.gz' dop-mimir: /backup/prod/mimir/
Команда синхронизирует содержимое бакета с локальным хранилищем, исключая маркеры, bucket-index и блоки, помеченные на удаление. Исключённые файлы будут удалены из локальной копии, если отсутствуют в источнике.
Восстановление данных
Восстановление данных метрик и логов заключается в загрузке содержимого резервной копии обратно в S3-бакеты. Для этого используйте монтирование или утилиту rclone
, как отмечено ранее.
Сначала загружаются все блоки без meta.json
, затем отдельно загружаются meta.json
. Это позволяет обрабатывать только полные, завершённые блоки.
Пример:
rclone --config rclone.conf sync /backup/prod/mimir/ dop-flant-mimir: --exclude '*/meta.json'
rclone --config rclone.conf sync /backup/prod/mimir/ dop-flant-mimir: --include '*/meta.json'
Восстановление базы данных PostgreSQL
Инструкция применима для случаев, когда модуль observability-platform
использует встроенный PostgreSQL. Если используется внешняя база данных (.spec.settings.ui.postgres.mode: External
), следуйте документации вашего провайдера СУБД.
-
Остановите
backend
и компонентыalertgate
. Удалитеcronjobs
, использующие базу данных:kubectl -n d8-observability-platform scale deploy backend alertgate-receiver alertgate-sender alertgate-api --replicas=0 kubectl -n d8-observability-platform delete cronjob backend-clean-silences host-load postgres-backup
-
Убедитесь, что у вас есть дамп базы данных нужного объёма. Скопируйте его на управляющий узел.
-
Удалите текущую базу данных PostgreSQL:
kubectl -n d8-observability-platform exec -it $(kubectl -n d8-observability-platform get po -l spilo-role=master -o name) -- psql -U dop -c "DROP DATABASE dop;" postgres
-
Создайте базу данных заново:
kubectl -n d8-observability-platform exec -it $(kubectl -n d8-observability-platform get po -l spilo-role=master -o name) -- psql -U dop -c "CREATE DATABASE dop;" postgres
-
Восстановите базу данных из дампа:
zcat dop-202504211200.dump.gz | kubectl -n d8-observability-platform exec -it $(kubectl -n d8-observability-platform get po -l spilo-role=master -o name) -- psql -U dop dop
-
Запустите
backend
и компонентыalertgate
:kubectl -n d8-observability-platform scale deploy backend alertgate-receiver alertgate-sender alertgate-api --replicas=2
-
Убедитесь, что все компоненты работают:
kubectl -n d8-observability-platform get po -l 'app in (backend,alertgate-receiver,alertgate-sender,alertgate-api)'
-
Проверьте доступность веб-интерфейса системы.