Описание

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

Полезные ссылки