Пулинг соединений: PgBouncer
Запускайте PgBouncer в режиме пулинга транзакций, правильно рассчитывайте размеры пулов и избегайте ловушки подготовленных операторов
«Пулинг соединений: PgBouncer» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем нужны пулы соединений
Каждое соединение PostgreSQL — это отдельный процесс OS, требующий много памяти и CPU. Приложения, которые открывают и закрывают соединение для каждого запроса, быстро исчерпывают ресурсы сервера. Пул соединений повторно использует небольшой набор долгоживущих соединений.
Стоимость одного соединения
Обычный серверный процесс PostgreSQL использует 5–10 MB RAM. 500 соединений — это около 5 GB RAM только для серверных процессов. PgBouncer может мультиплексировать тысячи клиентов через 50 серверных соединений.
Три режима пулинга
- Сеансовый — клиент получает выделенное соединение на весь сеанс
- Транзакционный — клиент получает соединение для каждой транзакции
- Операторный — соединение для каждого оператора (используется редко)
Транзакционный режим (рекомендуется)
Каждая транзакция получает соединение с сервером. Один и тот же клиент может использовать разные соединения в разных транзакциях.
# pgbouncer.ini
[databases]
mydb = host=primary port=5432 dbname=mydb
[pgbouncer]
pool_mode = transaction
listen_port = 6432
max_client_conn = 1000
default_pool_size = 50Ограничения транзакционного режима
Функции, которым требуется состояние сеанса, перестают работать:
- Подготовленные операторы (для последовательных вызовов нужен один и тот же серверный процесс)
- SET LOCAL ... (режим для одной транзакции подходит; SET ... с сохранением состояния между транзакциями — нет)
- LISTEN / NOTIFY (требуется постоянное соединение)
- Курсоры, существующие дольше одной транзакции
Сеансовый режим
Используйте его, когда транзакционный режим нарушает работу приложения, но учтите, что одновременно подключённых клиентов будет меньше.
Настройка размера пулов
Эвристическое правило: default_pool_size ≈ vCPU count × 2 + spindles. Слишком большое значение — переключение контекста снижает пропускную способность; слишком маленькое — клиенты ждут пул.
PgBouncer перед HAProxy
Типичный стек для рабочей среды:
App → HAProxy (read/write routing) → PgBouncer (pooling) → Postgres
Подготовленные операторы в транзакционном режиме
Новые версии PgBouncer (1.21+) поддерживают подготовленные операторы на уровне протокола в транзакционном режиме. В старых версиях используйте простые запросы или сеансовый режим.
Мониторинг PgBouncer
Подключитесь к административной базе данных (специальной базе):
psql -p 6432 -U pgbouncer pgbouncer
-- Commands:
SHOW STATS;
SHOW POOLS;
SHOW CLIENTS;
SHOW SERVERS;Альтернативы
- pgpool-II — пулинг, балансировка нагрузки и переписывание запросов
- Odyssey — пулер Yandex с поддержкой нескольких потоков
- Пулы на стороне драйвера — обычно объединяются с PgBouncer для пулинга на уровне кластера
Пул приложения и PgBouncer
Обычно приложения используют собственный пул соединений (HikariCP, pgxpool) И проходят через PgBouncer. Это двухуровневый пулинг: пул приложения поддерживает соединения с пулером, а пулер мультиплексирует их через PostgreSQL.
Итоги
PgBouncer необходим при любом нетривиальном масштабе.
- Транзакционный режим — стандарт
- Следите за подготовленными операторами, SET и LISTEN
- Размер пула — примерно vCPU × 2
- Мониторьте с помощью SHOW POOLS
Быстрая проверка
Какой режим PgBouncer мультиплексирует больше всего клиентов через наименьшее число серверных соединений?
Часто задаваемые вопросы
Урок «Пулинг соединений: PgBouncer» бесплатный?
Да — полный текст урока «Пулинг соединений: PgBouncer» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Пулинг соединений: PgBouncer»?
Запускайте PgBouncer в режиме пулинга транзакций, правильно рассчитывайте размеры пулов и избегайте ловушки подготовленных операторов Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Пулинг соединений: PgBouncer»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- pg_stat_statements: самые ресурсоёмкие запросы
- pgBadger для анализа журналов
- Пулинг соединений: PgBouncer
- Планирование ёмкости и аудит раздувания