Управление резервным копированием PostgreSQL через веб-интерфейс: обзор утилиты PG Back Web

—

от автора

Сегодня мы рассмотрим утилиту PG Back Web. Это инструмент для управления резервным копированием PostgreSQL.

Разберём, что умеет это решение и как выглядит его интерфейс. А бонусом покажу примеры развёртывания PG Back Web в Kubernetes.

О продукте

Open Source-решение PG Back Web используют для настройки резервного копирования и управления восстановлением баз данных, работающих под PostgreSQL. 

В качестве средства самого резервного копирования PG Back Web использует pg_dump (format=plain). При восстановлении используется вызов psql -f.

PG Back Web также включает в себя средства, с помощью которых можно мониторить доступность базы данных и успешность выполнения заданий резервного копирования.

Лицензия: MIT license.

Поддерживаемые СУБД: PostgreSQL 13, 14, 15 и 16-й версий.

Возможности

Ключевые особенности PG Back Web:

  • отлично продуманный веб-интерфейс, о котором расскажем подробнее в следующем блоке;

  • простота развёртывания и настройки;

  • поддержка резервного копирования как в S3-совместимое объектное хранилище, так и в локальный каталог;

  • резервное копирование как по требованию, так и по расписанию;

  • управление жизненным циклом резервных копий;

  • поддержка шифрования собственных чувствительных данных с помощью PGP;

  • мониторинг успешного выполнения резервного копирования;

  • мониторинг доступности PostgreSQL и объектного хранилища;

  • возможность подключения мониторинга к системе управления инцидентами;

  • Cloud Ready: решение полностью готово для развёртывания в Kubernetes.

При этом у данного решения есть и недостатки, так как у него отсутствуют:

  • поддержка резервного копирования PostgreSQL 17 (скоро планируется добавить);

  • многопользовательский режим с разделением прав;

  • возможность управления всеми параметрами вызова pg_dump, в том числе невозможно задать --format=custom;

  • возможность создать резервную копию всех БД экземпляра PostgreSQL средствами pg_dumpall либо pg_basebackup;

  • поддержка pg_basebackup в принципе;

  • возможность организовать PITR;

  • ручные фильтры в списке резервных копий.

Однако я хотел бы отметить, что подавляющее большинство этих недостатков во многом является следствием достоинств решения, а именно — его простоты и универсальности. Используемая модель прекрасно вписывается в идеологию облачных баз данных с подходом «Один экземпляр СУБД = одна база данных». Кроме того, применяемый метод резервного копирования полностью независим от того, где и как развёрнута СУБД и кем она управляется.

Обзор интерфейса

Интерфейс понятен и лаконичен, состоит из основных разделов:

  • Databases

  • Destinations

  • Backups

  • Executions

  • Restorations

  • Webhooks

Databases

Раздел для управления соединениями с базами данных:

Через кнопку «Create database» можно добавить новое соединение. В появившейся форме нужно указать имя, версию PostgreSQL и строку подключения:

Ещё можно перейти в список резервных копий (Executions), отфильтрованных по нужной базе данных:

Destinations

Раздел для управления соединениями с объектными хранилищами:

Через кнопку «Create destination» можно добавить новое соединение. В открывшейся форме нужно указать имя, имя бакета, эндпоинт, регион, ключ доступа и секретный ключ:

Backups

Раздел для управления расписаниями резервного копирования:

При создании расписания нужно указать:

  • название задания резервного копирования;

  • выбор одной из настроенных в Databases баз данных;

  • бэкап в локальный каталог или объектное хранилище:

    • если бэкап не локальный, то выбор одного из настроенных в Destinations объектных хранилищ;

    • если локальный, то нужно задать путь к каталогу для бэкапов (Destination directory);

  • расписание в стандартном формате cron;

  • время жизни резервных копий.

