PgBouncer
Тема дорожной карты · PostgreSQL
PgBouncer — лёгкий высокопроизводительный пулер соединений для PostgreSQL, располагающийся между клиентами приложения и сервером PostgreSQL и повторно использующий небольшое число реальных серверных соединений для обслуживания значительно большего числа запросов приложения. PgBouncer поддерживает три режима пулинга: пул сеансов (серверное соединение удерживается на протяжении всего клиентского сеанса), пул транзакций (соединение возвращается в пул после каждой транзакции) и пул операторов (после каждого оператора). Пул транзакций — наиболее эффективный режим, позволяющий сотням или тысячам параллельных соединений приложений совместно использовать пул размером, который PostgreSQL может эффективно обработать, как правило согласованный с max_connections в postgresql.conf. PgBouncer администрируется через специальную виртуальную базу данных pgbouncer с помощью psql, где администраторы могут выполнять команды SHOW POOLS, SHOW STATS и RELOAD для мониторинга и управления пулером. Использование PgBouncer — стандартная практика администрирования баз данных для масштабирования развёртываний PostgreSQL за пределами ограничений соединений, определяемых памятью сервера.
Как это работает
PgBouncer мультиплексирует много app-уровневых соединений на несколько реальных Postgres-backend. Каждое соединение Postgres ест ~10MB RAM + backend-процесс; тысячи idle app-соединений вычерпывают сервер. PgBouncer (transaction-level pooling — дефолт и самый полезный) и PgCat — стандартные инструменты. App-уровневые пулы (HikariCP, pg-pool) держат сторону приложения. Комбинируйте оба слоя в серьёзном production.
Когда применять
PgBouncer — когда app pod × размер пула > max_connections Postgres. transaction-режим по дефолту; session — если приложение использует prepared statements, advisory lock или session GUC, которые должны жить. App-side pool — ~10-20 на worker; PgBouncer гасит всплески. Тестируйте pgbench -c <ожидаемая конкурентность> до запуска.
Типичные ошибки
Ловушки PgBouncer: забыли, что transaction-режим ломает prepared statements (PG 14+ имеет server-side cache, но проверьте драйвер); PgBouncer один поток на гигантском боксе (не масштабирует 32 ядра — несколько процессов или PgCat); нет мониторинга pool wait time (клиенты тихо блокируются на полном пуле). Читайте SHOW STATS PgBouncer.