Резервное копирование и восстановление СУБД PostgreSQL в кластере Patroni

Все действия по копированию выполняются только на клиенте с ролью, указанной в параметре patroni_node_type_for_backup, по умолчанию это «Лидер».

1. Создание группы Patroni на сервере RuBackup

При регистрации в RuBackup все клиенты помещаются в группу No group. Для корректной работы с кластером нужно создать отдельную группу клиентов, переместить в неё все клиенты кластера, а также установить атрибуты группы «Разделяемая группа» и «Кластерная группа» в true (Рисунок 1). Более подробно создание и добавление клиентов в группу описано в документе «Руководство системного администратора RuBackup».

28
Рисунок 1. Атрибуты «Разделяемая группа» и «Кластерная группа»

2. Выполнение полной и/или инкрементальной копии кластера Patroni

Единственное условие выполнения полной и/или инкрементальной копии кластера Patroni — выполнение копирования только на клиенте с ролью, указанной в параметре patroni_node_type_for_backup, по умолчанию это «Лидер».

Для выполнения полного и/или инкрементального копирования в кластере Patroni необходимо на каждом клиенте, входящем в кластер, настроить следующие параметры: patroni_host, patroni_port, patroni_node_type_for_backup.

3. Восстановление без развертывания

  1. Определить лидера кластера Patroni командой

    patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1

    выполненной от пользователя postgres на клиенте, входящем в кластер;

  2. Отключить элементы кластера с ролью Replica;

  3. Отключить элемент кластера с ролью Leader;

  4. Запустить процесс восстановления без развертывания в каталог для восстановления на клиенте с ролью Leader;

  5. После завершения задачи по восстановлению необходимо перенести файлы из каталога для восстановления в целевые каталоги, т. е. из каталога для восстановления /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/;

  6. Убедиться, что у перенесенных файлов владелец и группа назначены postgres;

  7. На клиенте с ролью Leader от пользователя postgres необходимо удалить кластер командой:

    patronictl -c /etc/patroni/config.yml remove patroni_cluster_1

    Потребуется подтверждение удаления кластера: на первый запрос повторно ввести имя кластера, на второй запрос ввести фразу Yes I am aware;

    012
    Рисунок 2. Подтверждение удаления кластера
  8. Запустить элемент кластера на клиенте с ролью Leader;

  9. Запустить элементы кластера на клиенте с ролью Replica;

  10. Убедиться, что все элементы имеют статус running командой:

    patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1

    выполненной от пользователя postgres на клиенте, входящем в кластер.

4. Восстановление в режиме Point in Time Recovery (PITR)

  1. Определить лидера кластера Patroni командой

    patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1

выполненной от пользователя postgres на клиенте, входящем в кластер;

  1. Отключить элементы кластера с ролью Replica;

  2. Отключить элемент кластера с ролью Leader;

  3. Убедиться, что в конфигурационном файле модуля /opt/rubackup/etc/rb_module_postgresql.conf для параметра direct_restore установлено значение no;

  4. Запустить процесс восстановления без развертывания в каталог для восстановления на ВМ с ролью Leader;

  5. После завершения задачи по восстановлению необходимо скопировать файлы из каталога для восстановления в целевые каталоги, т. е. из каталога для восстановления /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/

  6. Убедиться, что у скопированных файлов назначены владелец и группа postgres;

  7. На клиенте с ролью Leader от пользователя postgres необходимо удалить кластер командой:

    patronictl -c /etc/patroni/config.yml remove patroni_cluster_1

    Потребуется подтверждение удаления кластера: на первый запрос повторно ввести имя кластера, на второй запрос ввести фразу Yes I am aware.

  8. Запустить элемент кластера на клиенте с ролью Leader;

  9. Запустить элементы кластера на клиенте с ролью Replica;

  10. Убедиться, что все элементы имеют статус running командой:

    patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1

    выполненной от пользователя postgres на клиенте, входящем в кластер;

  11. Отключить элементы кластера с ролью Replica;

  12. Отключить элемент кластера с ролью Leader;

  13. Еще раз скопировать файлы из каталога для восстановления /restore_dir/number.rest/var/lib/postgresql/11/main (где number — это номер резервной копии) в /var/lib/postgresql/11/main, предварительно удалив файлы из целевого каталога;

  14. В файле postgresql.conf внести значения в параметр: recovery_target_time = '2023-03-27 15:29:00' и закомментировать остальные параметры recovery_target, если они не используются;

    013
    Рисунок 3. Редактирование файла postgresql.conf
  15. В файле 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'

    014
    Рисунок 4. Редактирование файла postgresql.auto.conf
  16. Запустить 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/
  17. После успешного запуска PostgreSQL проверить в логах, что СУБД готова принимать подключения;

  18. Остановить PostgreSQL;

  19. На клиенте с ролью Leader от пользователя postgres необходимо удалить кластер командой patronictl -c /etc/patroni/config.yml remove patroni_cluster_1. Потребуется подтверждение удаления кластера: на первый запрос повторно ввести имя кластера, на второй запрос ввести фразу Yes I am aware;

    015
    Рисунок 5. Подтверждение удаления кластера
  20. Запустить элемент кластера на ВМ с ролью Leader;

  21. Запустить элементы кластера на клиенте с ролью Replica;

  22. Убедиться, что все элементы имеют статус running командой, выполненной от пользователя postgres на клиенте, входящем в кластер:

    patronictl -d etcd://адрес_хоста_etcd list patroni_cluster_1