Использование Barman для выполнения резервного копирования PostgreSQL

Обновлено и опубликовано Опубликовано:

Используемые термины: PostgreSQL, Docker.

В инструкции мы рассмотрим приложение Barman для создания резервных копий базы данных PostgreSQL по технологии PITR — Point-in-Time Recovery. А именно:

  • Установка и базовая настройка Barman.
  • Настройка PostgreSQL для возможности подключения со стороны приложения.
  • Настройка расписания для автоматического запуска.

Будут использоваться команды на примере Linux и Barman версии 3 и выше.

Установка 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 ночи.

# Linux # Базы данных # Резервное копирование # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Заказать настройку backup-сервера

Нужна бесплатная консультация?

Мини-инструкции

Использование приложения Barman для резервного копирования СУБД PostgreSQL

Шпаргалка для docker healthcheck

Как получить бесплатный VDS-сервер в SpaceWeb

Как установить и работать с различными LLM моделями через Ollama на Linux

Как установить и настроить SambaDC (Active Directory) на Linux Ubuntu

Как установить систему для удаленного управления устройствами MeshCentral на Linux

Установка и настройка кластера Ceph на Ubuntu для организации дискового хранилища

Другие инструкции

Все статьи

Нужна помощь? Пишите:






Реклама