Что такое PgBouncer и для чего он используется?

«Что такое PgBouncer и для чего он используется?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PgBouncer — это легковесный, высокопроизводительный пулер соединений и менеджер транзакций для PostgreSQL. Его основная задача в DevOps-практике — снизить нагрузку на сервер БД, переиспользуя ограниченный набор долгоживущих соединений с PostgreSQL для обслуживания множества короткоживущих соединений от клиентских приложений.

Проблема, которую он решает: Каждое новое соединение к PostgreSQL создает отдельный системный процесс (postgres), что потребляет память (~10-20 МБ) и создает нагрузку на ЦП при установке. Для высоконагруженных приложений с сотнями одновременных запросов это неприемлемо.

Режимы пулинга PgBouncer:

  1. Сессионный (Session): Соединение из пула привязывается к клиенту на всю его сессию. Наиболее консервативный режим.
  2. Транзакционный (Transaction): Наиболее популярный режим. Соединение возвращается в пул сразу после завершения транзакции (COMMIT или ROLLBACK). Это позволяет обслуживать тысячи клиентов десятками соединений к БД.
  3. Оперативный (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 соединений к реальному серверу БД, эффективно управляя нагрузкой.