Хочу настроить High Available кластер PostgreSQL. Использую repmgr и логическую репликацию. Перед кластером ставлю HAProxy, чтобы клиент цеплялся всегда к одному адресу, а дальше его уже перебрасывало на текущий Master. Использую такой скрипт для определения кто сейчас Master:
#!/bin/bash
PG_MONITOR_USER=haproxy
PG_MONITOR_PASS=qwerty123
PG_MONITOR_DB=haproxy
PG_PSQL=/usr/bin/psql
VIP=$1
VPT=$2
RIP=$3
echo "We are here" >> /tmp/logs.txt
if [ "$4" == "" ]; then
RPT=$VPT
else
RPT=$4
fi
STATUS=$(PGPASSWORD="$PG_MONITOR_PASS" $PG_PSQL -qtAX -c "select pg_is_in_recovery()" -h "$RIP" -p "$RPT" --dbname="$PG_MONITOR_DB" --username="$PG_MONITOR_USER")
if [ "$STATUS" == "f" ]; then
# Master
exit 0
else
exit 1
fi
Пользователя в базе создал, при запуске скрипта вручную всё работает.
HAProxy сконфигурировал следующим образом:
global
log /var/lib/haproxy/dev/log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
external-check
defaults
log global
option dontlognull
retries 3
timeout queue 1m
timeout connect 10s
timeout check 10s
timeout client 5000s
timeout server 5000s
maxconn 3000
frontend pg_frontend
log global
mode tcp
bind *:5432
default_backend pg_backend
backend pg_backend
log global
mode tcp
option tcplog
option external-check
external-check command /tmp/check_postgresql_master.sh
server pg1 192.168.56.2:5432 check inter 30s fall 3 rise 3
server pg2 192.168.56.3:5432 backup check inter 30s fall 3 rise 3
Если попытаться подключиться на адрес HAProxy, то сервер сразу закрывает соединение и ничего не пишет в логи. Если закомментировать external-check
, то все работает.
Почему такое может быть? Дистрибутив Rocky 8, PostgreSQL 14, HAProxy из репозиториев. SELinux отключал - не помогло.