Обзор
Что делает PgDoorman
PgDoorman сидит между приложениями и PostgreSQL. Для приложения он выглядит как сервер PostgreSQL (тот же wire-протокол, та же строка подключения для psql); внутри он мультиплексирует много клиентских сессий на гораздо меньший набор реальных серверных соединений.
graph LR
App1[Приложение A] --> Pooler(PgDoorman)
App2[Приложение B] --> Pooler
App3[Приложение C] --> Pooler
Pooler --> DB[(PostgreSQL)]
Изначально PgDoorman был форкнут из PgCat, но с тех пор переписан вокруг других целей: prepared statements в transaction mode, многопоточные общие пулы, интеграция с Patroni и горячая замена процесса с миграцией живых сессий. Сейчас это самостоятельная кодовая база.
Зачем вообще пулер
Каждое соединение к PostgreSQL стоит серверу около 10 МБ RAM, отдельный процесс и время на каждый handshake (auth, SCRAM, разрешение search_path). Без пулера приложение, открывающее N короткоживущих соединений в секунду, платит N×время-handshake. Пулер позволяет тем же N клиентам переиспользовать небольшой набор долгоживущих серверных соединений, и стоимость handshake оплачивается один раз на соединение с PostgreSQL, а не один раз на клиента.
Конкретные эффекты:
pool_sizeравный 40 обычно обслуживает несколько тысяч клиентских сессий для коротких OLTP-транзакций.- PostgreSQL не платит per-process memory overhead за соединения, которые иначе пришлось бы держать открытыми.
- Failover, рестарт или rolling deploy не превращаются в лавину новых auth/SCRAM handshake-ов.
Режимы пула
Серверное соединение удерживается на время одной транзакции и возвращается в пул при COMMIT или ROLLBACK. Именно в этом режиме пулинг реально окупается.
Серверное соединение удерживается на всё время клиентской сессии и возвращается только при отключении клиента. Используйте для клиентов, зависящих от состояния уровня сессии (SET TIME ZONE вне транзакции, advisory-блокировки между транзакциями, WITH HOLD курсоры).
PgDoorman не реализует statement mode. См. режимы пула — точный контракт каждого режима и что работает в transaction mode у нас, чего нет у других пулеров.
Что есть для эксплуатации
- Консоль администратора — PostgreSQL-совместимый эндпоинт для
SHOW POOLS,SHOW CLIENTS,RELOAD,PAUSE,UPGRADEи т.д. - Prometheus
/metrics— встроенный HTTP-эндпоинт с per-pool latency-перцентилями, счётчиками prepared statements, состоянием fallback и метриками TLS. - Видимость prepared-кеша —
SHOW INTERNERиSHOW POOLS_MEMORYпоказывают объём интернера и клиентскую разбивку Named / Anonymous, с парными метриками в Prometheus. pg_doorman -t— валидация конфига без запуска сервера.pg_doorman generate --host …— собрать starter-конфиг через интроспекцию существующего PostgreSQL.
См. команды администратора и Справочник Prometheus.
Куда дальше
- Установка — установить pg_doorman из пакетов, исходников или Docker.
- Базовое использование — минимальный конфиг, первое подключение, типичные грабли.
- Координатор пулов — когда одна база делится между несколькими пользовательскими пулами.
- Горячая замена процесса с переносом сессий — заменить процесс в промышленной эксплуатации и перенести мигрируемые сессии.