PgDoorman vs PgBouncer vs Odyssey vs PgCat

Практическая матрица фич для выбора пулера соединений PostgreSQL. PgDoorman нацелен на нагрузки, где важны prepared statements в транзакционном режиме, многопоточная производительность и удобство эксплуатации.

Числа бенчмарков — см. Benchmarks.

Аутентификация

ФичаPgDoormanPgBouncerOdyssey
MD5 парольДаДаДа
SCRAM-SHA-256 (клиент)ДаДаДа
Passthrough SCRAM-SHA-256 (без пароля в открытом виде в конфиге)ДаНетДа
Passthrough MD5ДаДаДа
auth_query (динамические пользователи)ДаДаДа
Режим passthrough в auth_query (per-user идентичность бэкенда)ДаНетДа
Формат pg_hba.confДа (файл или inline)НетНачиная с 1.4
PAMДа (Linux)Да (HBA)Да
JWT (RSA-SHA256)ДаНетНет
Talos (кастомный JWT с извлечением роли)ДаНетНет
LDAPНетНачиная с 1.25Да
SCRAM channel binding (scram-sha-256-plus)НетДаДа
Маппинг имён пользователей (cert/peer → DB user)НетНачиная с 1.23Да
Настраиваемый scram_iterationsНетНачиная с 1.25Нет

См. Аутентификация.

TLS

ФичаPgDoormanPgBouncerOdyssey
Client-side TLS (4 режима: disable, allow, require, verify-full)ДаДаДа
Server-side TLS к PostgreSQL (6 режимов, включая verify-ca, verify-full)ДаДаНет
mTLS к PostgreSQL (клиентский сертификат)ДаДаНет
Горячая перезагрузка TLS-сертификатов по SIGHUPДа (server-side)НетНет
Минимум TLS 1.2 + список шифров MozillaДаДаНет (разрешает TLS 1.0)
Direct TLS handshake (PG17, без SSLRequest)НетНачиная с 1.25Нет
Управление шифрами TLS 1.3НетНачиная с 1.25Нет

См. TLS.

Маршрутизация и высокая доступность

ФичаPgDoormanPgBouncerOdyssey
Patroni-assisted fallback (встроенный поиск через /cluster)ДаНетНет
Встроенный TCP-прокси с маршрутизацией по ролям (patroni_proxy)ДаНетНет
Защита от отставания репликиДа (max_lag_in_bytes в patroni_proxy)НетДа (watchdog-запрос)
Round-robin / least-connections для нескольких хостовДа (patroni_proxy)Начиная с 1.24Да
target_session_attrs (read-write / read-only)Да (через роли в patroni_proxy)НетДа
Последовательная маршрутизация (правила по порядку)НетНетДа
Маршрутизация по типу соединения (TCP vs UNIX)НетНетДа
Выбор хоста с учётом availability zoneНетНетДа

См. Patroni-assisted fallback, patroni_proxy.

Пулинг

ФичаPgDoormanPgBouncerOdyssey
Режимы пула (transaction, session)ДаДа (+ statement)Да
Pool Coordinator (cross-user max_db_connections с приоритетным вытеснением)ДаНет (без вытеснения)Нет
Резервный пул с min_guaranteed_pool_sizeДаТолько reserveНет
Опережающая замена при истечении server_lifetimeДаНетНет
Опережающее создание / burst scaling (scaling_warm_pool_ratio, быстрые retry)ДаНетНет
Direct-handoff (ожидающий получает возвращаемое соединение за микросекунды)ДаНетНет
min_pool_size (прогретые соединения)ДаНетДа
Кэш prepared statements (двухуровневый, query interner, statement remap)ДаНачиная с 1.21Начиная с 1.3
Умный DISCARD при возвратеRESET ALL + сброс кэшаНетДа (авто)
Прикрепление LISTEN / NOTIFY в транзакционном режимеНетНетЭкспериментально
Cross-rule ограничение соединений (shared_pool)НетНетНачиная с 1.5.1
PAUSE / RESUME / RECONNECTДаДаДа (1.4.1+)

См. Pool Coordinator, Пул под нагрузкой.

