Часть 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 и сделаем кластер высоко доступным.
Создайте конфиг директории для PID.
/usr/lib/tmpfiles.d/repmgr.conf
d /run/repmgr 2775 postgres postgres —
Вот тут ошибка
Не могли бы вы уточнить в чём именно вы увидели ошибку? С ходу не вижу ничего необычного в этом месте.
там где строка начинается с буквы d
мне потребовалось сделать mkdir /var/run/repmgr/ чтобы нормально запуститься.
Вероятно, вы пропустили следующую команду:
Если нет, то выглядит очень странно.