Резервное копирование и восстановление СУБД PostgreSQL в кластере Patroni
Все действия по копированию выполняются только на
клиенте с ролью, указанной в параметре patroni_node_type_for_backup
, по
умолчанию это «Лидер».
1. Создание группы Patroni на сервере RuBackup
При регистрации в RuBackup все клиенты помещаются в группу No group. Для
корректной работы с кластером нужно создать отдельную группу клиентов,
переместить в неё все клиенты кластера, а также установить атрибуты
группы «Разделяемая группа» и «Кластерная группа» в true
(Рисунок 1).
Более подробно создание и добавление клиентов в группу описано в
документе «Руководство системного администратора RuBackup».
2. Выполнение полной и/или инкрементальной копии кластера Patroni
Единственное условие выполнения полной и/или инкрементальной копии
кластера Patroni — выполнение копирования только на клиенте с ролью,
указанной в параметре patroni_node_type_for_backup
, по умолчанию это
«Лидер».
Для выполнения полного и/или инкрементального копирования в кластере
Patroni необходимо на каждом клиенте, входящем в кластер, настроить
следующие параметры: patroni_host
, patroni_port
,
patroni_node_type_for_backup
.
3. Восстановление без развертывания
-
Определить лидера кластера Patroni командой
patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1
выполненной от пользователя
postgres
на клиенте, входящем в кластер; -
Отключить элементы кластера с ролью Replica;
-
Отключить элемент кластера с ролью Leader;
-
Запустить процесс восстановления без развертывания в каталог для восстановления на клиенте с ролью Leader;
-
После завершения задачи по восстановлению необходимо перенести файлы из каталога для восстановления в целевые каталоги, т. е. из каталога для восстановления
/restore_dir/number.rest/var/lib/postgresql/11/main
(гдеnumber
— это номер резервной копии) в/var/lib/postgresql/11/main
с заменой файлов, а также из каталога для восстановления/restore_dir/number.rest/opt/rubackup/mnt/postgresql_archives
перенести wal-файлы (гдеnumber
— это номер резервной копии) для восстановления в/opt/rubackup/mnt/postgresql_archives/
; -
Убедиться, что у перенесенных файлов владелец и группа назначены
postgres
; -
На клиенте с ролью Leader от пользователя postgres необходимо удалить кластер командой:
patronictl -c /etc/patroni/config.yml remove patroni_cluster_1
Потребуется подтверждение удаления кластера: на первый запрос повторно ввести имя кластера, на второй запрос ввести фразу Yes I am aware;
Рисунок 2. Подтверждение удаления кластера -
Запустить элемент кластера на клиенте с ролью Leader;
-
Запустить элементы кластера на клиенте с ролью Replica;
-
Убедиться, что все элементы имеют статус running командой:
patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1
выполненной от пользователя postgres на клиенте, входящем в кластер.
4. Восстановление в режиме Point in Time Recovery (PITR)
-
Определить лидера кластера Patroni командой
patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1
выполненной от пользователя postgres на клиенте, входящем в кластер;
-
Отключить элементы кластера с ролью Replica;
-
Отключить элемент кластера с ролью Leader;
-
Убедиться, что в конфигурационном файле модуля
/opt/rubackup/etc/rb_module_postgresql.conf
для параметраdirect_restore
установлено значениеno
; -
Запустить процесс восстановления без развертывания в каталог для восстановления на ВМ с ролью Leader;
-
После завершения задачи по восстановлению необходимо скопировать файлы из каталога для восстановления в целевые каталоги, т. е. из каталога для восстановления
/restore_dir/number.rest/var/lib/postgresql/11/main
(где number — это номер резервной копии) скопировать файлы в/var/lib/postgresql/11/main
, предварительно удалив файлы из целевого каталога, и из каталога для восстановления/restore_dir/number.rest/opt/rubackup/mnt/postgresql_archives
(гдеnumber
— это номер резервной копии) перенести wal-файлы для восстановления в/opt/rubackup/mnt/postgresql_archives/
-
Убедиться, что у скопированных файлов назначены владелец и группа
postgres
; -
На клиенте с ролью Leader от пользователя postgres необходимо удалить кластер командой:
patronictl -c /etc/patroni/config.yml remove patroni_cluster_1
Потребуется подтверждение удаления кластера: на первый запрос повторно ввести имя кластера, на второй запрос ввести фразу
Yes I am aware
. -
Запустить элемент кластера на клиенте с ролью Leader;
-
Запустить элементы кластера на клиенте с ролью Replica;
-
Убедиться, что все элементы имеют статус running командой:
patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1
выполненной от пользователя
postgres
на клиенте, входящем в кластер; -
Отключить элементы кластера с ролью Replica;
-
Отключить элемент кластера с ролью Leader;
-
Еще раз скопировать файлы из каталога для восстановления
/restore_dir/number.rest/var/lib/postgresql/11/main
(гдеnumber
— это номер резервной копии) в/var/lib/postgresql/11/main
, предварительно удалив файлы из целевого каталога; -
В файле
postgresql.conf
внести значения в параметр:recovery_target_time = '2023-03-27 15:29:00'
и закомментировать остальные параметры recovery_target, если они не используются;Рисунок 3. Редактирование файлаpostgresql.conf
-
В файле
postgresql.auto.conf
внести значения в следующие параметры:restore_command = 'cp /opt/rubackup/mnt/postgresql_archives/%f %p'
,recovery_target_time = '2023-03-27 15:29:00'
иrecovery_target_action = 'promote'
Рисунок 4. Редактирование файлаpostgresql.auto.conf
-
Запустить PostgreSQL командой
sudo -u postgres путь_к_bin/postgres -D путь_к_data_содержащей_конфиг_файлы
Пример 1.sudo -u postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data/patroni_cluster_1/data/
-
После успешного запуска PostgreSQL проверить в логах, что СУБД готова принимать подключения;
-
Остановить PostgreSQL;
-
На клиенте с ролью Leader от пользователя postgres необходимо удалить кластер командой
patronictl -c /etc/patroni/config.yml remove patroni_cluster_1
. Потребуется подтверждение удаления кластера: на первый запрос повторно ввести имя кластера, на второй запрос ввести фразуYes I am aware
;Рисунок 5. Подтверждение удаления кластера -
Запустить элемент кластера на ВМ с ролью Leader;
-
Запустить элементы кластера на клиенте с ролью Replica;
-
Убедиться, что все элементы имеют статус running командой, выполненной от пользователя postgres на клиенте, входящем в кластер:
patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1