Общие сведения
В данной инструкции описывается установка pgbouncer и схема разворачивания в отказоустойчивом варианте. При выходе из строя одного из сервера с pgbouncer, другой сервер будет принимать его ip адрес и конфигурационный файл
Настройка балансировки PostgreSQL
Устанавливаем pcs pacemaker corosync на всех серверах
yum install pcs pacemaker corosync
Задаем пароль для пользователя hacluster на обоих серверах
passwd hacluster
Запускаем и добавляем в автозагрузку службу pcsd на обоих серверах
systemctl enable --now pcsd
Проверяем состояние серверов и производим предварительную регистрацию на сервере №1
sudo pcs cluster auth c7node1 c7node2
Создаем кластер на сервере №1
sudo pcs cluster setup --name mycluster c7node1 c7node2 --force
Запускаем кластер на сервере 1
sudo pcs cluster start
Устанавливаем pgbouncer на обоих серверах
yum install pgbouncer
Задаем дополнительные параметры
sudo pcs property set stonith-enabled=false sudo pcs property set no-quorum-policy=ignore
Делаем кластер доступным
sudo pcs cluster enable --all
Добавляем службы в автозагрузку
sudo systemctl enable pcsd && sudo systemctl enable corosync && sudo systemctl enable pacemaker sudo systemctl start pcsd && sudo systemctl start corosync && sudo systemctl start pacemaker
Добавить\изменить настройка в файле /etc/pgbouncer/pgbouncer.ini на Node1 и Node2
listen_addr = * listen_port = 6432 auth_type = trust auth_file = /etc/pgbouncer/userlist.txt #idp2 - пользователь для созданной вручную БД idp2 ( например для приложения FAM) admin_users = postgres, repmgr, idp2 stats_users = stats, postgres, repmgr, idp2 pool_mode = session max_client_conn = 5000 %include /etc/pgbouncer/pgbouncer.database.ini
Создаем файл nano /etc/pgbouncer/pgbouncer.database.ini на Node1 и Node2
[databases] #БД приложения, хост текущей мастер ноды idp2= host=i-independent-node1-mashkov
Создаем файл nano /etc/pgbouncer/userlist.txt , заполняем пользователями БД
"idp" "idp" "postgres" "postgres"
Создаем директорию scripts
mkdir /opt/scripts
Создаем скрипт для автоматической подстановки нового конфига с настройками подключения к БД и делаем владельца пользователя postgres
nano /opt/scripts/pgbouncer_promote.sh#!/usr/bin/env bash set -e set -u function try() { [[ $- = *e* ]]; SAVED_OPT_E=$? set +e } function throw() { exit $1 } function catch() { export ex_code=$? (( $SAVED_OPT_E )) && set +e return $ex_code } function throwErrors() { set -e } function ignoreErrors() { set +e } ######################################## PGBOUNCER_DATABASE_INI_NEW="/tmp/pgbouncer.database.ini" #ip-адрес или dns-имя серверов в кластере Postgres PGBOUNCER_HOSTS="10.10.180.56 10.10.180.59" #БД приложения DATABASES="idp2" # Pause pgbouncer for h in ${PGBOUNCER_HOSTS} do for d in ${DATABASES} do try (psql -U postgres -h ${h} -p 6432 pgbouncer -tc "pause ${d}") done done # Promote server /usr/pgsql-12/bin/repmgr -f /opt/repmgr/repmgr.conf standby promote # Generate new config file for pgbouncer echo -e "[databases]\n" > ${PGBOUNCER_DATABASE_INI_NEW} for d in ${DATABASES} do echo -e "${d}= host=$(hostname -f)\n" >> ${PGBOUNCER_DATABASE_INI_NEW} done # Copy new config file, reload and resume pgbouncer for h in ${PGBOUNCER_HOSTS} do for d in ${DATABASES} do try (rsync -a ${PGBOUNCER_DATABASE_INI_NEW} ${h}:/etc/pgbouncer/pgbouncer.database.ini) try (psql -U postgres -h ${h} -p 6432 pgbouncer -tc "reload") try (psql -U postgres -h ${h} -p 6432 pgbouncer -tc "resume ${d}") done done rm ${PGBOUNCER_DATABASE_INI_NEW}