Современные веб‑приложения и микросервисы часто сталкиваются с проблемой: число подключений к базе данных резко растет. Когда система масштабируется, количество запросов от клиентов может достигать тысяч в секунду. А в PostgreSQL каждое такое подключение запускает отдельный серверный процесс.
В итоге:
- быстро исчерпывается лимит одновременных сессий (параметр max_connections);
- процессор перегружается из‑за постоянных операций по установлению соединений и аутентификации;
- приложение начинает работать медленнее ― время отклика растет из‑за очередей на подключение;
- память используется неэффективно, поскольку многие соединения либо простаивают, либо задействуются лишь время от времени.
На первый взгляд, нужно просто увеличить параметр max_connections. Но это только ухудшает ситуацию: рост числа соединений ведет к резкому увеличению потребления памяти (5-10 МБ на каждое подключение), перегрузке CPU из‑за переключений между процессами и, как следствие, потере стабильности системы даже при умеренной нагрузке.
А решить эту проблему помогают пулеры соединений. Дальше мы расскажем, что это такое и как начать работать с PgBouncer.
Что такое пулер соединений
Пулер соединений ― это промежуточный сервис, который управляет подключениями клиентов к базе данных и переиспользует уже открытые соединения вместо создания новых при каждом запросе.
В обычной схеме работы приложение при обращении к базе данных устанавливает соединение, выполняет запрос и закрывает его. На практике такие операции происходят сотни и тысячи раз в секунду. Каждый цикл «создать → аутентифицироваться → выполнить → закрыть» требует времени и ресурсов сервера базы данных. При высокой нагрузке это приводит к:
- росту потребления CPU и памяти;
- увеличению времени отклика;
- исчерпанию лимита подключений;
- нестабильной работе приложения.
Пулер соединений решает эту проблему за счет создания пула ― набора заранее открытых соединений с базой данных. Приложения получают соединение не напрямую от сервера, а из этого пула. После выполнения запроса соединение возвращается обратно и может быть использовано повторно другим клиентом.
Принцип работы прост:
- Клиент подключается к пулеру, а не напрямую к PostgreSQL.
- Пулер проверяет наличие свободного соединения в пуле с нужными параметрами.
- Если соединение есть ― передает его клиенту; если нет ― создает новое или ставит запрос в очередь.
- После завершения работы клиента физическое подключение возвращается в пул, а не закрывается.
Один из самых популярных инструментов для PostgreSQL ― PgBouncer.

Что такое PgBouncer
PgBouncer ― это легкий и высокопроизводительный пулер соединений для PostgreSQL, который предназначен для снижения нагрузки на сервер базы данных за счет эффективного управления подключениями клиентов.
Он работает как промежуточный слой между приложением и PostgreSQL: клиенты подключаются не напрямую к серверу базы данных, а к PgBouncer. Сервис поддерживает пул заранее открытых соединений и распределяет их между клиентами по мере необходимости. Благодаря этому количество реальных подключений к PostgreSQL остается стабильным даже при резком росте числа клиентских соединений.
Основная задача PgBouncer ― минимизировать издержки на установку и разрыв соединений. В PostgreSQL процесс создания подключения требует выделения отдельных системных ресурсов, поэтому при высокой нагрузке большое число одновременных соединений может привести к росту потребления памяти и снижению производительности. PgBouncer позволяет ограничить и контролировать это количество, обеспечивая более предсказуемую и стабильную работу базы данных.
Его часто используют на серверах с ограниченной производительностью, в высоконагруженных веб-проектах и в микросервисной архитектуре.
Преимущества пуллинга
Пулинг соединений стабилизирует работу базы данных при высокой нагрузке. Система использует ограниченный набор готовых подключений вместо того, чтобы постоянно открывать и закрывать новые, ― это экономит ресурсы и сохраняет производительность.
Кроме того, он:
- снижает нагрузку на сервер БД за счет уменьшения числа физических подключений;
- экономит оперативную память, позволяя одному соединению обслуживать множество клиентов;
- ускоряет отклик приложения благодаря исключению накладных расходов на установление новых соединений;
- обеспечивает контроль нагрузки, не допуская превышения лимита max_connections;
- повышает масштабируемость системы при тех же аппаратных ресурсах;
- стабилизирует работу системы за счет равномерного распределения подключений и управления очередями;
- не требует изменений в коде клиентских приложений;
- позволяет гибко настраивать параметры пула под конкретные требования;
- улучшает утилизацию ресурсов за счет повторного использования простаивающих соединений;
- снижает риск сбоев из-за исчерпания лимита подключений.

Подготовка к установке PgBouncer
Перед установкой PgBouncer нужно подготовить сервер: он будет работать между приложением и PostgreSQL. Значит, нужен стабильный сервер с достаточным объемом оперативной памяти, настроенной сетью и доступом к базе данных.
Если вы разворачиваете инфраструктуру с нуля, удобно использовать облачные решения Рег.облака. Платформа позволяет быстро создать виртуальный сервер с нужной конфигурацией, выбрать подходящий объем CPU и RAM, а также гибко масштабировать ресурсы по мере роста нагрузки. Это особенно актуально для проектов, где важно контролировать количество соединений и обеспечивать стабильную работу PostgreSQL при пиковых обращениях.
Для установки PgBouncer потребуется:
- сервер с установленной PostgreSQL;
- доступ по SSH с правами администратора;
- открытые сетевые порты для подключения клиентов;
- обновленная система и настроенный брандмауэр.
Далее мы покажем процесс установки и настройки PgBouncer на Ubuntu и Debian.
Если вы не хотите самостоятельно администрировать PostgreSQL, обратите внимание на Managed Databases от Рег.облако. Это сервис управляемых баз данных, который берет на себя установку, настройку, резервное копирование и мониторинг PostgreSQL. Вам останется только подключить PgBouncer к готовому инстансу и сосредоточиться на оптимизации пула соединений, а не на обслуживании сервера БД.
Установка PgBouncer
Устанавливать PgBouncer будем на Ubuntu 24.04 через официальный репозиторий. Этот способ позволит получать актуальные версии пакета и обновления безопасности.
Сначала установите необходимые утилиты для работы с репозиториями и сертификатами:
|
1 |
sudo apt install curl ca-certificates |
Создайте каталог для хранения ключа подписи репозитория:
|
1 |
sudo install -d /usr/share/postgresql-common/pgdg |
Импортируйте официальный ключ PGDG:
|
1 |
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc |
Добавьте репозиторий PostgreSQL в систему:
|
1 |
sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' |
Обновите список пакетов, чтобы система начала использовать новый репозиторий:
|
1 |
sudo apt update |
Установите PgBouncer:
|
1 |
sudo apt install pgbouncer -y |

Настройка PgBouncer и подключение к PostgreSQL
Теперь необходимо выполнить базовую настройку PgBouncer и разрешить ему доступ к серверу PostgreSQL.
Откройте файл /etc/pgbouncer/pgbouncer.ini и укажите параметры подключения к серверу базы данных в секции [databases]:
|
1 2 |
[databases] * = host=POSTGRESQL_IP port=POSTGRESQL_PORT |
Вместо POSTGRESQL_IP укажите IP-адрес сервера PostgreSQL, а вместо POSTGRESQL_PORT ― порт (по умолчанию 5432).
Вы также можете изменить параметр listen_addr, чтобы PgBouncer принимал подключения по TCP. Например, значение * позволит слушать соединения на всех сетевых интерфейсах. Кроме того, можно указать конкретный список IP-адресов.
Далее создайте или отредактируйте файл /etc/pgbouncer/userlist.txt. В нем перечисляются пользователи, которым разрешено подключаться через PgBouncer:
|
1 |
"USERNAME" "" |
Замените USERNAME на имя пользователя PostgreSQL. В тестовой среде можно оставить пароль пустым ― если используется метод аутентификации trust. Но в продакшене так делать не стоит: выберите более безопасный метод.
Теперь добавьте IP-адрес сервера PgBouncer в файл pg_hba.conf PostgreSQL:
|
1 |
host all all PGBOUNCER_IP/NETMASK trust |
Где PGBOUNCER_IP ― IP-адрес сервера, где установлен PgBouncer, а NETMASK ― соответствующая маска сети.
Прописав изменения, перезапустите или перезагрузите PostgreSQL, чтобы новые правила вступили в силу.
Также перезагрузите сервис PgBouncer:
|
1 |
systemctl reload pgbouncer.service |
Теперь можно проверить подключение к базе данных через PgBouncer. По умолчанию он работает на порту 6432:
|
1 |
psql -h PGBOUNCER_IP -U USERNAME -d DATABASE -p 6432 |
Если параметры указаны корректно, соединение с PostgreSQL будет установлено через пулер.

Настройка аутентификации в PgBouncer
По умолчанию PgBouncer работает в режиме trust ― он пропускает подключения без проверки пароля. Для тестов это допустимо, но в рабочей среде такой способ небезопасен.
Лучше переключиться на метод HBA: он дает возможность гибко настраивать правила доступа ― указывать разрешенные IP‑адреса и выбирать способы аутентификации. Это существенно повышает безопасность системы.
В файле /etc/pgbouncer/pgbouncer.ini измените параметры:
|
1 2 3 |
[pgbouncer] auth_type = hba auth_hba_file = /etc/pgbouncer/pb_hba.conf |
Далее создайте файл /etc/pgbouncer/pb_hba.conf со следующими правилами:
|
1 2 3 4 5 6 7 8 9 10 |
# TYPE DATABASE USER ADDRESS METHOD # IPv4 local connections: host all all 127.0.0.1/32 scram-sha-256 # IPv6 local connections: host all all ::1/128 scram-sha-256 # Application host all all APPLICATION_IP/NETMASK scram-sha-256 |
Создайте или отредактируйте файл /etc/pgbouncer/userlist.txt, в котором указываются пользователи и их пароли:
|
1 2 3 |
"username1" "password" "username2" "md5abcdef012342345" "username3" "SCRAM-SHA-256$:$:" |
Можно использовать обычный пароль, MD5-хеш или SCRAM-хеш. Для продакшена предпочтителен scram-sha-256.
Хешированные пароли можно получить в PostgreSQL из таблицы pg_shadow:
|
1 |
SELECT usename, passwd FROM pg_shadow; |
Далее добавьте IP-адрес сервера PgBouncer в файл pg_hba.conf PostgreSQL:
|
1 |
host all all PGBOUNCER_IP/NETMASK scram-sha-256 |
Внеся изменения в pg_hba.conf, перезагрузите или перезапустите PostgreSQL, а затем примените изменения в PgBouncer:
|
1 |
sudo systemctl reload pgbouncer.service |

Рекомендуемые параметры конфигурации PgBouncer
Чтобы PgBouncer работал эффективно, важно правильно задать базовые параметры. Рассмотрим основные настройки для рабочей среды.
pool_mode
Определяет режим пуллинга. Может задаваться глобально или для конкретной базы. По умолчанию используется session.
|
1 |
pool_mode = session |
Доступные значения:
- session ― соединение закрепляется за клиентом на все время сессии;
- transaction ― соединение выделяется только на время транзакции;
- statement ― соединение используется для выполнения одного запроса.
Для большинства высоконагруженных веб-приложений выбирают transaction, так как он обеспечивает лучший баланс между производительностью и совместимостью.
max_client_conn
Определяет максимальное количество клиентских подключений к PgBouncer. По умолчанию ― 100.
|
1 |
max_client_conn = 1000 |
Этот параметр задает лимит на количество входящих соединений. Если установить слишком маленькое значение, новые подключения будут отклоняться. На практике лимит обычно выставляют с запасом, а фактическую нагрузку регулируют через параметр pool_size.
Формула расчета ресурсов:
|
1 |
max_client_conn + (max_pool_size × количество<em>баз × количество</em>пользователей) |
Если планируется большое количество соединений, необходимо увеличить лимит файловых дескрипторов в системе.
reserve_pool_size
Позволяет использовать резервный пул соединений, если основной pool_size исчерпан. По умолчанию ― 0.
|
1 |
reserve_pool_size = 10 |
Рекомендуется задавать значение в диапазоне 5-10. Когда PgBouncer задействует резервный пул соединений, он фиксирует это в логах. Анализируя их, можно понять, нужно ли увеличивать параметр pool_size.
application_name_add_host
Добавляет IP-адрес и порт клиента к параметру application_name. По умолчанию ― 0.
|
1 |
application_name_add_host = 1 |
Полезно при диагностике, так как подключение через PgBouncer скрывает реальный IP клиента от PostgreSQL.
server_round_robin
Определяет алгоритм повторного использования серверных соединений. По умолчанию PgBouncer использует LIFO (last-in, first-out).
|
1 |
server_round_robin = 1 |
Если за IP‑адресом PostgreSQL стоит балансировщик с алгоритмом round‑robin, этот параметр поможет распределять нагрузку равномернее и улучшит работу соединений.
PgBouncer управляет соединениями, но сами данные хранятся в PostgreSQL. Чтобы защитить их от сбоев, настройте регулярное резервное копирование. Сервис резервного копирования Рег.облако автоматически создаёт снапшоты ваших серверов и баз данных по гибкому расписанию.

Подключение к административной консоли PgBouncer
Чтобы управлять PgBouncer, нужно подключиться к его служебной базе данных pgbouncer через программу psql. Для этого сначала установите клиент PostgreSQL. Рекомендуется использовать актуальную стабильную версию ― например, PostgreSQL 18:
|
1 |
sudo apt install postgresql-client-18 |
Далее необходимо назначить администратора, который сможет подключаться к базе pgbouncer. Откройте файл /etc/pgbouncer/pgbouncer.ini и укажите параметр:
|
1 |
admin_users = pgbouncer |
Где pgbouncer ― имя пользователя, которому разрешен доступ к административной консоли. При необходимости можно указать несколько пользователей через запятую.
Перезагрузите сервис:
|
1 |
sudo systemctl reload pgbouncer.service |
Теперь можно подключиться к административной базе PgBouncer:
|
1 |
psql -h 127.0.0.1 -U pgbouncer -d pgbouncer -p 6432 |
Если все настроено корректно, откроется консоль управления PgBouncer, где доступны команды для просмотра пулов соединений, статистики и текущих подключений.

Полезные команды административной консоли PgBouncer
Через psql можно подключиться к базе pgbouncer и управлять пулером с помощью специальных команд. Они позволяют следить за нагрузкой, проверять соединения и обслуживать сервер:
| Команда | Назначение |
|---|---|
| SHOW HELP; | Выводит справку по доступным командам |
| SHOW STATS; | Показывает статистику: количество транзакций, время выполнения и другую служебную информацию |
| SHOW POOLS; | Отображает активных и ожидающих клиентов, количество серверных соединений, а также время ожидания самого «старого» клиента; помогает подобрать оптимальный pool_size |
| SHOW SERVERS; | Показывает информацию о соединениях PgBouncer с PostgreSQL |
| SHOW CLIENTS; | Отображает данные о клиентах, подключенных через PgBouncer |
| SHOW DATABASES; | Выводит список настроенных баз данных и параметры подключения |
| PAUSE [DB]; | Приостанавливает подключения к указанной базе: PgBouncer ждет завершения текущих запросов и ставит новые соединения в очередь; полезно при перезапуске PostgreSQL |
| RESUME [DB]; | Возобновляет работу базы после PAUSE, KILL или SUSPEND |
| RECONNECT [DB]; | Закрывает и заново устанавливает все серверные соединения; используется при смене мастера или переключении ноды; |
| DISABLE [DB]; | Запрещает новые подключения к указанной базе |
| ENABLE [DB]; | Снова разрешает подключения после выполнения DISABLE |
| KILL [DB]; | Разрывает все клиентские и серверные соединения и приостанавливает работу базы |
| RELOAD; | Перечитывает конфигурацию PgBouncer без остановки сервиса |
| SHUTDOWN; | Завершает процесс PgBouncer; в рабочей среде предпочтительно использовать systemd |
Онлайн-перезапуск PgBouncer
PgBouncer может перезапускаться без разрыва клиентских подключений. Как это работает: запускается новый процесс, который принимает соединения от старого. Когда все подключения переданы, старый процесс завершается ― а новый продолжает работать.
Этот способ полезен при обновлении PgBouncer или изменении конфигурации в рабочей среде, где важно избежать простоя и разрыва клиентских подключений.
Чтобы выполнить онлайн-перезапуск, пропишите команду:
|
1 |
sudo -u postgres pgbouncer -R /etc/pgbouncer/pgbouncer.ini -d |
Заключение
Итак, в этой статье мы рассмотрели, как установить и запустить PgBouncer для PostgreSQL на Linux.
PgBouncer помогает стабилизировать работу PostgreSQL при высокой нагрузке, снизить потребление ресурсов и избежать проблем с лимитом подключений. Грамотно настроенный пул соединений делает поведение системы более предсказуемым и упрощает масштабирование.
При дальнейшем развитии системы стоит регулярно анализировать статистику соединений и корректировать параметры конфигурации с учетом реальной нагрузки. В долгосрочной перспективе это обеспечит стабильную и эффективную работу PostgreSQL.
Блок FAQ
Что такое PgBouncer?
PgBouncer ― это легкий пулер соединений для PostgreSQL, который управляет подключениями клиентов к базе данных и повторно использует уже открытые соединения.
Зачем нужен пулер соединений?
Пулер соединений снижает нагрузку на сервер, ограничивает количество одновременных подключений и повышает стабильность работы при высокой нагрузке.
Какие режимы пуллинга существуют?
В PgBouncer есть три режима пуллинга:
- session ― соединение закрепляется за клиентом на все время сессии;
- transaction ― соединение выделяется только на время транзакции;
- statement ― соединение используется для выполнения одного запроса.
Чем короче удержание соединения, тем выше эффективность, но ниже совместимость с некоторыми функциями PostgreSQL.
Где находится конфигурация PgBouncer?
Основной конфигурационный файл PgBouncer располагается по пути /etc/pgbouncer/pgbouncer.ini.
Как подключить PostgreSQL к PgBouncer?
Нужно указать параметры PostgreSQL в /etc/pgbouncer/pgbouncer.ini в секции [databases], например:
|
1 2 3 4 5 6 7 8 9 10 |
[databases] * = host=POSTGRESQL_IP port=5432 Затем перезагрузить PgBouncer: sudo systemctl reload pgbouncer И подключаться к базе через PgBouncer на порту 6432: psql -h PGBOUNCER_IP -U USER -d DB -p 6432 |
Поддерживает ли PgBouncer SSL?
Да, PgBouncer поддерживает SSL. Можно настроить шифрование как между клиентом и PgBouncer, так и между PgBouncer и PostgreSQL. Для этого в pgbouncer.ini указываются параметры client_tls_* и server_tls_*, а также сертификаты и ключи.
Как проверить активные соединения?
Подключитесь к административной базе pgbouncer и выполните:
|
1 |
SHOW POOLS; |
Команда покажет активных и ожидающих клиентов, количество серверных соединений и загрузку пула.
Дополнительно можно использовать:
|
1 2 3 |
SHOW CLIENTS; SHOW SERVERS; SHOW STATS; |
Как PgBouncer влияет на производительность?
PgBouncer повышает производительность за счет повторного использования соединений. Он уменьшает нагрузку на PostgreSQL, снижает потребление памяти и CPU, ускоряет обработку коротких запросов и предотвращает переполнение лимита подключений.
Есть ли ограничения у PgBouncer?
Да, PgBouncer есть ряд ограничений:
- в режимах transaction и statement не поддерживаются некоторые функции (например, временные таблицы и часть подготовленных запросов);
- не подходит для приложений, где соединение должно быть закреплено за клиентом постоянно;
- не может распределять нагрузку между серверами и не управляет репликацией;
- требует корректной настройки пула и лимитов, иначе возможны очереди и задержки.
Но если грамотно настроить PgBouncer, эти ограничения обычно не мешают работе большинства веб‑приложений.
Как обновлять PgBouncer?
Обновить PgBouncer можно через пакетный менеджер:
|
1 2 |
sudo apt update sudo apt upgrade pgbouncer |
После обновления перезапустите сервис:
|
1 |
sudo systemctl restart pgbouncer |
Чтобы избежать разрыва соединений, можно выполнить онлайн-перезапуск:
|
1 |
sudo -u postgres pgbouncer -R /etc/pgbouncer/pgbouncer.ini -d |