У мене є кілька серверів PostgreSQL для веб-програми. Зазвичай один ведучий і кілька підлеглих в режимі гарячого очікування (асинхронна потокова реплікація).
Я використовую PGBouncer для об'єднання з'єднань: один екземпляр, встановлений на кожному PG-сервері (порт 6432), що підключається до бази даних на localhost. Я використовую режим пулу транзакцій.
Для того щоб завантажити баланс моїх з’єднань лише для читання на рабах, я використовую HAProxy (v1.5) з конфіденційності більш-менш, як це:
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
Отже, мій веб-додаток підключається до haproxy (порт 10001), який підключає баланс навантаження на декількох pgbouncer, налаштованих на кожному PG-підлеглому.
Ось графік представлення моєї поточної архітектури:
Це працює досить добре, як це, але я розумію, що деякі реалізують це зовсім інакше: веб-додаток підключається до одного екземпляра PGBouncer, який підключається до HAproxy, який балансує навантаження на декількох серверах PG:
Який найкращий підхід? Перший (мій поточний) чи другий? Чи є переваги одного рішення над іншим?
Спасибі