Отказоустойчивый PostgreSQL кластер. Часть 2. Репликация. Repmgr.


Часть 1. Введение.
Часть 2. Репликация. Repmgr.
Часть 3. Auto-failover. Демоны repmgr.
Часть 4. Высокая доступность. Бэкапирование. Демоны repmgr. Barman.
Часть 5. Тестирование. Ansible. Вместо послесловия.

В этой части мы настроим мастер (db1) и резервный (db2) серверы репликации с использованием repmgr.

Для начала, создайте пользователя БД repmgr на сервере db1.

su - postgres
createuser -s repmgr
psql -c "alter user repmgr with password 'hdf456hw';"
createdb repmgr -O repmgr
psql -c 'alter user repmgr set search_path TO repmgr, "$user", public;'

Подготовьте экземпляры PostgreSQL для репликации. Добавьте следующие строки в конфиг на серверах db1 и db2.
/etc/postgresql/11/main/postgresql.conf

listen_addresses = '*'
max_wal_senders = 5
wal_keep_segments = 5
wal_level = replica
fsync = on
wal_log_hints = on
archive_mode = on
archive_command = '/bin/true'
hot_standby = on
shared_preload_libraries = 'repmgr'

listen_addresses = ‘*’ позволяет прослушивать входящие соединения на всех адресах и интерфейсах, включая localhost и адрес OpenVPN сервера. Это означает, что сервер открыт для прослушивания соединений и из интернета. Это не критично для тестовой среды, потому что файл pg_hba ограничивает соединения к экземпляру по диапазонам IP. Но для рабочей среды это еще одна точка для DDOS, поэтому, пожалуйста, всегда используйте фаерволл, например iptables, и строго относитесь к прослушивающим интерфесам.
max_wal_senders = 5 устанавливает как много процессов отправки WAL может создасться. Нам нужно всего лишь два — один для резервного сервера и второй для сервера бэкапирования. Я устанавливаю 5 на случай, если мы захотим расширить кластер или один из процессов зависнет попахивает нелогичностью.
wal_keep_segments = 5 устанавливает как много старых, в данный момент ненужных WAL гарантированно хранится на сервере. Резервный сервер использует полный бэкап мастера плюс недостающие WAL(получаемые с мастера онлайн) для развертывания. Если ваша система находится под нагрузкой, нужно оставить немного для получения резервным.
wal_level = replica — записывает достаточно информации в WAL чтобы репликация запустилась.
fsync = on — гарантирует запись данных на диск при коммите.
wal_log_hints = on — в числе прочих, позволяет использовать утилиту pg_rewind для быстрого возврата сервера в строй.
archive_mode = on и archive_command = ‘/bin/true’ — включает архивирование WAL и просто удаляет WAL. Нам не нужно локальное архивирование WAL, т.к. мы вскоре настроим потоковую репликацию используя barman.
hot_standby = on — включает горячий режим резервного сервера.

Теперь нам нужно разрешить repmgr подключаться к экземплярам БД без пароля. Добавьте следующие строки в начало файла pg_hba.conf на серверах db1 и db2.
/etc/postgresql/11/main/pg_hba.conf

local replication repmgr md5
host replication repmgr 127.0.0.1/32 md5
host replication repmgr 10.8.1.1/32 md5
host replication repmgr 10.8.2.1/32 md5

local repmgr repmgr md5
host repmgr repmgr 127.0.0.1/32 md5
host repmgr repmgr 10.8.1.1/32 md5
host repmgr repmgr 10.8.2.1/32 md5

ВАЖНО. Repmgr — суперюзер. Не используйте метод авторизации trust, который представлен во многих инструкциях в интернете. Это небезопасно, т.к. любой пользователь ОС на представленных серверах сможет залогиниться без пароля и наворотить.

Перезапустите PostgreSQL.

systemctl restart postgresql

Добавьте файл pgpass на обоих серверах. Так repmgr сможет подключаться к БД без пароля.

su - postgres
echo "*:*:*:repmgr:hdf456hw" > ~/.pgpass
chmod 600 ~/.pgpass

Создайте конфиг repmgr на сервере db1.
/etc/repmgr.conf

node_id=1
node_name=db1
conninfo='host=10.8.1.1 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/postgresql/11/main'
pg_bindir=/usr/lib/postgresql/11/bin/

service_start_command='sudo pg_ctlcluster 11 main start'
service_stop_command='sudo pg_ctlcluster 11 main stop'
service_restart_command='sudo pg_ctlcluster 11 main restart'
service_reload_command='sudo pg_ctlcluster 11 main reload'

log_facility=LOCAL0

Создайте конфиг repmgr на сервере db2.
/etc/repmgr.conf

node_id=2
node_name=db2
conninfo='host=10.8.2.1 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/postgresql/11/main'
pg_bindir=/usr/lib/postgresql/11/bin/

service_start_command='sudo pg_ctlcluster 11 main start'
service_stop_command='sudo pg_ctlcluster 11 main stop'
service_restart_command='sudo pg_ctlcluster 11 main restart'
service_reload_command='sudo pg_ctlcluster 11 main reload'

log_facility=LOCAL0

Дистрибутивы на базе Debian используют утилиту pg_ctlcluster для контроля экземпляров PostgreSQL. Мы должны позволить юзеру postgres выполнять их без пароля. Добавьте следующий файл в sudoers.
/etc/sudoers.d/pg_sudoers

Defaults:postgres !requiretty
postgres ALL = NOPASSWD: /usr/bin/pg_ctlcluster

Превратите db1 в мастер.

su - postgres
repmgr -f /etc/repmgr.conf primary register

Проверьте, что db1 работает как мастер.

repmgr -f /etc/repmgr.conf cluster show

Превратите db2 в резервный сервер.

su - postgres
sudo pg_ctlcluster 11 main stop
rm -r /var/lib/postgresql/11/main #переместите, а не удаляйте, если нужно
repmgr -h 10.8.1.1 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone -F
sudo pg_ctlcluster 11 main start
repmgr standby register

Проверьте, что кластер репликации работает в норме.

repmgr -f /etc/repmgr.conf cluster show

Пока что репликация асинхронна. Мы сделаем её синхронной, когда установим barman.
Также, вам никто не мешает переключать серверы кластера вручную уже сейчас. Мы автоматизируем этот процесс в следующей части.

Оставьте комментарий

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