Лимиты и таймауты

ФичаPgDoormanPgBouncerOdyssey
server_idle_check_timeout (проверка перед выдачей)ДаНетНет
idle_timeout (серверное соединение)ДаДаДа
server_lifetimeДаДаДа
query_wait_timeoutДаДаДа
client_idle_timeoutНетНачиная с 1.24Нет
transaction_timeoutНетНачиная с 1.25Нет
max_user_client_connectionsНетНачиная с 1.24Нет
Per-user query_timeoutНетНачиная с 1.24Нет
Per-user reserve_pool_sizeНетНачиная с 1.24Нет
query_wait_notify (NOTICE при ожидании бэкенда)НетНачиная с 1.25Да (pool_notice_after_waiting_ms)

См. Справочник по general settings, Справочник по pool settings.

Observability

ФичаPgDoormanPgBouncerOdyssey
Встроенный Prometheus-эндпоинтДаВнешний (pgbouncer_exporter)Да
Перцентили задержки на пул (p50, p90, p95, p99)Да (HDR Histogram)НетДа (TDigest)
Счётчики prepared statements в статистикеДаНачиная с 1.24Нет
JSON структурированное логированиеДа (--log-format Structured)НетДа
Управление уровнем логирования в рантайме (SET log_level)ДаНетНет
Admin SHOW POOL_COORDINATOR / SHOW POOL_SCALING / SHOW SOCKETSДаНетНет
Admin SHOW PREPARED_STATEMENTSДаНетНет
Admin SHOW HOSTS (CPU/память хоста)НетНетДа
Admin SHOW RULES (дамп маршрутизации)НетНетДа
Метрики TLS-соединений (длительность handshake, ошибки, активные)Да (server-side)НетНет
Метрики Patroni APIДаНетНет
Метрики fallback (флаг активности, текущий хост, попадания)ДаНетНет

См. Справочник по Prometheus-метрикам, Admin-команды.

Эксплуатация

ФичаPgDoormanPgBouncerOdyssey
Graceful binary upgrade (zero-downtime, in-flight клиенты сохраняются)ДаОграниченно (SO_REUSEPORT)Нет
YAML конфигДаНет (INI)Нет (свой формат)
TOML конфигДа (legacy)НетНет
Человекочитаемые длительности и размеры (30s, 1h, 256MB)ДаНетНет
Режим проверки конфига (pg_doorman -t)ДаНетНет
Авто-конфиг из PostgreSQL (pg_doorman generate --host)ДаНетНет
Перезагрузка по SIGHUPДа (включая server TLS-сертификаты)ДаДа
Интеграция с systemd sd-notifyДа (Type=notify)НетНет
Лимит памяти (max_memory_usage)ДаНетНет

См. Binary upgrade, Сигналы.

Протокол

ФичаPgDoormanPgBouncerOdyssey
Simple queryДаДаДа
Extended queryДаДаЧастично
Pipelined batchesДаДаЧастично
Async FlushДаДаНет
Cancel-запросы поверх TLSДаДаДа
COPY IN / COPY OUTДаДаДа
Проброс replication-соединений (replication=true в startup)НетНачиная с 1.23Нет
Поддержка версии протокола 3.2НетНачиная с 1.23Нет
server_drop_on_cached_plan_errorНетНетНачиная с 1.5.1

Когда PgDoorman не подходит

  • Нужна аутентификация LDAP. Используйте Odyssey или PgBouncer 1.25+.
  • Нужен SCRAM channel binding (scram-sha-256-plus) end-to-end. Используйте PgBouncer или Odyssey.
  • Нужна сквозная replication для инструментов логической репликации. Используйте PgBouncer 1.23+.
  • Нужна маршрутизация с учётом availability zone или последовательные правила в стиле pg_hba. Используйте Odyssey.
  • Нужно, чтобы transaction_timeout принудительно применялся пулером. Используйте PgBouncer 1.25+.

Если важны prepared statements в транзакционном режиме, Patroni HA без внешних прокси, многопоточный throughput и перезапуски без простоя — PgDoorman подходит ближе.