Minha configuração do haproxy é a seguinte, no back-end existe o cluster pg_autoctl, outra VM (bunty4) hospeda o monitor e o haproxy está instalado nele.
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
Isso funciona bem:
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.
Quando tento conectar a porta frontend 7000 (através do pgadmin ou cli) dá um erro:
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.
Não sei por que, haproxy.log não vomita nada.
Nesta configuração do ouvinte haproxy da porta 7000 no balanceador não há back-ends, em vez disso, ele tem
stats enable
. Isso significa que é reservado para mostrar estatísticas haproxy . No entanto, ele está configurado incorretamente para estar no modo TCP; página de estatísticas requer http. Portanto, configure-omode http
e tente conectar-se a bunty4:7000 com o navegador da web. Ele mostrará uma boa página da web de estatísticas.Parece que psql ou outros clientes PostgreSQL devem se conectar à porta haproxy (bunty4) 5000 para gravação e leitura ou porta 5001 para leitura. No entanto, a lógica exata por trás dessas portas está oculta no serviço na porta 23267, que decide de alguma forma se sua instância é somente leitura ou leitura-gravação e relata o status correspondente 206 ou 200; pelo que você mostrou, não é evidente qual é o papel dessas portas. Seus nomes são as únicas dicas.
Também não entendo por que servidores diferentes hospedam o serviço em portas diferentes. Isso torna a configuração de back-end menos simétrica e, portanto, é ruim, porque eles devem ser clones exatos um do outro. Para mim, é natural hospedar o PostgreSQL na porta padrão 5432 se for o único serviço na máquina, o que parece ser verdade para todos os três servidores de back-end.