0Pricing
SQL Academy · Урок

Пулинг соединений: 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 — локальная установка не требуется.

Все уроки этого курса

  1. pg_stat_statements: самые ресурсоёмкие запросы
  2. pgBadger для анализа журналов
  3. Пулинг соединений: PgBouncer
  4. Планирование ёмкости и аудит раздувания
← Назад к SQL Academy