Развертывание пулера соединений PgBouncer: режимы session, transaction, statement
- Ошибка
FATAL: sorry, too many clients alreadyпри всплеске пользовательских сессий. - Сотни процессов
postgres: client backendутилизируют всю оперативную память сервера. - Ошибки
PREPARE statement already existsили сбои временных таблиц при использовании режима Transaction Pooling.
1. Конфигурация /etc/pgbouncer/pgbouncer.ini
[databases]
* = host=127.0.0.1 port=5432 auth_user=postgres
[pgbouncer]
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
# --- Выбор режима пулинга ---
# session: полное соответствие поведению прямого подключения (рекомендовано для 1С)
# transaction: максимальная плотность соединений (требует отключения server-side prepared statements)
pool_mode = session
# --- Лимиты соединений ---
max_client_conn = 2000 # Максимум входящих клиентских подключений к PgBouncer
default_pool_size = 50 # Лимит реальных бэкенд-соединений к PostgreSQL на одну базу
min_pool_size = 10
reserve_pool_size = 5
max_db_connections = 150 # Суммарный лимит соединений к конкретной БД2. Создание файла пользователей /etc/pgbouncer/userlist.txt
"postgres" "SCRAM-SHA-256$4096:5x...=="
"enterprise_user" "SCRAM-SHA-256$4096:a8...=="3. Диагностика пулов и очередей через административную консоль
psql -p 6432 -U postgres -d pgbouncer
-- Просмотр очередей клиентов и свободных бэкенд-серверов
SHOW POOLS;
-- Статистика соединений и трафика
SHOW STATS;
-- Просмотр активных клиентских сокетов
SHOW CLIENTS; Частые вопросы (FAQ)
Почему для платформы 1С:Предприятие рекомендуется использовать pool_mode = session?
1С активно использует временные таблицы (#tt), переменные сессии и блокировки на уровне сеанса. В режиме transaction пул может вернуть разные серверные соединения на два последовательных запроса одной транзакции, что приведет к потере контекста временных таблиц.
Как работает режим transaction pooling?
Серверное соединение выдается клиенту только на время выполнения одной транзакции (от BEGIN до COMMIT) и немедленно возвращается в общий пул, позволяя обслуживать тысячи клиентов несколькими десятками бэкендов.
Что означает статус 'cl_waiting' в выводе команды SHOW POOLS?
Количество клиентских запросов, ожидающих освобождения серверного подключения в пуле. Рост этого показателя указывает на нехватку default_pool_size или долгие блокировки в базе.
Как применить изменения в pgbouncer.ini без разрыва клиентских сессий?
Подключитесь к консоли pgbouncer и выполните команду RELOAD; либо отправьте сигнал процессу: kill -HUP <pgbouncer_pid>.