Резервное копирование данных

Deckhouse Observability Platform предоставляет пользователю возможность выполнить резервное копирование данных путём копирования содержимого S3-бакетов. Помимо метрик и логов, которые сохраняются в S3 во время нормальной работы, модуль также автоматически выполняет резервное копирование базы данных PostgreSQL и сохраняет дамп базы данных в S3. Таким образом, для выполнения резервного копирования данных платформы необходимо скопировать содержимое трех бакетов: mimir — для метрик, loki — для логов и backup — для базы данных.

Настройки резервного копирования базы данных PostgreSQL указываются в ModuleConfig observability-platform. Описание настроек находится в документации модуля.

Способы резервного копирования S3-бакетов

S3-бакеты можно резервировать несколькими способами:

  • С помощью утилит rclone или minio-client, которые позволяют синхронизировать содержимое S3-бакетов с локальным хранилищем либо с другим S3-хранилищем.
  • Смонтировав S3-бакеты в локальную файловую систему с помощью утилиты s3fs или geesefs, а затем выполив резервное копирование с помощью принятых в компании средств резервного копирования.

Использование geesefs

  • Установите geesefs на сервер, куда будет выполнятся монтирование S3-бакетов. Для этого выполните:

    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-бакетам. Для этого на master-узле 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 на сервере, куда будет выполнятся монтирование S3-бакетов.

  • Сгенерируйте строки для /etc/fstab. Для этого на master-узле 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 на сервере, куда будет выполнятся монтирование S3-бакетов.

  • Смонтируйте S3-бакеты:

    mount -a
    
  • Проверьте, что в смонтированных каталогах есть содержимое, например:

    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. Для этого на master-узле 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:

    rclone --config rclone.conf ls backup:
    
  • Используйте команды rclone sync / rclone copy для резервного копирования S3-бакетов.

Восстановление данных

Восстановление данных mimir и loki производится путем загрузки данных из резервной копии обратно в S3-бакеты. Для этого необходимо смонтировать бакеты на сервер, где будет выполнятся восстановление, либо использовать rclone для копирования данных из резервной копии в S3-бакеты аналогично, как это делалось при резервном копировании.

Восстановление базы данных PostgreSQL

Данная инструкция применима для случаев, когда модуль observability-platform развернут вместе со встроенным PostgreSQL. При использовании внешней СУБД PostgreSQL (опция .spec.settings.ui.postgres.mode: External) восстановление базы производится согласно инструкции провайдера СУБД.

  1. Перед восстановлением базы данных PostgreSQL необходимо остановить 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
    
  2. Убедитесь, что у вас есть необходимый дамп базы и он имеет ненулевой размер. Скопируйте дамп базы на mастер-узел Kubernetes.

  3. Удалите существующую базу данных 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
    
  4. Создайте базу данных dop заново:

    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
    
  5. Восстановите базу данных из резервной копии:

    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
    
  6. Запустите backend и компоненты alertgate:

    kubectl -n d8-observability-platform scale deploy backend alertgate-receiver alertgate-sender alertgate-api --replicas=2
    
  7. Проверьте, что все поды запущены и работают:

    kubectl -n d8-observability-platform get po -l 'app in (backend,alertgate-receiver,alertgate-sender,alertgate-api)'
    
  8. Убедитесь, что веб-интерфейс платформы доступен.