PostgreSQL на каждое соединение форкает отдельный backend-процесс — при сотнях коротких подключений (веб-запросы, serverless-функции) это съедает память и CPU на сам факт подключения, ещё до первого запроса. pgbouncer держит пул готовых соединений к базе и раздаёт их клиентам.

[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb

[pgbouncer]
listen_port = 6432
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20

Режимы pool_mode:

  • session — за клиентом до disconnect, совместимо со всем (advisory locks, prepared statements)
  • transaction — на время транзакции, самый экономный, но ломает session-level фичи
  • statement — на один запрос, только для read-only трафика
psql -h 127.0.0.1 -p 6432 -U app mydb   # подключение через pgbouncer, не напрямую в базу

#postgresql #dba