PgBouncer, Pgpool-II и другие: Посредник для PostgreSQL 🐘
Опубликовано 30.10.2025
Прокси или пулер соединений PostgreSQL — это приложение-посредник, которое находится между вашими клиентскими приложениями и одним или несколькими серверами PostgreSQL. Оно использует сетевой протокол PostgreSQL, что позволяет любому стандартному клиенту (например, вашему веб-серверу или приложению на Java/Python/Go) подключаться к посреднику, считая, что он общается напрямую с сервером PostgreSQL.
В отличие от MySQL, где прокси часто применяются для разделения запросов на чтение/запись (R/W split) или кэширования, в мире PostgreSQL основная задача посредника — эффективное управление соединениями.
Проблема: “Process per Connection” в PostgreSQL
PostgreSQL исторически использует модель process per connection, где на каждое новое клиентское соединение создается отдельный процесс postgres.
Это надежная, но ресурсоемкая модель: каждый процесс потребляет примерно 10–20 МБ RAM, плюс накладные расходы на fork/exec.
Если ваше приложение открывает сотни или тысячи коротких соединений (например, микросервисы, FaaS, веб-приложения), сервер БД перегружается:
растёт нагрузка на CPU от fork, исчерпывается память, соединения “затыкаются”.
Решение — connection pooling. Именно этим занимаются PgBouncer, Pgpool-II, Odyssey и их аналоги.
Как работает посредник для PostgreSQL
В базовой конфигурации пулер просто перенаправляет запросы от клиента к серверу PostgreSQL. Но его ключевая функция — мультиплексирование соединений:
Прием — клиентское приложение подключается к пулеру (например, PgBouncer).
Ожидание — пулер держит готовый пул реальных соединений с сервером PostgreSQL (уже аутентифицированных).
Маршрутизация — при запросе клиента:
- пулер берет свободное соединение из пула;
- выполняет транзакцию клиента;
- возвращает соединение обратно в пул, сбрасывая состояние.
Ответ — результат возвращается клиенту.
Итог: тысячи клиентских “легких” соединений обрабатываются десятками “тяжелых” соединений к базе. Экономия ресурсов — в десятки раз.
Основные функции и задачи
| Категория | Задачи | Примеры применения |
|---|---|---|
| Оптимизация | Пулинг соединений (мультиплексирование) | Снижение нагрузки от тысяч клиентов |
| Масштабируемость | Read/Write Split, балансировка нагрузки | SELECT → реплики, INSERT/UPDATE → мастер |
| Доступность | Failover, мониторинг состояния серверов | Автоматическое переключение при сбое мастера |
| Безопасность | Управление аутентификацией, TLS termination | Централизованные пользователи, шифрование |
Некоторые прокси также поддерживают query caching, сбор статистики и экспортеры для Prometheus.
Типы посредников для PostgreSQL
1. Легковесные пулеры соединений (Layer 7, не SQL-aware)
Они понимают протокол PostgreSQL, но не парсят SQL-запросы. Главная цель — быстрое мультиплексирование с минимальной задержкой (<1 мс).
| Пулер | Основные функции | Режимы пулинга | Read/Write Split | Failover | Активная поддержка |
|---|---|---|---|---|---|
| PgBouncer | Самый популярный. Легкий (~5MB RAM), быстрый, стабильный. Поддержка pause/resume, online restart. | ✅ Session, Transaction, Statement | ❌ Нет | ❌ Нет | ✅ Да |
| Odyssey | От Yandex, теперь open-source. Многопоточный (epoll), масштабируется на 100k+ соединений. | ✅ Session, Transaction | ❌ Нет | ❌ Нет (graceful shutdown) | ✅ Да |
| PgCat | Новый (Rust, 2023+). Высокопроизводительный, встроенные метрики, поддержка шардов. | ✅ Transaction, Session | ✅ Basic | ❌ Нет | ✅ Да |
Режимы пулинга:
- Session — соединение держится до дисконнекта (удобно, но не экономит ресурсы).
- Transaction — соединение выдается на время транзакции (BEGIN…COMMIT). Оптимальный баланс.
- Statement — соединение на один запрос (максимальная экономия, но строгие ограничения).
2. SQL-aware прокси (понимают SQL)
Они разбирают SQL-трафик, что позволяет делать R/W split, кэширование и анализ запросов.
| Прокси | Основные функции | Пулинг | Read/Write Split | Failover (HA) | Шардинг | Поддержка |
|---|---|---|---|---|---|---|
| Pgpool-II | “Комбайн”: пулинг, R/W split, query cache, watchdog для HA. | ✅ Да | ✅ Да | ✅ Да | ❌ Нет | ✅ Да |
| Heimdall Data | Облачный proxy с кэшированием и авто R/W split. | ✅ Да | ✅ Да (advanced) | ✅ Да | ❌ Нет | ✅ Да (коммерческий) |
| Citus (Coordinator) | Расширение для горизонтального шардинга. | ❌ Нет (внутренний) | ✅ (внутренний) | ✅ (внутренний) | ✅ Да | ✅ Да |
3. TCP/Layer 4 прокси (не понимают протокол)
| Прокси | Описание | Ограничения |
|---|---|---|
| HAProxy | Высокопроизводительный TCP/HTTP балансировщик. Может проверять состояние PostgreSQL. | Не умеет R/W split без внешних подсказок |
| Keepalived | Управляет VIP для HA. Используется вместе с PgBouncer/Pgpool. | Нет SQL-интеллекта |
| Envoy | Современный сервис-меш прокси с поддержкой Postgres-протокола (experimental). | Высокая сложность и overhead |
Примеры конфигураций
PgBouncer (пулинг транзакций)
[databases]
my_app_db = host=127.0.0.1 port=5432 dbname=real_db_name
[pgbouncer]
listen_port = 6432
listen_addr = *
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction ; Рекомендуемый режим
max_client_conn = 2000
default_pool_size = 20 ; Подбирайте под RAM/CPU (~10–50 на ядро)
reserve_pool_size = 5
Pgpool-II (R/W split и HA)
listen_addresses = '*'
port = 9999
enable_pooling = on
num_init_children = 32
max_pool = 4
backend_hostname0 = 'primary_host'
backend_port0 = 5432
backend_weight0 = 1.0
backend_hostname1 = 'replica_host'
backend_port1 = 5432
backend_weight1 = 1.0
load_balance_mode = on
primary_node_id = 0
watchdog_enable = on
Odyssey (многопоточный YAML-конфиг)
daemonize: false
pid_file_path: /tmp/odyssey.pid
listeners:
- host: 0.0.0.0
port: 6432
database: my_app_db
users:
- name: app_user
password: secret
pool_size: 20
pool_mode: transaction
storage:
- name: postgres
type: remote
hosts:
- host: 127.0.0.1
port: 5432
Как выбрать инструмент
| Задача | Рекомендация | Почему |
|---|---|---|
| Просто снизить нагрузку от соединений | PgBouncer | Легкий, быстрый, стандарт индустрии |
| R/W split + HA в одном решении | Pgpool-II | “Комбайн”: пулинг, балансировка, кэш |
| Масштабирование 100k+ соединений | Odyssey или PgCat | Многопоточность и высокая производительность |
| Горизонтальный шардинг | Citus | Распределённый PostgreSQL |
| Cloud-native инфраструктура | Cloud SQL Proxy или ProxySQL | Интеграция с IAM и auto-scaling |
| Простая балансировка TCP | HAProxy + Patroni | Надёжная отказоустойчивость мастера |
Best Practices
- Мониторинг: используйте
SHOW STATS;(PgBouncer) или Prometheus-экспортеры. - Размер пула:
default_pool_size = (RAM / 20MB) / databases, но не больше 100–200 на сервер. - Безопасность: включите
sslmode=requireи терминируйте TLS в пулере. - Нагрузка: тестируйте через
pgbench, добиваясь <5 мс задержки. - Kubernetes: ставьте PgBouncer как sidecar, HAProxy — как DaemonSet.
Заключение
В экосистеме PostgreSQL пулер соединений — не опция, а необходимость для любой высоконагруженной системы (100+ RPS).
- Начинайте с PgBouncer — он решает 90% проблем с соединениями.
- Используйте Pgpool-II, если нужен встроенный R/W split и query cache.
- Применяйте Odyssey или PgCat для современных масштабных сетапов.
- Добавьте HAProxy + Patroni, если требуется HA и репликация на уровне TCP.
С правильно выбранным посредником ваш PostgreSQL выдержит тысячи клиентов и останется спокойным, как слон 🐘.
Отзывы по теме
Михаил очень оперативно помог настроить работу сайта. Сам бы я точно провозился весь день. Приятно, когда профессионал помогает экономить твое время и делает работу на высоком уровне. Рекомендую!
N_Konstantin · Настройка vps, настройка сервера
Освоившийся покупатель21.10.2025 · ⭐ 5/5
Михаил очень оперативно помог настроить работу сайта. Сам бы я точно провозился весь день. Приятно, когда профессионал помогает экономить твое время и делает работу на высоком уровне. Рекомендую!
Самый квалифицированный и крутой спец нающий толк в своем деле
Alexeyvodopyanov · Настройка vps, настройка сервера
Опытный покупатель21.10.2025 · ⭐ 5/5
Самый квалифицированный и крутой спец нающий толк в своем деле
Все быстро качественно
Alexeyvodopyanov · Настройка vps, настройка сервера
Опытный покупатель16.10.2025 · ⭐ 5/5
Все быстро качественно
Задача была выполнена за 30 минут ! Рекомендую !
fedinseo · Настройка vps, настройка сервера
Очень мощный покупатель15.10.2025 · ⭐ 5/5
Задача была выполнена за 30 минут ! Рекомендую !
Михаил - великолепный исполнитель! Чувствуется, что человек с огромным опытом. Работа была сделано четко, в срок. Пришлось повозиться из-за неидеальности проекта, который устанавливали на сервер, но Михаил внимательно и вдумчиво подсказывал как и что сделать. В итоге все заработало! Всем рекомендую для кого, важно качество работы!
N_Konstantin · Настройка vps, настройка сервера
Освоившийся покупатель10.10.2025 · ⭐ 5/5
Михаил - великолепный исполнитель! Чувствуется, что человек с огромным опытом. Работа была сделано четко, в срок. Пришлось повозиться из-за неидеальности проекта, который устанавливали на сервер, но Михаил внимательно и вдумчиво подсказывал как и что сделать. В итоге все заработало! Всем рекомендую для кого, важно качество работы!
Все супер, как всегда! Быстро, четко и по делу. Спасибо!
Dina_Perova · Настройка vps, настройка сервера
Освоившийся покупатель18.09.2025 · ⭐ 5/5
Все супер, как всегда! Быстро, четко и по делу. Спасибо!