Кластер PostgreSQL с использованием pg_auto_failover

Опубликовано 04.02.2023

Ранее уже рассматривалось создание кластера с помощью Patroni, настало время рассмотреть альтернативу — pg_auto_failover. Лично мне этот инструмент показался намного проще в использовании и с меньшим количеством накладных расходов. Эта статья не содержит никаких откровений и предназначена для систематизации освоенного материала.

Схема нашего кластера проста

Да, хосты называются именно так, postgres-02 (мастер), postgres-03 (реплика), postgres-backup (управляющая нода). Считаем, что на всех трех хостах подключен apt.postgresql.org и установлен PostgreSQL 15.

На управляющей ноде (в документации называемой «Monitor») устанавливаем расширение, переменные окружения, создаем каталог для управляющей базы и инициализируем управляющую ноду. Обратите внимание — тип аутентификации «trust».

root@postgres-backup:/home/miha# apt-get install postgresql-15-auto-failover
root@postgres-backup:/home/miha# su - postgres
postgres@postgres-backup:~$ mkdir -p 15/autofail
postgres@postgres-backup:~$ export PGDATA="/var/lib/postgresql/15/autofail"

postgres@postgres-backup:~$ vi .profile
export PGDATA="/var/lib/postgresql/15/autofail"

postgres@postgres-backup:~$ pg_autoctl create monitor --auth trust --ssl-mode require --ssl-self-signed --pgport 5432 --hostname postgres-backup

postgres@postgres-backup:~$ psql -c "alter user autoctl_node password 'zxcasdqwe'"

Введя команду postgres@postgres-backup:~$ pg_autoctl show systemd мы получим вывод, который необходимо сделать с привилегиями root:

root@postgres-backup:/home/miha# pg_autoctl -q show systemd --pgdata "/var/lib/postgresql/15/autofail" | tee /etc/systemd/system/pgautofailover.service
root@postgres-backup:/home/miha# systemctl daemon-reload
root@postgres-backup:/home/miha# systemctl enable pgautofailover
root@postgres-backup:/home/miha# systemctl start pgautofailover

Просмотрим состояние нашего кластера:

postgres@postgres-backup:~$ pg_autoctl show state
Name|Node|Host:Port|TLI: LSN|Connection|Reported State |Assigned State
----+----+---------+--------+----------+---------------+--------------

Так же, создаем каталог с продуктовой базой и выставляем переменные окружения. В моём случае, я создаю новый кластер для имитации перевода одиночной базы в кластерный режим.

root@postgres-02:/home/miha# apt-get install postgresql-15-auto-failover
root@postgres-02:/home/miha# su - postgres

postgres@postgres-02:~$  pg_createcluster -u postgres -p 5432 -d /var/lib/postgresql/15/mihadb --start-conf=manual -l /var/log/postgresql/mihadb.log 15 mihadb

postgres@postgres-02:~$ export PGDATA="/var/lib/postgresql/15/mihadb"
postgres@postgres-02:~$ vi .profile
export PGDATA="/var/lib/postgresql/15/mihadb"

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

postgres@postgres-02:~$ vi 15/mihadb/postgresql.conf
max_wal_senders = 100

Создаём мастер:

postgres@postgres-02:~$ pg_autoctl create postgres --hostname postgres-02 --name postgres-02 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node:zxcasdqwe@postgres-backup:5432/pg_auto_failover?sslmode=require'

Выполняем указания команды pg_autoctl show systemd

HINT: Если выбираете тип аутентификации md5, не забудьте задать пароли:

postgres@postgres-02:~$ pg_autoctl config set replication.password 'zxcasdqwe' 
postgres@postgres-02:~$ psql -c "alter user pgautofailover_replicator password 'zxcasdqwe';"

На реплике повторяем процедуру:

root@postgres-03:/home/miha# apt-get install postgresql-15-auto-failover
root@postgres-03:/home/miha# su - postgres
postgres@postgres-03:~$ vi .profile
export PGDATA='/var/lib/postgresql/15/mihadb'

Если используется md5, то можно создать файл с паролями:

postgres@postgres-03:~$ vi .pgpass
postgres-backup:5432:*:autoctl_node:zxcasdqwe
*:5432:replication:pgautofailover_replicator:zxcasdqwe
*:5432:postgres:pgautofailover_replicator:zxcasdqwe

postgres@postgres-03:~$ chmod 600 .pgpass

Подключаем вторую ноду к кластеру:

postgres@postgres-03:~$ pg_autoctl create postgres --hostname postgres-03 --name postgres-03 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node:zxcasdqwe@postgres-backup:5432/pg_auto_failover?sslmode=require'

Проверяем состояние кластера на управляющей ноде:

postgres@postgres-backup:~$ pg_autoctl show state
       Name|Node|      Host:Port |    TLI: LSN|Connection|Reported State|Assigned State
-----------+----+----------------+------------+----------+--------------+---------------
postgres-02|  1 |postgres-02:5432|1: 0/6000148|read-write|      primary |        primary
postgres-03|  2 |postgres-03:5432|1: 0/6000148| read-only|    secondary |      secondary

Убрать ноду из кластера: pg_autoctl drop node --destroy

Выполнить failover:

postgres@postgres-backup:~$ psql postgres://autoctl_node@localhost:5432/pg_auto_failover
psql (15.1 (Ubuntu 15.1-1.pgdg22.04+1))
SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, сжатие: выкл.)
Введите "help", чтобы получить справку.

pg_auto_failover=> select pgautofailover.perform_failover();

Список литературы:

https://habr.com/ru/post/664858/
https://www.citusdata.com/blog/2019/05/30/introducing-pg-auto-failover/
https://www.mankier.com/1/pg_auto_failover

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

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

*