Описание
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). Во-вторых, изменить строки подключения в других сервисах (аудит и полномочия).