Ранее уже рассматривалось создание кластера с помощью 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