Ho più server PostgreSQL per un'applicazione web. In genere un master e più slave in modalità hot standby (replica streaming asincrona).
Uso PGBouncer per il pool di connessioni: un'istanza installata su ciascun server PG (porta 6432) che si collega al database su localhost. Uso la modalità pool di transazioni.
Per bilanciare il carico delle mie connessioni di sola lettura sugli slave, utilizzo HAProxy (v1.5) con una configurazione più o meno simile a questa:
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
Quindi, la mia applicazione web si connette a haproxy (porta 10001), connessioni di bilanciamento del carico su più pgbouncer configurate su ogni slave PG.
Ecco un grafico di rappresentazione della mia architettura attuale:
Funziona abbastanza bene in questo modo, ma mi rendo conto che alcuni lo implementano in modo abbastanza diverso: l'applicazione Web si collega a una singola istanza PGBouncer che si collega a HAproxy che esegue il bilanciamento del carico su più server PG:
Qual è l'approccio migliore? Il primo (il mio attuale) o il secondo? Ci sono vantaggi di una soluzione rispetto all'altra?
Grazie