Описание
PgBouncer - это сервис, обеспечивающий connection pooling к экземпляру PostgreSQL. PgBouncer работает как посредник между приложением и базой данных, “транслируя” запросы к нужной БД в экземпляре и используя соединения из пула. В данной статье рассматривается процесс настройки PgBouncer для работы с несколькими базами данных на примере типичного Flexberry-приложения.
Установка PgBouncer
Windows
Можно использовать EDB PostgreSQL Installer и выбрать PgBouncer при установке.
Linux
Docker
Рекомендуется использовать образ edoburu/pgbouncer. Для работы образа необходимо поместить в образ файлы /etc/pgbouncer/pgbouncer.ini и /etc/pgbouncer/userlist.txt. Это можно сделать с помощью docker volumes или создав собственный Dockerfile (пример PgBouncer Dockerfile).
Конфигурация PgBouncer
Настройка PgBouncer осуществляется с помощью файла конфигурации pgbouncer.ini. Типичное Flexberry приложение включает в себя БД приложения и БД полномочий - поэтому в файле конфигурации в разделе [databases] указаны настройки для двух баз данных.
pgbouncer.ini
[databases]
appdb = host=localhost port=5432 user=appuser password=123app
securitydb = host=localhost port=5432 user=securityuser password=sec3r1ty pool_size=20
[pgbouncer]
pool_mode = transaction
listen_addr = *
listen_port = 6432
auth_file = /etc/pgbouncer/userlist.txt
auth_type = md5
admin_users = flexberryuser
logfile = pgbouncer.log
userlist.txt
"pgbounceruser" "12345"
"flexberryuser" "@dm1n"
Файл userlist.txt описывает учётные данные для подключения к PgBouncer. PgBouncer, в свою очередь, использует логин/пароль из файла конфигурации pgbouncer.ini для подключения к нужной БД. Если учётные данные не указаны в разделе [databases], используются те, что указаны в userlist.txt.
Есть возможность синхронизировать пользователей PgBouncer с пользователями БД - см. параметры
auth_file,auth_user,auth_queryв документации и пример auth_query. Альтернативный способ синхронизации - записать пользователей БД вuserlist.txt, таким образом пользователи PgBouncer будут совпадать.
Раздел databases
Раздел [databases] описывает базы данных, к которым PgBouncer подключает клиентов. В данном примере две базы: appdb и securitydb (БД приложения и БД полномочий Flexberry). Клиент должен указать нужную ему БД в строке подключения к PgBouncer (параметр Database=appdb). PgBouncer предоставит подключение из своего пула для соответствующей БД, используя учётные данные из раздела [databases] или файла userlist.txt. Для каждого пользователя в БД используется собственный пул соединений.
Для баз данных можно задавать дополнительные настройки, такие как размер пула (pool_size), количество резервных соединений (reserve_pool), максимальное число соединений для всех пулов БД (max_db_connections) и прочие.
Раздел pgbouncer
В разделе [pgbouncer] задаются общие настройки.
-
pool_mode- позволяет задать режим выделения пулов:session pooling- создавать отдельное подключение к БД для каждого подключения к PgBouncer.transaction pooling- отдельное подключение к БД выделяется только при выполнении команды (транзакции). Это предпочтительный режим в большинстве случаев.transaction poolingполезен если приложение держит “висящие” сессии в состоянииidle. В таком случае, висящее соединение к PgBouncer не будет выделять реального подключения к БД в состоянииidle.statement pooling- режим для работыautocommitв PL/Proxy.
auth_file- путь к файлу со списком пользователей для подключения к PgBouncer. Не стоит путать с пользователями для подключения к БД.auth_type- способ подключения к PgBouncer. PgBouncer имеет реализацию входа через TLS.admin_users- список пользователей, которые могут выполнять команды администратора в консоли PgBouncer.
Прочие полезные настройки:
server_lifetime- время до автоматического закрытия соединений к БД (активных и неактивных). По умолчанию1 час. Позволяет закрывать старые соединения из пула, очищая кеш (вычислимых процедур, подготовленных операторов, и т.д.). Не нарушает работу действующих соединений клиентов.server_idle_timeout- время до автоматического закрытия неактивных соединений к БД (в состоянииidle). По умолчанию10 минут.
Подключение приложения Flexberry к PgBouncer
Чтобы подключить приложение к PgBouncer, необходимо изменить строки подключения сервисов данных. Строки подключения по умолчанию задаются в файле App.config в проекте ODataBackend бекенда. Во-первых, необходимо изменить строку для подключения к PgBouncer (по умолчанию параметр DefConnStr): SERVER=localhost;Port=6432;User ID=pgbounceruser;Password=12345;Database=appdb (PgBouncer по умолчанию работает на порте 6432). Во-вторых, изменить строки подключения в других сервисах (аудит и полномочия).