Отказоустойчивый PostgreSQL кластер. Часть 3. Auto-failover. Демоны repmgr.


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

В этой части, мы создадим два демона repmgr на сервере backup и настроим auto-failover.

Почему бы не разместить демонов на самих серверах БД? Потому что в этом случае у нас нет перевеса голосов в какую-либо сторону при выборе мастера, что располагает к возникновению split-brain. Если db1 просто теряет связь с сервером db2 мы получаем ненужное переключение сервера и два мастера. Т.к. мы используем сервер backup как единую точку входа, мы можем переключать серверы только если это действительно нужно. Этот способ не решает проблему split-brain полностью, но он уже гораздо лучше.

Для начала, мы должны создать подключение ssh без пароля к серверам db1 и db2. Это позволит демонам автоматически переключать их при сбоях. ssh-copy-id спросит у вас пароль пользователя postgres, который мы поменяли в части 1.
Выполните это на сервере backup.

su - postgres
ssh-keygen -b 2048 -t rsa -N "" -C "postgres@10.8.3.1"
ssh-copy-id postgres@10.8.1.1
ssh-copy-id postgres@10.8.2.1

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

host repmgr repmgr 10.8.3.1/32 md5

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

systemctl restart postgresql

Добавьте файл pgpass на сервер backup, чтобы демоны могли подключаться к БД без пароля.

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

Отключите автозапуск OpenVPN и PostgreSQL после ребута на серверах db1 и db2. Зачем? Если, после ребута, OpenVPN запустится автоматически, демон repmgr до посинения будет ждать старта PostgreSQL и переключение БД не произодет. Если PostgreSQL запустится автоматически вы получите моментальный split-brain. Мы научимся возвращать экземпляр назад в кластер в части 5.

update-rc.d openvpn disable
update-rc.d postgresql disable

Создайте два конфига repmgr на сервере backup.
/etc/repmgrd_db1.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'

failover=automatic
promote_command='ssh postgres@10.8.1.1 /usr/bin/repmgr standby promote -f /etc/repmgr.conf --log-to-file'
follow_command='ssh postgres@10.8.1.1 /usr/bin/repmgr standby follow -f /etc/repmgr.conf --log-to-file --upstream-node-id=%n'
service_promote_command='ssh postgres@10.8.1.1 /usr/lib/postgresql/11/bin/pg_ctl -w -D /var/lib/postgresql/11/main promote'
monitoring_history=yes
monitor_interval_secs=2

log_facility=LOCAL0

/etc/repmgrd_db2.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'

failover=automatic
promote_command='ssh postgres@10.8.2.1 /usr/bin/repmgr standby promote -f /etc/repmgr.conf --log-to-file'
follow_command='ssh postgres@10.8.2.1 /usr/bin/repmgr standby follow -f /etc/repmgr.conf --log-to-file --upstream-node-id=%n'
service_promote_command='ssh postgres@10.8.2.1 /usr/lib/postgresql/11/bin/pg_ctl -w -D /var/lib/postgresql/11/main promote'
monitoring_history=yes
monitor_interval_secs=2

log_facility=LOCAL0

Создайте два конфига демонов systemd.
/etc/systemd/system/repmgrd_db1.service

[Unit]
Description=repmgrd_db1
After=syslog.target
After=network.target

[Service]
Type=forking
Restart=on-failure
RestartSec=10
User=postgres
Group=postgres
TimeoutStopSec=5
ExecStart=/usr/lib/postgresql/11/bin/repmgrd -d --config-file /etc/repmgrd_db1.conf --pid-file=/var/run/repmgr/repmgrd_db1.pid
StandardOutput=syslog
StandardError=syslog
PIDFile=/var/run/repmgr/repmgrd_db1.pid

[Install]
WantedBy=multi-user.target

/etc/systemd/system/repmgrd_db2.service

[Unit]
Description=repmgrd db2
After=syslog.target
After=network.target

[Service]
Type=forking
Restart=on-failure
RestartSec=10
User=postgres
Group=postgres
TimeoutStopSec=5
ExecStart=/usr/lib/postgresql/11/bin/repmgrd -d --config-file /etc/repmgrd_db2.conf --pid-file=/var/run/repmgr/repmgrd_db2.pid
StandardOutput=syslog
StandardError=syslog
PIDFile=/var/run/repmgr/repmgrd_db2.pid

[Install]
WantedBy=multi-user.target

Создайте конфиг директории для PID.
/usr/lib/tmpfiles.d/repmgr.conf

d /run/repmgr 2775 postgres postgres -

Создайте директорию для PID.

systemd-tmpfiles --create

Включите и запустите оба демона.

systemctl enable repmgrd_db1
systemctl restart repmgrd_db1
systemctl enable repmgrd_db2
systemctl restart repmgrd_db2

Проверьте, что демоны работают

ps aux | grep repmgrd

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

su - postgres
repmgr -f /etc/repmgrd_db1.conf cluster show
repmgr -f /etc/repmgrd_db2.conf cluster show

В части 4 мы настроим barman и сделаем кластер высоко доступным.

4 комментария к “Отказоустойчивый PostgreSQL кластер. Часть 3. Auto-failover. Демоны repmgr.”

  1. Создайте конфиг директории для PID.
    /usr/lib/tmpfiles.d/repmgr.conf

    d /run/repmgr 2775 postgres postgres —

    Вот тут ошибка

    1. Не могли бы вы уточнить в чём именно вы увидели ошибку? С ходу не вижу ничего необычного в этом месте.

  2. там где строка начинается с буквы d
    мне потребовалось сделать mkdir /var/run/repmgr/ чтобы нормально запуститься.

    1. Вероятно, вы пропустили следующую команду:

      systemd-tmpfiles --create

      Если нет, то выглядит очень странно.

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

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