Выбор pool_mode в PgBouncer и базовое определение размеров
PostgreSQLPgBouncerКоманда
; /etc/pgbouncer/pgbouncer.ini
[databases]
appdb = host=<primary_host> port=5432 dbname=appdb pool_mode=transaction
reportdb = host=<primary_host> port=5432 dbname=appdb pool_mode=session
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 5000
default_pool_size = 20
reserve_pool_size = 5
max_prepared_statements = 200
query_wait_timeout = 120Что делает
Режим session привязывает клиента к одному серверному подключению на всё время его подключения; режим transaction выделяет серверное подключение только на время транзакции и обслуживает тысячи клиентов десятками подключений PostgreSQL; режим statement возвращает подключение после каждого запроса и запрещает транзакции из нескольких операторов. pool_mode можно также переопределить для каждой базы данных.
Когда использовать
Режим transaction — для OLTP/микросервисных приложений, открывающих много короткоживущих подключений; режим session — для работы, зависящей от состояния сессии (отчёты, миграции, сервисы с LISTEN).
Внимание
В режиме transaction состояние сессии между транзакциями не сохраняется: SET (кроме SET LOCAL), advisory-блокировки уровня сессии, LISTEN, курсоры WITH HOLD, временные таблицы между транзакциями и PREPARE на уровне SQL ненадёжны. Prepared statements на уровне протокола поддерживаются только в PgBouncer 1.21+ при max_prepared_statements > 0 (по умолчанию 200 начиная с 1.24, 0 до этого). default_pool_size, умноженный на число пар (база данных, пользователь), не должен превышать max_connections PostgreSQL (за вычетом запаса superuser_reserved_connections).