Высокий параллелизм на кластере PgPool + PostgreSQL
У меня есть кластер PgPool II с 2 бэкэндами PostreSQL 9.5 (4vCores, 8 ГБ ОЗУ), выполняющими балансировку нагрузки + репликацию. Мой пример использования - это веб-сайт, который предоставляет только SSO-вход в систему / Регистрация, является относительно небольшой базой данных, запросы очень просты, но он должен поддерживать очень высокий уровень параллелизма (несколько тысяч одновременно работающих пользователей).
Прежде чем добавить дополнительные бэкэнды, я хочу убедиться, что конфигурация текущего кластера является оптимальной. Я провел некоторый тест с помощью pgbench (обычные запросы SELECT, имитирующие нормальное поведение веб-сайта), и я смог перегрузить пул соединений без особых усилий (pgbench -c 64 -j 4 -t 1000 -f query.sql), даже когда было много ЦП / ОЗУ в LB и бэкэндах.
Это соответствующие настройки:
pgPool II
listen_backlog_multiplier = 3
connection_cache = on
num_init_children = 62
max_pool = 4
child_life_time = 0
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
PostgreSQL
max_connections = 256
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 8MB
maintenance_work_mem = 512MB
min_wal_size = 1GB
max_wal_size = 2GB
checkpoint_completion_target = 0.7
wal_buffers = 16MB
default_statistics_target = 100
Увеличение num_init_children/max_pool вынудит меня увеличить max_connections на бэкэндах, но это не рекомендуется. Какие-либо предложения? Спасибо!
1 ответ
Нет никакого способа добиться большего числа одновременных подключений через Pgpool-II, чем значение num_init_children.
Значение num_init_children в Pgpool-II напрямую соответствует максимальному числу одновременных клиентских подключений, которые может обрабатывать Pgpool-II, поэтому вы не можете установить значение num_init_children ниже, чем максимальное одновременное подключение, которое вы хотите поддерживать.
Но чтобы сохранить max_connections на стороне PG, вы можете использовать меньшее значение для конфигурации max_pool. Поскольку дочерний процесс Pgpool-II открывает новое внутреннее соединение, только если запрошенная пара [пользователь, база данных] еще не находится в кэше. И если приложение использует только одного пользователя для подключения только к одной базе данных, скажем, [user1,db1], тогда вы можете установить max_pool на 1, и max_connection в бэкэнде PG должно быть равно (num_init_children +1).