У меня есть несколько серверов PostgreSQL для веб-приложения. Обычно один ведущий и несколько ведомых в режиме горячего резервирования (асинхронная потоковая репликация).
Я использую PGBouncer для пула соединений: один экземпляр установлен на каждом сервере PG (порт 6432), подключающемся к базе данных на локальном хосте. Я использую режим пула транзакций.
Для балансировки нагрузки моих подключений только для чтения на ведомых устройствах я использую HAProxy (v1.5) с conf более или менее следующим образом:
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:
Какой лучший подход? Первый (мой текущий) или второй? Есть ли какие-то преимущества у одного решения над другим?
Благодарность
источник