HAProxy и postgres

Моя конфигурация haproxy показана ниже: на серверной стороне есть кластер pg_autoctl, на другой виртуальной машине (bunty4) размещается монитор, и на ней установлен haproxy.

      global
    maxconn 100

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode tcp
    bind *:7000
    stats enable
    stats uri /

listen ReadWrite
    bind *:5000
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server bunty1 bunty1:6001 maxconn 100 check port 23267
    server bunty2 bunty2:6002 maxconn 100 check port 23267
    server bunty3 bunty3:6003 maxconn 100 check port 23267

listen ReadOnly
    bind *:5001
    option httpchk
    http-check expect status 206
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server bunty1 bunty1:6001 maxconn 100 check port 23267
    server bunty2 bunty2:6002 maxconn 100 check port 23267
    server bunty3 bunty3:6003 maxconn 100 check port 23267

Это работает нормально:

      postgres@bunty4:~$ psql -h bunty2 -p 6002
psql (14.6 (Ubuntu 14.6-1.pgdg22.04+1))
Type "help" for help.

postgres=# \q
postgres@bunty4:~$ psql -h bunty1 -p 6001
psql (14.6 (Ubuntu 14.6-1.pgdg22.04+1))
Type "help" for help.

Когда я пытаюсь подключиться к интерфейсному порту 7000 (через pgadmin или cli), выдается ошибка:

      postgres@bunty4:~$ psql -h localhost -p 7000
psql: error: connection to server at "localhost" (127.0.0.1), port 7000 failed: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

psql -h 192.168.5.129 -p 7000   ## this also fails with same error.

Не знаю почему, haproxy.log ничего не выдает.

1 ответ

В этой конфигурации прослушиватель порта haproxy 7000 на балансировщике не имеет бэкендов, вместо этого у него естьstats enable. Это означает, что он зарезервирован для отображения статистики haproxy. Однако он неправильно настроен для работы в режиме TCP; страница статистики требует http. Так что установите его наmode httpи попробуйте подключиться к Bunty4:7000 через веб-браузер. Он покажет красивую веб-страницу со статистикой.

Кажется, psql или другие клиенты PostgreSQL должны подключаться к порту 5000 haproxy (bunty4) для записи и чтения или к порту 5001 для чтения. Однако точная логика этих портов скрыта в службе на порту 23267, которая каким-то образом решает, доступен ли его экземпляр только для чтения или для чтения и записи, и сообщает соответствующий статус 206 или 200; из того, что вы показали, неясно, какова роль этих портов. Единственные подсказки — их имена.

Также я не понимаю, почему разные серверы размещают службу на разных портах. Это делает конфигурацию бэкенда менее симметричной и, следовательно, это плохо, поскольку в идеале они должны быть точными клонами друг друга. Для меня естественно размещать PostgreSQL на порту по умолчанию 5432, если это единственная служба на машине, что, по-видимому, верно для всех трех серверных серверов.

Другие вопросы по тегам