Mam wiele serwerów PostgreSQL dla aplikacji sieci web. Zazwyczaj jeden master i wiele slave'ów w trybie czuwania na gorąco (asynchroniczna replikacja strumieniowa).
Używam PGBouncer do łączenia pul: jedna instancja jest instalowana na każdym serwerze PG (port 6432) łączącym się z bazą danych na localhost. Używam trybu puli transakcji.
Aby zrównoważyć obciążenie moich połączeń tylko do odczytu na urządzeniach podrzędnych, używam HAProxy (v1.5) z conf mniej więcej tak:
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
Tak więc moja aplikacja internetowa łączy się z haproxy (port 10001), że połączenia równoważenia obciążenia na wielu pgbouncerach skonfigurowanych na każdym PG slave.
Oto wykres reprezentacyjny mojej obecnej architektury:
Działa to całkiem dobrze w ten sposób, ale zdaję sobie sprawę, że niektórzy implementują to całkiem inaczej: aplikacja internetowa łączy się z pojedynczą instancją PGBouncer, która łączy się z HAproxy, która równoważy obciążenie na wielu serwerach PG:
Jakie jest najlepsze podejście? Pierwszy (mój obecny) czy drugi? Czy są jakieś zalety jednego rozwiązania nad drugim?
Dzięki