Ответ
PgBouncer — это легковесный, высокопроизводительный пулер соединений и менеджер транзакций для PostgreSQL. Его основная задача в DevOps-практике — снизить нагрузку на сервер БД, переиспользуя ограниченный набор долгоживущих соединений с PostgreSQL для обслуживания множества короткоживущих соединений от клиентских приложений.
Проблема, которую он решает: Каждое новое соединение к PostgreSQL создает отдельный системный процесс (postgres), что потребляет память (~10-20 МБ) и создает нагрузку на ЦП при установке. Для высоконагруженных приложений с сотнями одновременных запросов это неприемлемо.
Режимы пулинга PgBouncer:
- Сессионный (Session): Соединение из пула привязывается к клиенту на всю его сессию. Наиболее консервативный режим.
- Транзакционный (Transaction): Наиболее популярный режим. Соединение возвращается в пул сразу после завершения транзакции (
COMMITилиROLLBACK). Это позволяет обслуживать тысячи клиентов десятками соединений к БД. - Оперативный (Statement): Соединение возвращается в пул после каждого запроса. Несовместим с многозапросными транзакциями.
Пример базовой конфигурации (pgbouncer.ini):
[databases]
myapp_prod = host=pg-primary.example.com port=5432 dbname=myapp
[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 60
server_idle_timeout = 300
log_connections = 1
log_disconnections = 1
Типичный стек развертывания: Приложение подключается не напрямую к PostgreSQL, а к PgBouncer на порту 6432. PgBouncer, в свою очередь, поддерживает фиксированный пул из 60 соединений к реальному серверу БД, эффективно управляя нагрузкой.