ru

PgBouncer пуллинг соединений для PostgreSQL

PgBouncer - самый популярный connection pooler для PostgreSQL. Решает критическую проблему: каждое соединение Postgres использует ~10 MB RAM и forking процесс, поэтому при 1000 клиентских соединений сервер падает. PgBouncer держит небольшой pool 25-100 серверных соединений и мультиплексирует между ними тысячи клиентов. Хостинг PgBouncer + Postgres на NVMe VPS.

Need this done for your project?

We implement, you ship. Async, documented, done in days.

Start a Brief

Почему PostgreSQL плохо масштабируется по соединениям

В отличие от MySQL (thread-based) или MongoDB (event-based), PostgreSQL использует process-per-connection архитектуру. Каждое клиентское соединение - отдельный OS-процесс с своим адресным пространством, ~10 MB shared memory оверхед, переключение контекста CPU при каждом запросе. На малых нагрузках это даёт изоляцию и стабильность. На больших нагрузках это катастрофа. 1000 соединений - уже 10 GB RAM только под Postgres backends, плюс работа основного executor-а. 10000 соединений - физически невозможно без огромного железа. Реальная проблема - современные веб-приложения с auto-scaling могут иметь сотни инстансов, каждый держит pool 10-20 соединений. Без pooler-а Postgres падает. PgBouncer мультиплексирует тысячи клиентов через 25-100 серверных соединений. Один Postgres backend обслуживает много клиентов последовательно (transaction pooling) или параллельно через query slicing.

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

PgBouncer поддерживает три режима. Session pooling - клиент держит соединение всё время сессии. Безопасно, но не даёт прироста по соединениям. Используется когда клиент использует временные таблицы, prepared statements, advisory locks. Transaction pooling - клиент получает соединение только на время транзакции, после COMMIT возвращает в pool. Большинство приложений работают в этом режиме. Прирост в 10-100 раз по числу клиентов. Ограничения: нельзя использовать prepared statements (с PgBouncer 1.21+ можно), временные таблицы, SET command вне транзакции. Statement pooling - соединение возвращается после каждого SQL statement. Только для read-only без транзакций. Очень редко используется. Для типичного веб-приложения transaction pooling даёт оптимальный баланс. Pool size настраивается per-database и per-user.

Развёртывание и мониторинг

PgBouncer - крошечный single-threaded демон на C, 1 MB бинарника. Обрабатывает 10-50k req/sec на одном ядре. Конфигурируется через pgbouncer.ini: список баз с pool settings, список users с auth_type (MD5, SCRAM, trust), max_client_conn (десятки тысяч), default_pool_size (25-100), reserve_pool_size для пиков. Аутентификация через userlist.txt с хешами паролей, или через PostgreSQL pg_authid lookup. Мониторинг через специальные SHOW команды: SHOW POOLS показывает использование, SHOW STATS - запросы в секунду, SHOW CLIENTS - кто сейчас подключён. Метрики экспортируются в Prometheus через pgbouncer_exporter. Для high availability ставим 2 PgBouncer в active-active с HAProxy перед ними. Стандартная конфигурация: PgBouncer на том же VPS что и Postgres, доступ через localhost socket для минимизации overhead.

Why Anubiz Host

100% async — no calls, no meetings
Delivered in days, not weeks
Full documentation included
Production-grade from day one
Security-first approach
Post-delivery support included

Ready to get started?

Skip the research. Tell us what you need, and we'll scope it, implement it, and hand it back — fully documented and production-ready.

Anubiz Chat AI

Online