Время жизни можно указать только в днях. Проверка на актуальность хранимых бэкапов выполняется при каждом старте. Например, если снятие бэкапа настроено раз в час, а срок хранения бэкапов — 1 день, то при каждом успешном выполнении бэкапа будет удален бэкап, сделанный 25 часов назад.

 При необходимости можно задать некоторые параметры pg_dump:

У PG Back Web нет доступа к физическим серверам, и при настройке бэкапа типа Local подразумевается сохранение резервных копий на диск экземпляра самого PG Back Web. При задании Destination directory для бэкапа типа Local задаётся путь к подкаталогу /backups.

Например, если в настройках указан путь:

…то на диске резервные копии будут храниться здесь:

ls -1 /backups/tmp/tribute/2024/12/27/  dump-20241227-005000-7dc0a663-8562-417c-8be6-f103b71533cd.zip

Если PG Back Web развёрнут в Kubernetes, в каталог /backups должен быть смонтирован volume для хранения дампов.

Из раздела Backups можно вызвать выполнение резервного копирования принудительно, а также перейти в раздел Executions с фильтрацией по конкретному расписанию:

Executions

Раздел со списком всех вызовов операций резервного копирования и удаления резервных копий:

Для операций, завершившихся с ошибкой, можно посмотреть сообщение об ошибке без необходимости обращения к логу пода с приложением:

 

Кроме того, интерфейс позволяет скачать успешно выполненный дамп:

Restorations

Раздел со списком всех вызовов операций восстановления из резервной копии:

Сама же операция восстановления инициируется из раздела Executions. Для восстановления необходимо выбрать нужную резервную копию, в её контекстном меню выбрать Restore execution и в качестве места назначения восстановления либо выбрать одну из настроенных в разделе Databases БД, либо указать произвольный адрес подключения:

Если PG Back Web развёрнут в Kubernetes, в каталог /tmp должен быть смонтирован volume, так как при восстановлении PG Back Web загружает в этот каталог выбранный дамп, разархивирует его и выполняет вызов вида:

/usr/lib/postgresql/13/bin/psql postgresql://pgbackweb:*******@192.168.199.69:5433/myth -f /tmp/pbw-restore-1423349472/dump.sql

Webhooks

Раздел для настройки мониторинга выполнения резервного копирования, а также для мониторинга доступности баз данных и объектных хранилищ.

Пример настройки мониторинга доступности базы данных с доставкой информации в систему управления инцидентами:

Ошибки выполнения резервного копирования активируют вебхук по факту возникновения инцидента. Проверки доступности баз данных и объектных хранилищ выполняются по расписанию раз в 10 минут.

Для проверки работоспособности резервного копирования, а также для проверки доступности баз данных и объектных хранилищ можно настроить обратную проверку типа Dead Man Switch. Этот механизм подразумевает, что система мониторинга будет получать подтверждение работоспособности каждые 10 минут. Если подтверждение не будет получено в течение установленного времени, система автоматически сгенерирует предупреждение (алерт). Пример настройки DMS:

Пример развёртывания PG Back Web в Kubernetes

StatefulSet приложения:

apiVersion: apps/v1 kind: StatefulSet metadata:  name: pgbackweb spec:  serviceName: pgbackweb  selector:    matchLabels:      app: pgbackweb  replicas: 1  template:    metadata:      labels:        app: pgbackweb    spec:      containers:      - name: pgbackweb        image: eduardolat/pgbackweb:0.3.0        envFrom:        - secretRef:            name: pgbackweb        volumeMounts:        - name: backup          mountPath: /backups        - name: tmp          mountPath: /tmp        resources:          requests:            cpu: 5m            memory: 1Gi          limits:            memory: 1Gi        livenessProbe:          failureThreshold: 3          httpGet:            path: /            port: http            scheme: HTTP          initialDelaySeconds: 20          periodSeconds: 5          successThreshold: 1          timeoutSeconds: 2        readinessProbe:          failureThreshold: 3          httpGet:            path: /            port: http            scheme: HTTP          initialDelaySeconds: 10          periodSeconds: 5          successThreshold: 1          timeoutSeconds: 2        ports:        - containerPort: 8085          name: http          protocol: TCP  volumeClaimTemplates:  - apiVersion: v1    kind: PersistentVolumeClaim    metadata:      name: backup    spec:      accessModes:      - ReadWriteOnce      resources:        requests:          storage: 200Gi      storageClassName: ceph-ssd      volumeMode: Filesystem  - apiVersion: v1    kind: PersistentVolumeClaim    metadata:      name: tmp    spec:      accessModes:      - ReadWriteOnce      resources:        requests:          storage: 50Gi      storageClassName: ceph-ssd      volumeMode: Filesystem

