LINUX.ORG.RU
ФорумAdmin

HAProxy балансировка PostgreSQL не работает external-check

 ,


0

1

Хочу настроить 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 отключал - не помогло.

Беглым взглядом зацепился за то что у вас указан

chroot      /var/lib/haproxy

и при этом вы пытаетесь вызвать

external-check command /tmp/check_postgresql_master.sh

Попробуйте положить файл в /var/lib/haproxy и указать его в конфиге:

external-check command /var/lib/haproxy/check_postgresql_master.sh

Если что, я не знаток балансировки на HAProxy, просто мимо проходил и глаз зацепился.

Obezyan
()

при запуске скрипта вручную всё работает

Что-нибудь с переменными среды типа PATH?

Запускать как /bin/bash -lc /tmp/check_postgresql_master.sh и/или прописать в начале #!/usr/bin/env bash ?

sanyo1234
()
Последнее исправление: sanyo1234 (всего исправлений: 2)