Eu tenho vários servidores PostgreSQL para uma aplicação web. Normalmente, um mestre e vários escravos no modo de espera ativa (replicação de streaming assíncrona).
Uso o PGBouncer para o pool de conexões: uma instância instalada em cada servidor PG (porta 6432) conectando-se ao banco de dados no host local. Eu uso o modo de pool de transações.
Para balancear a carga de minhas conexões somente leitura em escravos, eu uso o HAProxy (v1.5) com um conf mais ou menos assim:
listen pgsql_pool 0.0.0.0:10001
mode tcp
option pgsql-check user ha
balance roundrobin
server master 10.0.0.1:6432 check backup
server slave1 10.0.0.2:6432 check
server slave2 10.0.0.3:6432 check
server slave3 10.0.0.4:6432 check
Portanto, meu aplicativo da Web se conecta ao haproxy (porta 10001), que conexões de balanceamento de carga em vários pgbouncer configurados em cada escravo PG.
Aqui está um gráfico de representação da minha arquitetura atual:
Isso funciona muito bem assim, mas percebo que alguns implementam isso de maneira bem diferente: o aplicativo da web se conecta a uma única instância do PGBouncer que se conecta ao HAproxy, que balança a carga em vários servidores PG:
Qual é a melhor abordagem? O primeiro (meu atual) ou o segundo? Existem vantagens de uma solução em relação à outra?
obrigado
fonte