Secret приложения:

apiVersion: v1 kind: Secret type: Opaque metadata:  name: pgbackweb data:   PBW_ENCRYPTION_KEY: bGFjaEFrSm9zZGVkcnlzcHlhSG9sdnl1OUZsaWN5YXA=   PBW_POSTGRES_CONN_STRING: cG9zdGdyZXNxbDovL3BnYmFja3dlYjppdHNwYXNzd29yZEBwb3N0Z3Jlczo1NDMyL3BnYmFja3dlYj9zc2xtb2RlPWRpc2FibGU=   TZ: RXVyb3BlL01vc2Nvdw==

В Secret все значения закодированы в Base64. На всякий случай напомню, что при кодировании значений переменных для Secrets в Base64 необходимо убирать символы переноса строки.

Пример:

echo -n "my_secret_string" | base64 bXlfc2VjcmV0X3N0cmluZw==

Service приложения:

apiVersion: v1 kind: Service metadata:  name: pgbackweb spec:  clusterIP: None  selector:    app: pgbackweb  ports:  - name: http    port: 8085

Ingress приложения:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata:  name: pgbackweb spec:  rules:  - host: pgbackweb.mydomain.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: pgbackweb            port:              name: http  tls:  - hosts:    -  pgbackweb.mydomain.com    secretName: pgbackweb-tls

Здесь следует понимать, что ключ шифрования, задаваемый переменной окружения PBW_ENCRYPTION_KEY, служит не для шифрования резервных копий. Он предназначен для шифрования чувствительных данных пользовательских настроек, которые хранятся в служебной базе данных PostgreSQL. Это необходимо, поскольку доступ к служебной базе данных PG Back Web может иметь не только администратор резервного копирования. 

Пример хранения connection string:

postgres=# \c pgbackweb You are now connected to database "pgbackweb" as user "postgres". pgbackweb=# select * from databases limit 1; -[ RECORD 1 ]-----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- id                | 48844f37-6ed2-4456-b424-252d90a76038 name              | myth connection_string | \xc30d040703025c1d84c186e9e04e73d2690167eef67bc473e9da442300e2bd3ced1e34d98e67eae0340a6bfc4fd0891e2551e0b6cd3f52878be559a907856a4b3d92d2e2c8d06c69171d8d20ee8c16ef5c81270080010203923a8046d6d264a1d854f24211e95ffcc8a6d8cb4a9cbf3c42edeb868c50111b7b1b pg_version        | 13 created_at        | 2024-12-19 10:16:33.642688+00 updated_at        | 2024-12-28 05:00:00.028803+00 test_ok           | t test_error        | last_test_at      | 2024-12-28 05:00:00.028803+00

Вывод

PG Back Web полностью Cloud Ready, отличается прекрасно продуманным веб-интерфейсом и стабильной работой. Это решение великолепно подойдёт для управления резервным копированием баз данных относительно небольшого размера, работающих под управлением PostgreSQL, то есть в случаях, когда не требуется получения бинарной копии файлов кластера либо задания custom-формата для резервных копий.

P. S.

Читайте также в нашем блоге:


ссылка на оригинал статьи https://habr.com/ru/articles/874088/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *