Ich habe mehrere PostgreSQL-Server für eine Webanwendung. In der Regel ein Master und mehrere Slaves im Hot-Standby-Modus (asynchrone Streaming-Replikation).
Ich verwende PGBouncer für das Verbindungs-Pooling: eine Instanz, die auf jedem PG-Server (Port 6432) installiert ist und eine Verbindung zur Datenbank auf localhost herstellt. Ich verwende den Transaktionspoolmodus.
Um meine schreibgeschützten Verbindungen auf Slaves auszugleichen, verwende ich HAProxy (v1.5) mit einer Konfiguration, die ungefähr so aussieht:
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
Meine Webanwendung stellt also eine Verbindung zu Haproxy (Port 10001) her, das die Verbindungen auf mehreren pgbouncern ausgleicht, die auf jedem PG-Slave konfiguriert sind.
Hier ist ein Repräsentationsdiagramm meiner aktuellen Architektur:
Das funktioniert ganz gut so, aber ich stelle fest, dass einige dies ganz anders implementieren: Die Webanwendung stellt eine Verbindung zu einer einzelnen PGBouncer-Instanz her, die eine Verbindung zu HAproxy herstellt und die Last über mehrere PG-Server ausgleicht:
Was ist der beste Ansatz? Der erste (mein aktueller) oder der zweite? Gibt es Vorteile einer Lösung gegenüber der anderen?
Vielen Dank