Использование Barman для выполнения резервного копирования PostgreSQL
Опубликовано:
Используемые термины: PostgreSQL, Docker.
В инструкции мы рассмотрим приложение Barman для создания резервных копий базы данных PostgreSQL по технологии PITR — Point-in-Time Recovery. А именно:
- Установка и базовая настройка Barman.
- Настройка PostgreSQL для возможности подключения со стороны приложения.
- Настройка расписания для автоматического запуска.
Будут использоваться команды на примере Linux и Barman версии 3 и выше.
Установка пакета Barman
Выбор подхода для резервирования данных
Настройка СУБД для подключения
Настройка и запуск резервного копирования
Запуск заданий по расписанию
Установка Barman
Приложение Barman можно установить на отдельный сервер, с которого будет выполняться резервное копирование или прямо на хост с базой данных.
Он есть в репозитории системы или в родном репозитории PostgreSQL. Установка выполняется штатными средствами операционной системы.
а) Для систем на базе DEB (Ubuntu / Debian / Astra):
apt update
apt install barman
б) Для систем на базе RPM (Rocky / Alma / РЕД ОС):
dnf install barman
Выбор стратегии
Есть два основных подхода, на которых строится вся работа Barman. Выбор между ними определяет нагрузку на сеть, скорость работы и то, насколько инфраструктура защищена от потери данных в случае катастрофы. Кратко опишем их.
1. Rsync backups + WAL archiving (Классический метод). Основан на стандартных утилитах операционной системы и командах самого PostgreSQL. Копирование rsync через SSH.
2. Streaming backups + WAL streaming (Потоковый метод). Файлы передаются потоком через сетевое соединение базы данных.
3. Гибридный подход. На практике крупные компании часто используют комбинированный метод: WAL-журналы настраивают через Streaming, чтобы гарантировать нулевую потерю данных в любую секунду. Сами еженедельные или ежедневные бэкапы делают через Rsync, чтобы задействовать дедупликацию, жесткие ссылки (hard links) и экономить дисковое пространство на сервере Barman.
Метод с использованием Rsync больше нагружает дисковую систему и на данный момент является устаревшим. Поэтому мы рассмотрим WAL streaming.
Настройка PostgreSQL
Приложение Barman должно подключиться к серверу PostgreSQL с возможностью репликации данных. Для этого необходимо настроить права на подключение и чтение данных.
Подключаемся к консоли сервера баз данных:
su - postgres -c psql
Или если база в docker:
docker exec -it --user postgres pg-container-name psql -Upostgres
* ваш контейнер может быть инициализирован без пользователя postgres. В таком случае подставьте данные пользователя, под которым можно получить доступ к консоли.
Создадим пользователя barman:
> CREATE USER barman WITH REPLICATION PASSWORD 'password';
* обязательно задайте более сложный пароль.
Выдадим нужные права пользователю для чтения данных:
> GRANT pg_checkpoint, pg_read_all_settings, pg_read_all_stats TO barman;
И создания резервных копий:
> GRANT EXECUTE ON FUNCTION pg_backup_start(text, boolean) TO barman;
> GRANT EXECUTE ON FUNCTION pg_backup_stop(boolean) TO barman;
> GRANT EXECUTE ON FUNCTION pg_switch_wal() TO barman;
> GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO barman;
Посмотрите пути до конфигурационных файлов:
> SHOW hba_file;
> SHOW config_file;
Мы должны получить ответы на подобие:
hba_file
--------------------------------------
/var/lib/postgresql/data/pg_hba.conf
(1 row)
config_file
------------------------------------------
/var/lib/postgresql/data/postgresql.conf
(1 row)
Эти 2 файла нам нужно отредактировать.
Выходим из оболочки SQL:
> exit
Обратите внимание, что при использовании docker для дата-каталога будет использоваться другой путь, а не тот, что вернули команды SHOW. Для открытия правильных файлов конфигурации нужно либо сверить путь с настройкой docker-compose или открывать файл, подключившитсь к самому docker контейнеру.
Открываем конфигурационный файл pg_hba:
vi /var/lib/postgresql/data/pg_hba.conf
Добавляем строку в local connections:
# IPv4 local connections:
host postgres barman IP_СЕРВЕРА_BARMAN/32 scram-sha-256
И в самый низ:
host replication barman IP_СЕРВЕРА_BARMAN/32 scram-sha-256
* в старых версиях PostgreSQL вместо scram-sha-256 нужно указать md5. Однако, бывает так, что администратор базы данных новую версию переводит на md5 — ориентируйтесь по остальным строкам в файле pg_hba.
После открываем конфигурационный файл postgresql:
vi /var/lib/postgresql/data/postgresql.conf
Приводим опции к виду:
listen_addresses = '*'
wal_level = replica
max_wal_senders = 5
* где listen_addresses — интерфейсы, на которых будет слушать postgresql; wal_level = replica — включает запись журналов для выполнения репликации; max_wal_senders — открывает слоты для одновременного обслуживания реплик.
Перезапускаем PostgreSQL.
systemctl restart postgresql
Или если у нас docker:
docker restart pg-container-name
Переходим на сервер с Barman и проверяем, что мы можем подключиться к серверу баз данных:
psql "host=1.2.3.4 port=5432 user=barman dbname=replication replication=on" -c "IDENTIFY_SYSTEM"
* где 1.2.3.4 — IP-адрес сервера PostgreSQL; 5432 — порт подключения к базе.
Будет запрошен пароль для пользователя barman — вводим тот, что указывали при создании пользователя:
Password for user barman:
В итоге, мы должны увидеть что-то на подобие:
systemid | timeline | xlogpos | dbname
---------------------+----------+-------------+--------
7606024626954124453 | 1 | 3A/FCEB63E8 |
Наш хост резервного копирования успешно подключился к PostgreSQL. Можно переходить к настройке создания архивов.
Настройка резервного копирования через Barman
Открываем на редактирование файл pgpass:
su - barman -c "vi ~/.pgpass"
Добавляем строку:
<IP_СЕРВЕРА_БД>:5432:*:barman:<ваш_надежный_пароль>
* данная строка содержит пароль для подключения к конкретному серверу, конкретной базе. Настройка нужна, чтобы отправлять запросы на резервное копирование без необходимости ручного ввода данных аутентификации.
Задаем приватные права на файл:
chmod 0600 ~barman/.pgpass
Для нашего удобства, создаем переменную с названием сервера, который будем резервировать (название может быть произвольным, главное — чтобы вы сами разобрались):
SQL_SRV_NAME=postgresql1
Создаем конфигурационный файл для резервирования через barman:
vi /etc/barman.d/${SQL_SRV_NAME}.conf
[postgresql1]
description = "Бэкап сервера postgresql1"
# Метод сбора бэкапов и WAL
backup_method = postgres
streaming_archiver = on
slot_name = barman
# Строки подключения к удаленному серверу
conninfo = host=1.2.3.4 port=5432 user=barman dbname=postgres
streaming_conninfo = host=1.2.3.4 port=5432 user=barman dbname=replication
# Автоматическое удаление старых бэкапов (например, хранить 30 дней)
retention_policy = RECOVERY WINDOW OF 30 DAYS
wal_retention_policy = main
* обратите внимание на выделенные желтым значения. Их нужно заменить на свои.
Создаем слот репликации и начинаем копирование WAL логов:
sudo -iu barman bash -c "barman receive-wal --create-slot ${SQL_SRV_NAME}"
Мы должны увидеть что-то на подобие:
Creating physical replication slot 'barman_postgresql1' on server 'postgresql1'
Replication slot 'barman_postgresql1' created
* с этого момента barman будет знать о всех изменениях в базе данных.
Проверим конфигурацию и возможность подключения barman к нашему серверу:
barman check ${SQL_SRV_NAME}
Ошибку
WAL archive: FAILED (please make sure WAL shipping is setup)
... можно игнорировать. Она пропадет после выполнения первого бэкапа.
По хорошему, все проверки должны показать статус OK.
Перед созданием первого базового бэкапа, просим barman закрыть текущий активный WAL-файл и открыть новый:
barman switch-wal --force ${SQL_SRV_NAME}
Выполним все регламентные, фоновые и очистительные работы:
barman cron
Ждем секунд 15. Запускаем первый полный бэкап для сервера:
barman backup ${SQL_SRV_NAME}
Если мы получим ошибку:
ERROR: Impossible to start the backup. Check the log for more details, or run 'barman check postgresql1'
Выполняем еще раз команду:
barman switch-wal --force ${SQL_SRV_NAME}
После его завершения, можно посмотреть список созданных резервных копий командой:
barman list-backup ${SQL_SRV_NAME}
Также мы можем заглянуть в папку, где хранятся резервные копии:
ls -la /var/lib/barman/${SQL_SRV_NAME}/base
Запуск заданий по расписанию
От имени пользователя barman запускаем редактирование крон:
crontab -e -u barman
Для выполнения регламентных заданий barman обязательно, добавляем строку:
*/5 * * * * /usr/bin/barman cron
* выполнение раз в 5 минут.
Для резервного копирования по расписанию вставляем строку:
0 2 * * * /usr/bin/barman backup --wait postgresql1 > /dev/null
* в данном примере будет выполняться резервное копирование для postgresql1 каждый день в 2 ночи.