Tengo varios servidores PostgreSQL para una aplicación web. Por lo general, un maestro y varios esclavos en modo de espera activa (replicación de transmisión asíncrona).
Uso PGBouncer para la agrupación de conexiones: una instancia instalada en cada servidor PG (puerto 6432) que se conecta a la base de datos en localhost. Yo uso el modo de grupo de transacciones.
Para equilibrar la carga de mis conexiones de solo lectura en esclavos, uso HAProxy (v1.5) con una configuración más o menos así:
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
Entonces, mi aplicación web se conecta a haproxy (puerto 10001), que conecta las conexiones de equilibrio en múltiples pgbouncer configurados en cada esclavo PG.
Aquí hay un gráfico de representación de mi arquitectura actual:
Esto funciona bastante bien así, pero me doy cuenta de que algunos implementan esto de manera bastante diferente: la aplicación web se conecta a una sola instancia de PGBouncer que se conecta a HAproxy que equilibra la carga en varios servidores PG:
¿Cuál es el mejor enfoque? ¿El primero (el actual) o el segundo? ¿Hay alguna ventaja de una solución sobre la otra?
Gracias
fuente