TLDR Настраиваем пул соединений к PostgreSQL с PgBouncer by eax.me
Минимальный сетап и на что обратить внимание
Типичные веб-приложения создают по несколько соединений к СУБД на каждый HTTP-запрос :-\
PostgreSQL не очень хорошо справляется с большим (условно, больше 100) количеством соединений из-за архитектуры «один процесс на соединение». На помощь приходит PgBouncer.
Пример /etc/pgbouncer/pgbouncer.ini
; When server connection is released back to pool:
; session - after client disconnects
; transaction - after transaction finishes
; statement - after statement finishes
pool_mode = transaction
По умолчанию session
— сессия будет удерживаться за клиентом до тех пор, пока он не закроет соединение. Чаще всего лучше использовать transaction
— соединение возвращается в пул после завершения транзакции. При statement
соединение освободится после каждого отдельного выражения, чего вы почти наверняка не должны хотеть.
максимальное количество клиентских соединений — ставим 1000:
; total number of clients that can connect
max_client_conn = 1000
Важно!
auth_type
по умолчанию — trust
— будет пускать в базы всех без пароля. Вы почти наверняка этого не хотите. Меняем на md5
; any, trust, plain, crypt, md5, cert, hba, pam
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
Админка PgBouncer
В pgbouncer.ini
; comma-separated list of users, who are allowed to change settings
admin_users = eax
Тогда входим так:
psql -p 6432 -U eax pgbouncer
Проверяем, что все работает, запустив pgbench с 900 соединенинями:
pgbench -i
pgbench -p 6432 -c 900 -C -T 60 -P 1
Если все было сделано правильно, а выполнив в админке SHOW CLIENTS;
увидим 900 соединений. При этом ps uax | grep postgres
покажет только 20 бэкендов / процессов PostgreSQL.
Ура!
okmeter.io — мониторинг, который покажет всё всё про Postgres и PgBouncer.