pgbouncer

pgbouncer — пул соединений для Postgres Pro

Синтаксис

В системах Linux:

pgbouncer [-d] [-R] [-v] [-u пользователь] pgbouncer.ini

pgbouncer -V | -h

В Windows:

pgbouncer [-v] [-u пользователь] pgbouncer.ini

pgbouncer -V | -h

Для использования pgbouncer в виде службы Windows есть дополнительные аргументы:

pgbouncer.exe --regservice pgbouncer.ini

pgbouncer.exe --unregservice pgbouncer.ini

Описание #

pgbouncer — это пул соединений для Postgres Pro. Любое конечное приложение может подключиться к pgbouncer, как если бы это был непосредственно сервер Postgres Pro, и pgbouncer создаст подключение к реальному серверу либо задействует одно из ранее установленных подключений.

Предназначение pgbouncer — минимизировать издержки, связанные с установлением новых подключений к Postgres Pro.

Чтобы не нарушать семантику транзакций при переключении подключений, pgbouncer поддерживает несколько видов пулов:

Пул сеансов

Наиболее корректный метод. Когда клиент подключается, ему назначается одно серверное подключение на всё время, пока клиент остаётся подключённым. Когда клиент отключается, это подключение к серверу возвращается в пул. Этот метод работает по умолчанию.

Пул транзакций

Подключение к серверу назначается клиенту только на время транзакции. Когда pgbouncer замечает, что транзакция завершена, это подключение возвращается в пул.

Пул операторов

Наиболее агрессивный метод. Подключение к серверу будет возвращаться в пул сразу после завершения каждого запроса. Транзакции с несколькими операторами в этом режиме запрещаются, так как они не будут работать.

Административный интерфейс pgbouncer состоит из нескольких новых команд SHOW, доступных при подключении к специальной «виртуальной» базе данных pgbouncer.

Функциональность пулера соединений, наряду с другими полезными возможностями, также доступна в расширении proxima.

Быстрый запуск #

pgbouncer поставляется вместе с Postgres Pro Enterprise в виде отдельного пакета pgbouncer (подробные инструкции по установке приведены в Главе 17). Базовая настройка и использование демонстрируются ниже.

  1. Создайте файл pgbouncer.ini. Подробнее он описывается на странице man pgbouncer(5). Например:

    [databases]
    template1 = host=localhost dbname=template1 auth_user=someuser
    
    [pgbouncer]
    listen_port = 6432
    listen_addr = localhost
    auth_type = md5
    auth_file = userlist.txt
    logfile = pgbouncer.log
    pidfile = pgbouncer.pid
    admin_users = someuser
  2. Создайте файл userlist.txt со списком пользователей, которым разрешено подключение:

    "некоторый_пользователь" "его_пароль_на_сервере"
  3. Запустите pgbouncer:

    $ pgbouncer -d pgbouncer.ini

    Примечание

    Эта команда не работает в системах Windows. Вместо этого pgbouncer должен запускаться в виде службы, которую необходимо сначала зарегистрировать следующим образом:

    pgbouncer --regservice
  4. Сделайте так, чтобы ваше приложение (или клиент psql) подключалось к pgbouncer, а не к серверу Postgres Pro непосредственно:

    $ psql -p 6432 -U someuser template1
  5. Для управления pgbouncer подключитесь к специальной административной базе данных pgbouncer и выполните SHOW HELP;, чтобы ознакомиться с его справкой:

    $ psql -p 6432 -U someuser pgbouncer
    pgbouncer=# SHOW HELP;
    NOTICE:  Console usage
    DETAIL:
      SHOW [HELP|CONFIG|DATABASES|FDS|POOLS|CLIENTS|SERVERS|SOCKETS|LISTS|VERSION|...]
      SET key = arg
      RELOAD
      PAUSE
      SUSPEND
      RESUME
      SHUTDOWN
      [...]
  6. Если вы вносили изменения в файл pgbouncer.ini, его можно перезагрузить командой:

    pgbouncer=# RELOAD;

Настройка LDAP-аутентификации #

pgbouncer поддерживает LDAP-аутентификацию пользователей СУБД. LDAP-аутентификацию можно настроить с помощью PAM (Pluggable Authentication Modules, подключаемые модули аутентификации).

В этом разделе представлен пример настройки LDAP-аутентификации.

Чтобы включить LDAP-аутентификацию через pgbouncer, выполните следующие шаги:

Предварительные требования #

Прежде чем приступить к настройке LDAP, убедитесь, что все необходимые пакеты установлены. При необходимости установите недостающие пакеты.

  1. Чтобы убедиться, что установленный pgbouncer содержит библиотеку PAM (libpam), воспользуйтесь утилитой ldd:

    $ ldd /usr/sbin/pgbouncer | grep pam
    libpam.so.0 => /lib64/libpam.so.0 (0x00007fb5d6dd7000)
  2. Убедитесь, что в системе присутствует модуль pam_ldap:

    $ find / -type f -name pam_ldap.so 2>/dev/null
    /usr/lib64/security/pam_ldap.so
  3. (Необязательно) При необходимости установите pam_ldap:

    apt-get install pam_ldap

Настройка Postgres Pro #

  1. В экземпляре Postgres Pro Enterprise создайте пользователя для проверки LDAP-аутентификации:

    CREATE USER testuser WITH PASSWORD 'пароль_пользователя_testuser';
  2. В файле pg_hba.conf укажите строку подключения для пользователя testuser. Например:

    host    all    testuser    0.0.0.0/0    ldap
    ldapurl=uri_сервера_ldap
    ldapbasedn="CN=testuser,CN=Users,DC=postgrespro,DC=ru"
    ldapbinddn="CN=служебный_пользователь,CN=Users,DC=postgrespro,DC=ru"
    ldapbindpasswd="пароль_служебного_пользователя"
    ldapsearchattribute=CN

    За подробной информацией о параметрах конфигурации LDAP-аутентификации обратитесь к Разделу 20.10.

В итоге аутентификация работает следующим образом:

  1. Пользователь подключается к Postgres Pro как testuser.

  2. Postgres Pro подключается к LDAP-серверу по адресу ldapurl с помощью учётной записи ldapbinddn и пароля ldapbindpasswd.

  3. В ldapbasedn Postgres Pro ищет объект, где атрибут ldapsearchattribute — это testuser.

  4. Postgres Pro проверяет пароль testuser через LDAP.

Примечание

В продуктивной среде рекомендуется указывать контейнер или OU (OrganizationalUnitName, название отдела или подразделения) в качестве значения ldapbasedn (например CN=Users,DC=postgrespro,DC=ru), чтобы имя пользователя не жёстко прописывалось, а выполнялся его поиск через атрибут ldapsearchattribute.

Настройка pgbouncer #

  1. В файле конфигурации pgbouncer.ini укажите метод аутентификации auth_type = pam.

    Пример конфигурации pgbouncer выглядит следующим образом:

    [pgbouncer]
    listen_addr = *
    listen_port = 6500
    unix_socket_dir = /tmp/
    pool_mode = session
    max_client_conn = 15000
    default_pool_size = 5
    peer_id = 1
    so_reuseport = 1
    auth_type = pam
    admin_users=pgbouncer,testuser
    stats_users=pgbouncer,testuser
    
    [databases]
    * = host=localhost port=5432
  2. Запустите и активируйте pgbouncer:

    systemctl enable --now pgbouncer

Настройка PAM #

  1. В каталоге /etc/pam.d/ создайте отдельную конфигурацию pgbouncer со следующим содержимым:

    #%PAM-1.0
    auth required pam_ldap.so
    account required pam_ldap.so

    Описание параметров:

    • в строке auth required pam_ldap.so:

      • auth — фаза аутентификации, в ходе которой проверяется пароль пользователя.

      • required — управляющий флаг («обязательно»). Он означает, что если модуль вернёт ошибку, аутентификация не выполнится. Однако в случае успеха выполнение других строк продолжится (т.е. досрочное завершение невозможно).

      • pam_ldap.so — модуль, который взаимодействует с LDAP и проверяет указанные имя пользователя и пароль.

    • в строке account required pam_ldap.so:

      • account — фаза авторизации или учётной записи, где система проверяет, разрешён ли вход для пользователя. Учётная запись должна быть в правильном OU, не должна быть заблокирована или с истёкшим сроком действия.

      • required — управляющий флаг («обязательно»). Он означает, что если LDAP возвращает ошибку «account invalid», аутентификация не выполняется.

      • pam_ldap.so — тот же модуль LDAP. В этом случае он используется для проверки пароля, а не для проверки статуса учётной записи.

  2. Настройте файл конфигурации модуля, размещённый в /etc/pam_ldap.conf. Пример конфигурации выглядит следующим образом:

    host сервер_ldap
    base CN=Users,DC=postgrespro,DC=ru
    binddn CN=служебный_пользователь,CN=Users,DC=postgrespro,DC=ru
    bindpw пароль_служебного_пользователя
    timelimit 5
    bind_timelimit 5
    pam_login_attribute CN

    Описание параметров:

    • host — LDAP-сервер (или серверы), к которому подключается клиент.

    • base — основное уникальное имя (DN, distinguished name), с которого начинаются все поисковые запросы в каталоге.

    • binddn — уникальное имя (DN) служебной учётной записи, под которой PAM подключается к LDAP для поиска пользователей.

    • bindpw — пароль учётной записи binddn.

    • timelimit — ограничение во времени (в секундах) на выполнение LDAP-запросов.

    • bind_timelimit — тайм-аут (в секундах) для установления соединения (bind) с LDAP-сервером.

    • pam_login_attribute — атрибут LDAP-записи пользователя, который будет сравниваться с указанным именем пользователя.

Проверка подключения #

  1. Подключитесь к экземпляру СУБД через LDAP:

    psql -h 127.0.0.1 -U testuser -d postgres
  2. Подключитесь к экземпляру СУБД через pgbouncer:

    psql -h 127.0.0.1 -U testuser -d postgres -p 6500

В обоих случаях в журнале сервера должна быть запись, что в качестве метода аутентификации используется LDAP.

Параметры #

-d, --daemon

Запустить в фоновом режиме. Без этого указания процесс будет работать на переднем плане. При запуске в фоновом режиме необходимо явное указание параметра pidfile, а также logfile или syslog. В фоновом режиме сообщения не будут записываться в stderr.

Примечание

Это не работает в Windows, там pgbouncer нужно запускать в виде службы.

-R, --reboot

Примечание

Этот параметр устарел. Вместо него следует применять последовательный перезапуск с несколькими процессами pgbouncer с одним и тем же принимающим портом, используя so_reuseport.

Выполнить перезапуск на «лету». При этом pgbouncer подключается к работающему процессу, забирает у него открытые сокеты и начинает использовать их. Если активного процесса нет, он запускается в обычном режиме.

Примечание

Это работает, только если ОС поддерживает сокеты Unix и в конфигурации определён параметр unix_socket_dir. Не работает в Windows. Также при этом не поддерживаются подключения TLS, они сбрасываются.

-u пользователь, --user пользователь

Переключиться на заданного пользователя при запуске.

-v, --verbose

Увеличить детализацию вывода. Может использоваться неоднократно.

-q, --quiet

Приглушить вывод: не выводить ничего в stderr. Это не влияет на уровень выводимых сообщений, а только отключает вывод в stderr. Предназначено для применения в скриптах init.d.

-V, --version

Вывести версию.

-h, --help

Вывести короткую справку.

--regservice

Win32: Зарегистрировать pgbouncer в качестве службы Windows. Имя службы будет определяться значением параметра конфигурации service_name.

--unregservice

Win32: Разрегистрировать службу Windows.

Административная консоль #

Эта консоль доступна при обычном подключении к базе pgbouncer:

$ psql -p 6432 pgbouncer

Подключаться к этой консоли разрешено только пользователям, перечисленным в параметрах конфигурации admin_users или stats_users. (За исключением режима auth_mode=any, когда в качестве stats_user может подключиться любой пользователь.)

Кроме того, пользователю pgbouncer разрешено подключение без пароля, если это подключение устанавливается через сокет Unix и у клиента тот же uid пользователя Unix, что и у работающего процесса.

Административная консоль в настоящее время поддерживает только простой протокол запросов. Некоторые драйверы используют расширенный протокол запросов для всех команд; эти драйверы не будут работать в данном случае.

Команды вывода информации #

Команды SHOW выводят полезную информацию. Каждая команда описана ниже.

SHOW STATS #

Выводит статистику. Выводимые этой и связанными командами суммарные значения, накапливаемые с момента запуска pgbouncer, и средние значения обновляются с периодичностью stats_period.

database

База данных, для которой представлена статистика.

total_xact_count

Общее число транзакций SQL, прошедших через pgbouncer.

total_query_count

Общее число команд SQL, прошедших через pgbouncer.

total_server_assignment_count

Общее число раз, когда серверное подключение было назначено клиенту.

total_received

Общий объём сетевого трафика (в байтах), который получил pgbouncer.

total_sent

Общий объём сетевого трафика (в байтах), который передал pgbouncer.

total_xact_time

Общее время (в микросекундах), в течение которого pgbouncer использовал подключения к Postgres Pro, выполняя запросы или простаивая.

total_query_time

Общее время (в микросекундах), в течение которого pgbouncer активно использовал подключения к Postgres Pro, выполняя запросы.

total_wait_time

Среднее время ожидания ответов сервера в течение секунды (в микросекундах). Сбрасывается, когда клиентскому подключению назначается серверное подключение.

total_client_parse_count

Общее число подготовленных операторов, созданных клиентами. Применимо только в режиме отслеживания именованных подготовленных операторов. За подробной информацией обратитесь к описанию параметра max_prepared_statements.

total_server_parse_count

Общее число подготовленных операторов, созданных pgbouncer на сервере. Применимо только в режиме отслеживания именованных подготовленных операторов. За подробной информацией обратитесь к описанию параметра max_prepared_statements.

total_bind_count

Общее число операторов, подготовленных клиентами к выполнению и отправленных на сервер Postgres Pro через pgbouncer. Применимо только в режиме отслеживания именованных подготовленных операторов. За подробной информацией обратитесь к описанию параметра max_prepared_statements.

avg_xact_count

Среднее число транзакций в секунду за последний период статистики.

avg_query_count

Среднее число запросов в секунду за последний период статистики.

avg_server_assignment_count

Сколько раз в среднем в секунду клиенту назначается сервер за последний статистический период.

avg_recv

Средняя скорость получения данных от клиентов (байт в секунду).

avg_sent

Средняя скорость передачи данных клиентам (байт в секунду).

avg_xact_time

Средняя длительность транзакции (в микросекундах).

avg_query_time

Средняя длительность запроса (в микросекундах).

avg_wait_time

Время ожидания клиентами ответов сервера в микросекундах (среднее время ожидания клиентов с назначенным серверным подключением в ходе текущего периода stats_period).

avg_client_parse_count

Среднее число подготовленных операторов, созданных клиентами. Применимо только в режиме отслеживания именованных подготовленных операторов. За подробной информацией обратитесь к описанию параметра max_prepared_statements.

avg_server_parse_count

Среднее число подготовленных операторов, созданных pgbouncer на сервере. Применимо только в режиме отслеживания именованных подготовленных операторов. За подробной информацией обратитесь к описанию параметра max_prepared_statements.

total_bind_count

Среднее число операторов, подготовленных клиентами и отправленных на сервер Postgres Pro через pgbouncer. Применимо только в режиме отслеживания именованных подготовленных операторов. За подробной информацией обратитесь к описанию параметра max_prepared_statements.

SHOW STATS_TOTALS #

Выводит подмножество результатов SHOW STATS, включающее только суммарные значения (total_).

SHOW STATS_AVERAGES #

Выводит подмножество результатов SHOW STATS, включающее только средние значения (avg_).

SHOW TOTALS #

Выводит ту же статистику, что SHOW STATS, но по всем базам данных в целом.

SHOW SERVERS #

type

«S» для серверов

user

Имя пользователя, с которым pgbouncer подключается к серверу.

database

Имя базы данных.

replication

Определяет, выполняется ли репликация в серверном подключении. Возможные значения: none, logical или physical.

state

Состояние подключения pgbouncer к серверу, один из вариантов: active, idle, used, tested, new, active_cancel или being_canceled.

addr

IP-адрес сервера Postgres Pro.

port

Порт сервера Postgres Pro.

local_addr

Исходный адрес подключения на локальной машине.

local_port

Исходный порт подключения на локальной машине.

connect_time

Время установления подключения.

request_time

Время выдачи последнего запроса.

wait

Не используется для серверных подключений.

wait_us

Не используется для серверных подключений.

close_needed

1, если соединение будет закрыто при ближайшей возможности в связи с выполнением команды RECONNECT либо в связи с изменением параметров соединения, вызванным перезагрузкой файла конфигурации или изменениями в DNS.

ptr

Адрес внутреннего объекта для данного подключения. Используется как уникальный идентификатор.

link

Адрес клиентского подключения, с которым связан сервер.

remote_pid

Идентификатор обслуживающего серверного процесса (PID). Когда подключение выполняется через сокет Unix и ОС может выдать PID процесса, это PID, полученный от ОС. В противном случае этот идентификатор извлекается из пакета для отмены, переданного сервером; это будет интересующий PID при подключении к серверу Postgres Pro, но если подключение обслуживает другой pgbouncer, это будет случайное число.

tls

Информация о TLS-подключении; пустая строка, если TLS не используется.

application_name

Строка, содержащая параметр application_name, заданный для связанного клиентского подключения, или пустая строка, если он не задан или если подключение отсутствует.

prepared_statements

Число операторов, подготовленных на сервере. Ограничено значением параметра max_prepared_statements.

id

Уникальный идентификатор для сервера.

SHOW CLIENTS #

type

«C» для клиентов.

user

Пользователь, подключённый со стороны клиента.

database

Имя базы данных.

replication

Определяет, выполняется ли репликация в клиентском подключении. Возможные значения: none, logical или physical.

state

Состояние клиентского подключения. Возможные значения: active — клиентские подключения связаны с серверными подключениями, idle — клиентские подключения без запросов ожидают обработки, waiting, active_cancel_req или waiting_cancel_req.

addr

IP-адрес клиента.

port

Порт клиента.

local_addr

Конечный адрес подключения на локальной машине.

local_port

Конечный порт подключения на локальной машине.

connect_time

Время установления подключения.

request_time

Время последнего запроса клиента.

wait

Текущая длительность ожидания (в секундах).

wait_us

Дробная часть текущей длительности ожидания (в микросекундах).

close_needed

Не используется для клиентов.

ptr

Адрес внутреннего объекта для данного подключения. Используется как уникальный идентификатор.

link

Адрес серверного подключения, с которым связан клиент.

remote_pid

Идентификатор процесса (PID), в случае, если клиент подключается через сокет UNIX и ОС может выдать этот идентификатор.

tls

Информация о TLS-подключении; пустая строка, если TLS не используется.

application_name

Строка, содержащая параметр application_name, заданный клиентом для данного подключения, или пустая строка, если он не задан или если подключение отсутствует.

prepared_statements

Число операторов, подготовленных клиентом.

id

Уникальный идентификатор для клиента.

SHOW POOLS #

Новый пул создаётся для каждой пары сущностей (база данных, пользователь).

database

Имя базы данных.

user

Имя пользователя.

cl_active

Число клиентских подключений, которые либо связаны с подключениями к серверу, либо простаивают без запросов, ожидающих обработки.

cl_waiting

Число клиентских подключений, которые отправили запросы, но ещё не получили подключения к серверу.

cl_active_cancel_req

Число клиентских подключений, которые передали серверу команды отмены запроса и ожидают ответ сервера.

cl_waiting_cancel_req

Число клиентских подключений, для которых серверу в данный момент передаются команды отмены запросов.

sv_active

Число серверных подключений, связанных с клиентами.

sv_active_cancel

Число серверных подключений, для которых в данный момент передаются команды отмены запросов.

sv_being_canceled

Серверы, которые должны простаивать, но ждут, пока не будут завершены все текущие команды отмены запросов, отправленные этим серверам.

sv_idle

Число серверных подключений, которые не используются и могут немедленно задействоваться для запросов клиентов.

sv_used

Число серверных подключений, которые простаивают дольше server_check_delay, поэтому перед повторным использованием для них нужно выполнять server_check_query.

sv_tested

Число серверных подключений, для которых в данный момент выполняются запросы server_reset_query или server_check_query.

sv_login

Число серверных подключений, через которые в данный момент выполняется вход на сервер.

maxwait

Показывает, как долго ожидает в очереди самый первый клиент (в секундах). Если это число начинает увеличиваться, значит текущий пул серверов не справляется с запросами достаточно быстро. Причиной тому может быть перегруженный сервер, либо просто слишком маленький размер пула (параметр pool_size).

maxwait_us

Дробная часть максимального времени ожидания (в микросекундах).

pool_mode

Действующий режим пула.

load_balance_hosts

load_balance_hosts применяется, если параметр host пула содержит разделённый запятыми список.

SHOW PEER_POOLS #

Для каждого настроенного узла создаётся новая запись peer_pool.

database

Идентификатор настроенной записи узла.

cl_active_cancel_req

Число клиентских подключений, которые передали серверу команды отмены запроса и ожидают ответ сервера.

cl_waiting_cancel_req

Число клиентских подключений, для которых серверу в данный момент передаются команды отмены запросов.

sv_active_cancel

Число серверных подключений, для которых в данный момент передаются команды отмены запросов.

sv_login

Число серверных подключений, через которые в данный момент выполняется вход на сервер.

SHOW LISTS #

Показывает следующие внутренние сведения, в столбцах (не строках):

databases

Число баз данных.

users

Число пользователей.

pools

Число пулов.

free_clients

Число свободных клиентов. У этих клиентов нет подключений, но pgbouncer сохраняет выделенную для них память, чтобы её можно было переиспользовать впоследствии без дополнительного выделения памяти.

used_clients

Число активных клиентов.

login_clients

Число клиентов в состоянии входа (login).

free_servers

Число свободных серверов. У этих серверов нет подключений, но pgbouncer сохраняет выделенную для них память, чтобы её можно было переиспользовать впоследствии без дополнительного выделения памяти.

used_servers

Число задействованных серверов.

dns_names

Количество имён DNS в кеше.

dns_zones

Количество зон DNS в кеше.

dns_queries

Количество выполняющихся запросов к DNS.

dns_pending

Не используется.

SHOW USERS #

name

Имя пользователя.

pool_size

Переопределение pool_size для пользователя либо NULL, если значение не задано.

reserve_pool_size

Переопределение reserve_pool_size для пользователя либо NULL, если значение не задано.

pool_mode

Переопределение pool_mode для пользователя либо NULL, если значение не задано.

max_user_connections

Параметр max_user_connections для пользователя. Если значение для определённого пользователя не задано, выводится значение по умолчанию.

current_connections

Текущее число серверных подключений, открытых этим пользователем на всех серверах.

max_user_client_connections

Параметр max_user_client_connections для пользователя. Если значение для определённого пользователя не задано, выводится значение по умолчанию.

current_client_connections

Текущее число клиентских подключений к pgbouncer, открытых этим пользователем.

SHOW DATABASES #

name

Имя настроенной записи базы данных.

host

Узел, к которому подключается pgbouncer.

port

Порт, к которому подключается pgbouncer.

database

Реальное имя базы данных, к которой подключается pgbouncer.

force_user

Когда пользователь указан в строке соединения, подключение между pgbouncer и Postgres Pro должно устанавливаться от его имени, вне зависимости от пользователя на стороне клиента.

pool_size

Максимальное число серверных подключений.

min_pool_size

Минимальное число серверных подключений.

reserve_pool_size

Максимальное число дополнительных подключений для этой базы данных.

server_lifetime

Максимальное время жизни серверного подключения для этой базы данных.

pool_mode

Переопределение pool_mode для базы данных либо NULL, если должен использоваться режим по умолчанию.

load_balance_hosts

load_balance_hosts для базы данных, если параметр host содержит разделённый запятыми список.

max_connections

Максимально возможное число серверных подключений для этой базы, установленное параметром max_db_connections либо глобально, либо на уровне базы данных.

current_connections

Текущее число серверных подключений для этой базы данных.

max_client_connections

Максимально возможное число клиентских подключений для этого экземпляра pgbouncer, аналогичное значению параметра max_db_client_connections для базы данных.

current_client_connections

Текущее число клиентских подключений для этой базы данных.

paused

1, если база данных находится в состоянии паузы, иначе — 0.

disabled

1, если база данных находится в отключённом состоянии, иначе — 0.

SHOW PEERS #

peer_id

Идентификатор настроенной записи узла.

host

Узел, к которому подключается pgbouncer.

port

Порт, к которому подключается pgbouncer.

pool_size

Максимальное число серверных подключений, которое можно установить для этого узла.

SHOW FDS #

Внутренняя команда, которая показывает список файловых дескрипторов и их внутреннее состояние.

При подключении пользователя с именем pgbouncer через сокет Unix из процесса с UID, совпадающим с UID текущего процесса, ему передаются реальные файловые дескрипторы. Это применяется для выполнения перезагрузки «на лету».

Примечание

В Windows это не работает.

Эта команда также блокирует внутренний цикл событий, так что её не следует выполнять, когда pgbouncer используется.

fd

Числовое значение файлового дескриптора (ФД).

task

Предназначение; возможны следующие варианты: pooler, client или server.

user

Пользователь подключения, занимающего этот ФД.

database

База данных подключения, занимающего этот ФД.

addr

IP-адрес подключения, занимающего данный ФД; unix, если это сокет Unix.

port

Порт подключения, занимающего данный ФД.

cancel

Ключ отмены для данного подключения.

link

Файловый дескриптор ответной стороны сервера/клиента. NULL, если подключение простаивает.

SHOW SOCKETS, SHOW ACTIVE_SOCKETS #

Выводит низкоуровневую информацию обо всех или только активных сокетах. В вывод включается информация, выводимая командами SHOW CLIENTS и SHOW SERVERS, а также дополнительные сведения низкого уровня.

SHOW CONFIG #

Выводит текущие параметры конфигурации, по одному в строке со следующими столбцами:

key

Имя переменной конфигурации.

value

Значение переменной конфигурации.

default

Значение по умолчанию.

changeable

Значение yes или no, показывающее, можно ли изменить переменную во время работы. Если значение no, переменная может быть изменена только при перезагрузке. Чтобы изменить переменную во время работы, воспользуйтесь командой SET.

SHOW MEM #

Выводит низкоуровневую информацию о размере различных блоков памяти, выделенных для внутреннего использования. Эта информация имеет динамическую природу и может меняться.

SHOW DNS_HOSTS #

Выводит имена узлов, содержащиеся в кеше DNS.

hostname

Имя узла.

ttl

Сколько секунд остаётся до очередного внешнего поиска.

addrs

Список адресов, разделённых запятыми.

SHOW DNS_ZONES #

Показывает зоны DNS в кеше.

zonename

Имя зоны.

serial

Текущий серийный номер.

count

Имена узлов, относящихся к этой зоне.

SHOW VERSION #

Показывает строку с версией pgbouncer.

SHOW STATE #

Показывает параметры состояния pgbouncer. Текущие состояния: активное, состояние паузы и приостановленное.

Команды управления процессом #

PAUSE [бд] #

pgbouncer пытается отключиться от всех серверов. При закрытии каждого подключения к серверу ожидается освобождение этого подключения в соответствии с режимом пула серверов (в режиме пула транзакций должна завершиться транзакция; в режиме пула операторов должен завершиться оператор; а в режиме пула сеансов должен отключиться клиент). Выполнение этой команды заканчивается, только когда отключатся все подключения. Эта команда должна применяться во время перезапуска базы данных.

Если указано имя базы данных, будет приостановлена работа только с ней.

Новые подключения клиентов к базе, поставленной на паузу, будут находиться в состоянии ожидания, пока не будет выполнена команда RESUME.

DISABLE бд #

Запрещает любые новые подключения клиентов к указанной базе данных.

ENABLE бд #

Разрешает новые подключения клиентов после предыдущей команды DISABLE.

RECONNECT бд #

Закрывает все открытые подключения к указанной базе (или ко всем базам) по мере их освобождения в соответствии с режимом пула, не дожидаясь окончания времени жизни подключений. При этом немедленно могут быть установлены новые подключения к серверу, согласно текущим параметрам пула.

Эта команда может быть полезна, когда изменяется конфигурация подключения к серверу, например, нужно постепенно переключиться на новый сервер. Эту команду не нужно выполнять, если вы меняете строку соединения в pgbouncer.ini и перезагружаете конфигурацию (см. RELOAD) или когда меняются адреса в DNS, так как равнозначное действие будет выполнено автоматически. Эта команда может быть полезна, только если подключения pgbouncer маршрутизируются какими-то внешними средствами.

После выполнения этой команды возможен длительный период, когда будут существовать и старые подключения, и новые. Это может иметь значение только при переключении трафика между читающими репликами или при переключении между узлами в конфигурации с несколькими ведущими. Если необходимо переключить все подключения сразу, рекомендуется использовать команду PAUSE. Чтобы закрыть подключения экстренно (например, когда произвести переключение нужно не постепенно, а срочно), вы можете воспользоваться командой KILL.

KILL [бд] #

Немедленно закрыть все клиентские и серверные подключения для указанной базы данных или всех баз данных, кроме административной базы данных.

Новые подключения клиентов к деактивированной базе будут находиться в состоянии ожидания, пока не будет выполнена команда RESUME.

KILL_CLIENT ид #

Немедленно закрыть указанное клиентское подключение и все серверные подключения для клиента. Клиент определяется значением ид, которое можно посмотреть с помощью команды SHOW CLIENTS.

Команда будет примерно такой — KILL_CLIENT 1234.

SUSPEND #

Все буферы сокетов очищаются и pgbouncer прекращает принимать данные через них. Выполнение этой команды заканчивается, только когда все буферы будут очищены. Эта команда должна применяться, когда pgbouncer перезагружается «на лету».

Новые подключения клиентов к приостановленной базе будут находиться в состоянии ожидания, пока не будет выполнена команда RESUME.

RESUME [бд] #

Восстанавливает работу после предыдущей команды KILL, PAUSE или SUSPEND.

SHUTDOWN #

Приводит к завершению процесса pgbouncer.

SHUTDOWN WAIT_FOR_SERVERS #

Прекратить приём новых подключений и завершить процесс pgbouncer после освобождения всех серверов. Практически равносильно выполнению команд PAUSE и SHUTDOWN с единственным отличием — команда SHUTDOWN WAIT_FOR_SERVERS перестаёт принимать новые подключения, ожидая PAUSE, а также «нетерпеливо» отключает клиентов, которые ожидают связи с серверным подключением. Заметьте, что при отключении сокеты UNIX остаются открытыми, но принимают только подключения к административной консоли pgbouncer.

SHUTDOWN WAIT_FOR_CLIENTS #

Прекратить приём новых подключений и завершить процесс pgbouncer после отключения всех существующих клиентов. Заметьте, что при отключении сокеты UNIX остаются открытыми, но принимают только подключения к административной консоли pgbouncer. Эту команду можно использовать для последовательного перезапуска двух процессов pgbouncer без простоя по описанному ниже алгоритму:

Рекомендуется, чтобы два или более процессов pgbouncer выполнялись на одном узле, однако это необязательное условия. Чтобы избежать простоя в ходе перезапуска, процессы перезапускаются друг за другом. При перезапуске следующего процесса остальные работают и принимают подключения.

  1. Выберите процесс, которые будет перезапускаться первым. Назовём его процесс А.

  2. Выполните команду SHUTDOWN WAIT_FOR_CLIENTS (или команду SIGTERM) в процессе А.

  3. Заставьте всех клиентов переподключиться. Переподключение может начаться не сразу из-за параметра server_idle_timeout, заданного для пула соединений на стороне клиента (или аналогичного параметра конфигурации). Если пул соединений на стороне клиента не используется, может произойти перезапуск клиентов. После переподключения всех клиентов, процесс А автоматически завершается, поскольку у него больше нет активных клиентских подключений.

  4. Запустите процесс А снова.

  5. Повторите шаги 2,3 и 4 для всех оставшихся процессов друг за другом, пока все процессы не будут перезапущены.

RELOAD #

Указывает процессу pgbouncer перезагрузить файлы конфигурации и обновить значения изменяемых параметров, а именно основной файл конфигурации, а также файлы, указанные в параметрах auth_file и auth_hba_file.

pgbouncer отслеживает изменения в файле конфигурации, затрагивающие подключения к базе данных. Существующие подключения со старыми параметрами будут закрыты при ближайшем освобождении этих подключений (в соответствии с режимом пула), а новые подключения к серверу немедленно начнут использовать изменившиеся параметры соединения.

WAIT_CLOSE [бд] #

Ожидает, пока для всех серверных подключений к указанной базе (или ко всем базам) не сбросится признак close_needed (см. Подраздел «SHOW SERVERS»). Эту команду можно вызвать после RECONNECT или RELOAD, чтобы, например, в скриптах переключения узлов, дождаться применения изменений конфигураций в полном объёме.

Другие команды #

SET ключ = аргумент #

Изменяет параметр конфигурации (см. также Подраздел «SHOW CONFIG»). Например:

SET log_connections = 1;
SET server_check_query = 'select 2';

(Заметьте, что эта команда выполняется в консоли администратора pgbouncer и задаёт параметры pgbouncer. Команда SET, выполненная в другой базе данных, будет передана на выполнению серверу Postgres Pro, как и любая другая SQL-команда.)

Сигналы #

SIGHUP

Перезагрузка конфигурации. Равносильно выполнению команды RELOAD в консоли.

SIGTERM

Особо безопасное отключение. Ожидание отключения всех клиентов, новые подключения не принимаются. Равносильно выполнению команды SHUTDOWN WAIT_FOR_CLIENTS в консоли. Если этот сигнал поступает, когда отключение уже выполняется, вместо особо безопасного отключения запускается немедленное отключение.

SIGINT

Безопасное отключение. Равносильно выполнению команды SHUTDOWN WAIT_FOR_SERVERS в консоли. Если этот сигнал поступает, когда отключение уже выполняется, вместо безопасного отключения запускается немедленное отключение.

SIGQUIT

Немедленное отключение. Равносильно выполнению команды SHUTDOWN в консоли.

SIGUSR1

Равносильно выполнению команды PAUSE в консоли.

SIGUSR2

Равносильно выполнению команды PAUSE в консоли.

Параметры libevent #

Из документации libevent:

Поддержку epoll, kqueue, devpoll, poll или select можно отключить, установив переменную окружения EVENT_NOEPOLL, EVENT_NOKQUEUE, EVENT_NODEVPOLL, EVENT_NOPOLL или EVENT_NOSELECT, соответственно.

Если установить переменную окружения EVENT_SHOW_METHOD, libevent покажет текущий выбранный метод уведомлений в ядре.

Файл конфигурации pgbouncer.ini #

Файл конфигурации имеет формат ini-файла. Названия разделов записываются между [ и ]. Строки, начинающиеся с ; или #, считаются комментариями и игнорируются. Символы ; и #, встречающиеся не в начале строки, не распознаются.

Общие параметры #

logfile #

Указывает имя файла журнала. Для работы в режиме демона (-d) должен быть задан либо этот параметр, либо syslog. Файл журнала остаётся открытым, так что после смены имени для прокрутки следует выполнить kill -HUP или RELOAD; в консоли. В Windows необходимо остановить и вновь запустить службу.

Обратите внимание, что параметр logfile сам по себе не отключает вывод сообщений в stderr. Отключить его можно, воспользовавшись параметром командной строки -q или -d.

По умолчанию: не задано.

pidfile #

Указывает имя файла PID. Без этого указания работа в режиме демона (-d) не допускается.

По умолчанию: не задано.

listen_addr #

Указывает список адресов (через запятую), по которым должны приниматься TCP-подключения. Вы можете указать *, что будет означать «принимать по всем адресам». Когда этот параметр не задан, принимаются только подключения через Unix-сокеты.

Адреса могут задаваться числами (в формате IPv4/IPv6) или именами.

По умолчанию: не задано.

listen_port #

Номер принимающего порта. Задаётся и для сокетов TCP, и для Unix-сокетов.

По умолчанию: 6432

unix_socket_dir #

Указывает расположение сокетов Unix. Действует и для принимающего сокета, и для подключений к серверу. Если задана пустая строка, сокеты Unix отключаются. При указании значения, начинающегося с @, будет создан сокет Unix в абстрактном пространстве имён (в настоящее время поддерживается в Linux и Windows).

Чтобы работала перезагрузка «на лету» (-R), необходимо настроить сокет Unix, который должен находиться в пространстве имён файловой системы.

По умолчанию: /tmp (в Windows — пустая строка)

unix_socket_mode #

Режим файловой системы для сокета Unix. Игнорируется для сокетов в абстрактном пространстве имён. Не поддерживается в Windows.

По умолчанию: 0777

unix_socket_group #

Имя группы для сокета Unix. Игнорируется для сокетов в абстрактном пространстве имён. Не поддерживается в Windows.

По умолчанию: не задано.

user #

Если задан, определяет, на какого пользователя Unix нужно переключиться после запуска. Работает, только если pgbouncer запускается от имени root или уже запущен от имени заданного пользователя.

Не поддерживается в Windows.

По умолчанию: не задано.

pool_mode #

Указывает, когда подключение к серверу могут повторно использовать другие клиенты.

session

Сервер возвращается в пул после отключения клиента. Это вариант по умолчанию.

transaction

Сервер возвращается в пул после завершения транзакции.

statement

Сервер возвращается в пул после завершения запроса. В этом режиме не допускаются транзакции, охватывающие несколько операторов.

max_client_conn #

Максимально допустимое число клиентских подключений.

При увеличении должно также увеличиваться ограничение на число файловых дескрипторов. Заметьте, что фактическое число занятых файловых дескрипторов будет больше, чем max_client_conn. Если каждый пользователь подключается к серверу под своим именем, теоретически возможный максимум равен:

max_client_conn + (max pool_size * total databases * total users)

Если пользователь задан в строке соединения (все пользователи подключаются под одним именем), теоретический максимум равен:

max_client_conn + (max pool_size * total databases)

Теоретический максимум не должен достигаться никогда, если только кто-то намеренно не предпримет специальные меры для этого. Тем не менее это значит, что число файловых дескрипторов должно ограничиваться довольно большим числом.

Поищите ulimit в руководстве man в вашей системе. Замечание: ограничение ulimit неприменимо в среде Windows.

По умолчанию: 100

default_pool_size #

Сколько подключений к серверу возможно для пары пользователь/база. Может быть переопределено в конфигурации базы данных.

По умолчанию: 20

min_pool_size #

Добавить в пул дополнительные соединения, если число активных подключений меньше этого числа. Даёт положительный эффект, когда нагрузка появляется внезапно после периода простоя. Это значение будет ограничено размером пула.

Действует только для пулов, для которых выполняется хотя бы одно из следующих условий:

  • Запись в разделе [databases] содержит набор значений для ключа пользователя (user, также называемого принудительным пользователем).

  • Есть как минимум один клиент, подключённый к пулу.

По умолчанию: 0 (отключено)

reserve_pool_size #

Число дополнительно разрешённых подключений в пуле (см. reserve_pool_timeout). При 0 резерв отсутствует.

По умолчанию: 0 (отключено)

reserve_pool_timeout #

Если клиент не обслуживается заданный период времени (в секундах), pgbouncer задействует дополнительные подключения из резервного пула. При 0 это не происходит.

По умолчанию: 5.0

max_db_connections #

Не допускать больше заданного числа серверных подключений к базе данных (независимо от пользователя). При этом учитывается база данных pgbouncer, к которой подключён клиент, а не база данных Postgres Pro исходящего подключения. Данный предел можно установить для каждой базы данных в разделе [databases].

Обратите внимание, что когда предел достигается, закрытие подключения клиента в одном пуле не позволяет немедленно установить другое подключение к серверу через другой пул, так как подключение первого пула по-прежнему открыто. Когда сервер закроет его (по тайм-ауту неактивности), новое подключение будет немедленно установлено для ожидающего пула.

По умолчанию: 0 (нет ограничения)

max_db_client_connections #

Не допускать больше заданного числа клиентских подключений к pgbouncer для базы данных (независимо от пользователя). При этом учитывается база данных pgbouncer, к которой подключён клиент, а не база данных Postgres Pro исходящего подключения.

Значение должно быть больше или равно max_db_connections. Разницу между двумя значениями можно рассматривать как число подключений к базе данных, ожидающих в очереди завершения активных подключений.

Значение также можно задать для каждой базы данных в разделе [databases].

По умолчанию: 0 (нет ограничения)

max_user_connections #

Не допускать больше заданного числа подключений к серверу для пользователя (независимо от базы данных). При этом учитывается пользователь pgbouncer, связанный с пулом, — это может быть либо пользователь, указанный для подключения к серверу, либо, в отсутствие этого указания, пользователь, от имени которого подключился клиент. Этот предел можно установить для каждого пользователя в разделе [users].

Обратите внимание, что когда предел достигается, закрытие подключения клиента в одном пуле не позволяет немедленно установить другое подключение к серверу через другой пул, так как подключение первого пула по-прежнему открыто. Когда сервер закроет его (по тайм-ауту неактивности), новое подключение будет немедленно установлено для ожидающего пула.

По умолчанию: 0 (нет ограничения)

max_user_client_connections #

Не допускать больше заданного числа клиентских подключений для пользователя (независимо от базы данных). Это значение должно быть больше max_user_connections. Разница между значениями max_user_connections и max_user_client_connections — максимальный размер очереди для пользователя.

Значение можно также задать для каждого пользователя в разделе [users].

По умолчанию: 0 (нет ограничения)

server_round_robin #

По умолчанию pgbouncer повторно использует подключения сервера в порядке LIFO (последнее пришло, первое ушло), так что основная загрузка распределяется по нескольким последним соединениям. Это даёт наибольшую производительность, если базу данных обслуживает один сервер. Но если за адресом (TCP, DNS или списком хостов) базы данных скрывается система балансировщика, лучше, если pgbouncer будет использовать подключения в данном режиме, обеспечивая таким образом равномерную нагрузку.

По умолчанию: 0

track_extra_parameters #

По умолчанию pgbouncer отслеживает параметры client_encoding, datestyle, timezone, standard_conforming_strings и application_name для каждого клиента. Чтобы разрешить отслеживание других параметров, их можно задать в этой переменной. В таком случае pgbouncer будет хранить их в кеше переменных клиента и восстанавливать на сервере каждый раз, когда клиент становится активным.

Если нужно указать несколько значений, используется перечисление через запятую (например, default_transaction_readonly, IntervalStyle).

Примечание

Большинство параметров нельзя отслеживать таким образом. Можно отслеживать только те параметры, которые Postgres Pro передаёт клиенту. В Postgres Pro есть официальный список параметров, которые передаются клиенту. Расширения Postgres Pro могут изменять этот список и сами добавлять передаваемые параметры, а также могут начать передавать уже существующие параметры, которые не передаются Postgres Pro. Например, Citus 12.0+ заставляет PostgreSQL также передавать search_path.

Протокол postgres позволяет настраивать параметры непосредственно в виде параметров в стартовом пакете или внутри поля options стартового пакета. Параметры, указанные любым из этих методов, поддерживаются переменной track_extra_parameters. Однако в track_extra_parameters можно включить только параметры, содержащиеся в поле options, но не само поле.

По умолчанию: IntervalStyle

ignore_startup_parameters #

По умолчанию pgbouncer принимает только параметры, которые он может отслеживать в стартовых пакетах: client_encoding, datestyle, timezone и standard_conforming_strings.

Все другие параметры вызывают ошибку. Чтобы принимались и другие параметры, их нужно указать здесь, чтобы pgbouncer знал, что они обрабатываются администратором и их можно игнорировать.

Если нужно указать несколько значений, используется перечисление через запятую (например, options,extra_float_digits).

Протокол postgres позволяет настраивать параметры непосредственно в виде параметров в стартовом пакете или внутри поля options стартового пакета. Параметры, указанные любым из этих методов, поддерживаются переменной ignore_startup_parameters. В ignore_startup_parameters можно даже включить само поле options, в результате чего любые неизвестные параметры, содержащиеся в поле options, будут игнорироваться.

За подробной информацией обратитесь к описанию параметра options.

По умолчанию: пустая строка

peer_id #

Идентификатор узла, используемый для определения этого процесса pgbouncer в группе одноранговых процессов pgbouncer. Значение peer_id должно быть уникальным в пределах группы одноранговых процессов pgbouncer. Если установлено значение 0, пиринг в pgbouncer отключается. За дополнительной информацией обратитесь к разделу [peers]. Максимальное значение, которое можно указывать для peer_id, — 16383.

По умолчанию: 0

disable_pqexec #

Отключает простой протокол запросов (PQexec). В отличие от расширенного протокола запросов, этот протокол допускает указание нескольких запросов в одном пакете, что оставляет место для атак с SQL-инъекцией. Отключение этого протокола может улучшить безопасность. Разумеется, это означает, что при этом смогут работать только клиенты, которые используют исключительно расширенный протокол запросов.

По умолчанию: 0

application_name_add_host #

Добавляет адрес узла и порт клиента к имени приложения, задаваемого при установлении подключения. Это помогает идентифицировать источник плохих запросов и т. п. Это выполняется, только когда подключение устанавливается. Если свойство application_name будет изменено позднее командой SET, pgbouncer его уже не поменяет.

По умолчанию: 0

conffile #

Показывает расположение текущего файла конфигурации. При изменении этого параметра pgbouncer будет использовать другой файл конфигурации после команд RELOAD / SIGHUP.

По умолчанию: файл, заданный в командной строке

service_name #

Используется при регистрации службы win32.

По умолчанию: pgbouncer

job_name #

Псевдоним service_name.

stats_period #

Определяет, с какой периодичностью (в секундах) будут пересчитываться средние значения, выводимые различными командами SHOW, и как часто агрегированная статистика будет записываться в журнал (но см. log_stats).

По умолчанию: 60

max_prepared_statements #

Если параметру задано ненулевое значение, pgbouncer отслеживает команды с подготовленными именованными операторами на уровне протокола, которые отправляются клиентом в режиме пула транзакций и операторов. pgbouncer проверяет, что все операторы, подготовленные клиентом, доступны в серверном подключении. Даже если оператор был подготовлен в другом серверном подключении.

pgbouncer проверяет все запросы, отправленные клиентами как подготовленные операторы, и назначает каждой уникальной строке запроса внутреннее имя в формате PGBOUNCER_{уникальный_идентификатор}. Если появляются одинаковые строки (например, подготовленные разными клиентами), они получают одинаковое внутреннее имя. Также, используя внутреннее имя (не имя, назначаемое клиентом), pgbouncer подготавливает оператор на сервере Postgres Pro. pgbouncer отслеживает имена, которые клиент назначил каждому подготовленному оператору. Затем каждая команда, использующая подготовленный оператор, перед отправкой на сервер переписывается — имя, назначенное клиентом, заменяется внутренним (например, my_prepared_statement становится PGBOUNCER_123). Что ещё важнее, если подготовленный оператор, отправляемый клиентом, ещё не подготовлен на сервере (например, в случае, если после подготовки оператора клиентом назначенный ему сервер меняется), pgbouncer явно подготавливает его перед выполнением.

Примечание

Отслеживание и перезапись подготовленных операторов не работает с подготовленными SQL-операторами, поэтому команды PREPARE, EXECUTE и DEALLOCATE сразу отправляются на сервер Postgres Pro. Исключения — команды DEALLOCATE ALL и DISCARD ALL. Они обрабатываются ожидаемым образом, и информация об операторах, подготовленных клиентом и отслеживаемых pgbouncer, очищается.

Фактическое значение этого параметра определяет число подготовленных операторов, которые остаются активными в кеше LRU в одном серверном подключении. Если для параметра задано значение 0, поддержка подготовленных операторов в режиме пула транзакций и операторов отключена. Для оптимальной производительности убедитесь, что значение этого параметра больше числа подготовленных операторов, часто используемых в вашем приложении. Обратите внимание, что чем больше значение этого параметра, тем больше памяти сервера Postgres Pro потребуется для каждого подключения pgbouncer, поскольку будет сохраняться больше запросов, подготовленных в этих подключениях. Также увеличится потребление памяти самим pgbouncer за счёт отслеживания строк запросов.

Однако влияние на объём потребляемой памяти pgbouncer не такое большое:

  • Каждый уникальный запрос сохраняется в глобальном кеше запросов один раз.

  • У каждого клиентского подключения есть буфер, используемый для перезаписи пакетов. Максимальный размер буфера равен четырём pkt_buf. Однако это ограничение редко достигается — только в случаях, когда размер запросов в подготовленных операторах в 2–4 раза превышает размер pkt_buf.

Поэтому рекомендуется использовать в качестве примера следующий сценарий:

  • Количество активных клиентов — 1000.

  • Клиенты готовят 200 уникальных запросов.

  • Клиенты готовят 200 уникальных запросов.

  • Средний размер запроса — 5 КБ.

  • По умолчанию для параметра pkt_buf задано значение 4096 (4 КБ).

В этом случае для обработки подготовленных операторов pgbouncer потребуется максимум:

200 x 5 КБ + 1000 x 4 x 4 КБ = ~17 МБ памяти.

Отслеживание подготовленных операторов увеличивает не только потребление памяти, но и использование процессора, так как pgbouncer требуются ресурсы, чтобы проверить и переписать запросы. Один и тот же порт могут прослушивать несколько экземпляров pgbouncer, чтобы задействовать больше одного ядра (за подробной информацией обратитесь к описанию параметра so_reuseport).

Однако использование подготовленных операторов также имеет и положительное влияние на производительность. Так же, как и при подключении к Postgres Pro напрямую, подготовка повторяющихся запросов позволяет сократить общее время, необходимое для разбора и планирования. Отслеживание подготовленных операторов pgbouncer особенно выгодно, когда несколько клиентов подготавливают одинаковые запросы. В таких клиентских подключениях автоматически переиспользуются операторы, даже если они были подготовлены другим клиентом. Например, если pool_size составляет 20 подключений и 100 клиентов подготавливают один и тот же запрос, он будет подготавливаться (и соответственно разбираться) для выполнения на сервере Postgres Pro только 20 раз.

Переиспользование подготовленных операторов имеет один недостаток. Если типы результата или аргументов подготовленного оператора меняются в ходе его выполнения, на данный момент Postgres Pro выводит следующую ошибку:

ERROR:  cached plan must not change result type (в кешированном плане не должен изменяться тип результата)

Чтобы избежать таких ошибок, не используйте идентичные строки в операторах, подготовленных разными клиентами, если они ожидают разные типы аргументов или результата. Один из наиболее распространённых случаев возникновения ошибок — миграция DDL, когда добавляется новая строка или меняется тип строки в существующей таблице. Чтобы выполнить повторную подготовку запроса и убрать ошибку, после миграции можно выполнить команду RECONNECT в административной консоли pgbouncer.

По умолчанию: 200

scram_iterations #

Количество вычислительных итераций при шифровании пароля с использованием SCRAM-SHA-256. Большее количество итераций обеспечивает дополнительную защиту сохранённых паролей от атак полным перебором, но замедляет аутентификацию.

По умолчанию: 4096

Параметры аутентификации

pgbouncer выполняет собственную аутентификацию клиентского приложения и имеет собственную базу данных пользователей. Для управления аутентификацией и данными пользователей используются следующие параметры.

auth_type #

Определяет, как аутентифицировать пользователей.

cert

Клиент должен подключаться по соединению TLS с действительным клиентским сертификатом. Имя пользователя берётся из поля CommonName (Общее имя) сертификата.

md5

Применять проверку пароля по хешу MD5. Этот метод аутентификации выбирается по умолчанию. Файл auth_file может содержать как зашифрованные MD5, так и открытые пароли. Даже при выборе md5, если пароль пользователя задан для метода SCRAM, автоматически будет применяться проверка по алгоритму SCRAM.

scram-sha-256

Применять проверку пароля по алгоритму SCRAM-SHA-256. Заданный параметром auth_file файл должен содержать зашифрованные SCRAM или открытые пароли. Учтите, что зашифрованные SCRAM пароли могут использоваться только для проверки пароли клиентов, но не для входа на сервер. Чтобы использовать SCRAM для серверных подключений, пароли необходимо задать открытым текстом.

plain

По каналу передаётся пароль в открытом тексте. Устаревший вариант.

trust

Аутентификация не выполняется. Тем не менее имя пользователя должно присутствовать в auth_file.

any

Подобен методу trust, но переданное имя пользователя игнорируется. Требует, чтобы для всех баз данных было настроено подключение заданного пользователя. Кроме того, база данных консоли допускает подключение любого пользователя в качестве администратора.

hba

Фактический тип аутентификации загружается из auth_hba_file. Это позволяет применять разные методы аутентификации для разных вариантов доступа. Например: для подключений через сокет Unix применять метод peer, а для TCPTLS.

ldap

Аутентификация пользователей через LDAP-сервер, как в Postgres Pro (за подробной информацией обратитесь к Разделу 20.10). Параметры LDAP-подключения можно настроить через параметр auth_ldap_options или через файл auth_hba_file.

pam

Для проверки подлинности пользователей используется инфраструктура PAM (Pluggable Authentication Modules, Подключаемые модули аутентификации). Файл auth_file игнорируется. Этот метод несовместим с базами данных, для которых используется auth_user. Инфраструктуре PAM в качестве имени службы передаётся pgbouncer. pam в файле конфигурации HBA не поддерживается.

auth_hba_file #

Файл конфигурации HBA, который используется, когда для параметра auth_type задано значение hba. За подробной информацией обратитесь к Подразделу «Формат файла HBA».

По умолчанию: не задано.

auth_ident_file #

Файл сопоставления для идентификации объектов, который используется, когда для параметра auth_type задано значение hba и выполняется сопоставление пользователей.

По умолчанию: не задано.

auth_file #

Имя файла, из которого будут загружаться имена и пароли пользователей. За подробностями обратитесь к Подразделу «Формат файла аутентификации».

Для большинства типов аутентификации (см. auth_type) необходимо, чтобы был задан параметр auth_file или auth_user; в противном случае в системе не будет созданных пользователей.

По умолчанию: не задано.

auth_user #

Если задан параметр auth_user, пользователи, не описанные в файле auth_file, будут проверяться запросом auth_query по таблице pg_authid в базе данных auth_user. Пароль пользователя auth_user будет взят из файла auth_file. (Если для пользователя auth_user не требуется пароль, задавать его в auth_file не нужно.)

Для прямого доступа к pg_authid требуются права администратора. Поэтому рекомендуется, чтобы обычный пользователь обращался к ней, вызывая функцию SECURITY DEFINER (с контекстом безопасности определившего).

По умолчанию: не задано.

auth_query #

Запрос для извлечения пароля пользователя из базы данных.

Для прямого доступа к pg_authid требуются права администратора. Поэтому рекомендуется, чтобы обычный пользователь обращался к ней, вызывая функцию SECURITY DEFINER (с контекстом безопасности определившего).

Заметьте, что этот запрос выполняется в целевой базе данных, так что если в нём используются функции, они должны быть установлены в каждой базе.

По умолчанию: SELECT rolname, CASE WHEN rolvaliduntil < now() THEN NULL ELSE rolpassword END FROM pg_authid WHERE rolname=$1 AND rolcanlogin

auth_dbname #

Имя базы данных в разделе [databases], которое будет использоваться для аутентификации. Этот параметр может быть глобальным или переопределяемым в строке подключения.

auth_ldap_options #

Параметры LDAP-подключения, если для auth_type задано значение ldap. (Не используется, если аутентификация настраивается через файл auth_hba_file.) Пример:

auth_ldap_options = ldapurl="ldap://127.0.0.1:12345/dc=example,dc=net?uid?sub"

Параметры журнала #

syslog #

Включает/отключает запись в syslog. В Windows вместо этого используется журнал событий.

По умолчанию: 0

syslog_ident #

Имя, с которым события передаются в syslog.

По умолчанию: pgbouncer (имя программы)

syslog_facility #

Субъект, который будет указываться в событиях, отправляемых в syslog. Возможные варианты: auth, authpriv, daemon, user, local0-7.

По умолчанию: daemon

log_connections #

Фиксировать в журнале успешные подключения.

По умолчанию: 1

log_disconnections #

Фиксировать отключения с указаниями их причин.

По умолчанию: 1

log_pooler_errors #

Фиксировать сообщения об ошибках, которые pgbouncer передаёт клиентам.

По умолчанию: 1

log_stats #

Записывать агрегированную статистику в журнал, с периодичностью stats_period. Это может быть лишним, если ту же статистику запрашивают внешние средства мониторинга, вызывая команды SHOW.

По умолчанию: 1

verbose #

Увеличивает уровень детализации. Соответствует ключу -v в командной строке. Например, указание -v -v в командной строке равносильно записи verbose=2. Самый высокий поддерживаемый на данный момент уровень детализации — 3.

По умолчанию: 0

Управление доступом к консоли #

admin_users #

Разделённый запятыми список пользователей базы данных, которым разрешено подключаться к консоли и выполнять в ней любые команды. Игнорируется с auth_type, равным any, так как в этом случае любой пользователь может подключаться как администратор.

По умолчанию: пустая строка

stats_users #

Разделённый запятыми список пользователей баз данных, которым разрешено подключаться к консоли и выполнять команды только на чтение, а именно все команды SHOW, за исключением SHOW FDS.

По умолчанию: пустая строка

Проверки активности соединений, тайм-ауты #

server_reset_query #

Запрос, посылаемый серверу при освобождении подключения, прежде чем оно станет доступно другим клиентам. В этот момент никакая транзакция не выполняется, так что значение не должно включать команды ABORT или ROLLBACK.

Предполагается, что этот запрос очистит все изменения в состоянии сеанса базы данных, чтобы следующий клиент получил подключение в определённом состоянии. По умолчанию выполняется команда DISCARD ALL, которая очищает всё, но при этом следующему клиенту не остаётся никакого кешированного состояния. Её можно поменять на более мягкую, например DEALLOCATE ALL, просто освобождающую подготовленные операторы (если работа приложения не нарушается, когда какое-то состояние сохраняется).

Когда применяется пул транзакций, server_reset_query не действует, так как в этом режиме клиенты не должны использовать никакие свойства сеансов, потому что каждая транзакция завершается в отдельном соединении и таким образом получает разные состояния сеанса.

По умолчанию: DISCARD ALL

server_reset_query_always #

Определяет, должен ли запрос server_reset_query выполняться во всех режимах пула. Когда этот параметр отключён (по умолчанию), server_reset_query будет запускаться только в режиме пула сеансов. Соединениям в режиме пула транзакций не должен требоваться запрос сброса состояния.

Этот параметр предназначен для аномальных конфигураций, в которых приложения не вполне корректно используют свойства сеансов, подключаясь к пулу транзакций pgbouncer. Он позволяет сменить недетерминированное неправильное поведение на детерминированное (но всё же неправильное) — клиенты всегда теряют своё состояние после каждой транзакции.

По умолчанию: 0

server_check_delay #

Определяет, как долго должны сохраняться освобождаемые подключения в состоянии готовности к повторному использованию, без запуска запроса server_check_query. При значении 0 этот запрос запускается всегда.

По умолчанию: 30.0

server_check_query #

Простой холостой запрос, проверяющий, сохраняется ли подключение к серверу.

Если это пустая строка, проверка соединения отключается.

Если возвращается значение <empty>, выполните пустой запрос, чтобы проверить активность подключения.

По умолчанию: <empty>

server_fast_close #

Определяет, должен ли сервер в режиме пула сеансов отключаться немедленно либо после завершения текущей транзакции, если он находится в режиме close_needed (который включается командами RECONNECT и RELOAD или при изменениях в DNS), или необходимо дожидаться завершения сеанса. Режимы пула запросов и транзакций так и работают, поэтому включение этого параметра на эти режимы не влияет.

Если этот параметр включён, то есть подключение к серверу закрывается до завершения сеанса клиента, клиентское подключение также закрывается. Тем самым гарантируется, что прерывание сеанса не останется незамеченным для клиента.

Этот параметр позволяет ускорить вступление в силу изменений параметров соединений в случае использования пула сеансов и существования долгоживущих сеансов. Недостатком его использования может быть то, что клиентские сеансы могут прерываться при изменении конфигурации, так что клиентские приложения должны уметь переподключаться и восстанавливать состояние сеанса. Но заметьте, что никакие транзакции при этом не будут потеряны, так как прерываться будут не выполняющиеся транзакции, а только лишь простаивающие сеансы.

По умолчанию: 0

server_lifetime #

pgbouncer будет закрывать неиспользуемое серверное подключение (то есть не подключённое ни к одному клиентскому подключению), существующее дольше заданного времени (в секундах). Ноль означает, что соединение будет использоваться только один раз, а затем будет закрываться.

Значение также можно задать для каждой базы данных в разделе [databases].

По умолчанию: 3600.0

server_idle_timeout #

Если подключение к серверу простаивает дольше заданного времени (в секундах), оно будет закрыто. При значении 0 тайм-аут отключается.

По умолчанию: 600.0

server_connect_timeout #

Если инициализация подключения и вход на сервер не завершается за указанное время (в секундах), соединение будет закрыто.

По умолчанию: 15.0

server_login_retry #

Время ожидания повторной попытки подключения пулом соединений (в секундах), если вход на сервер завершился ошибкой из-за сбоя подключения или аутентификации. В течение интервала ожидания новые клиенты, пытающиеся подключиться к неисправному серверу, немедленно получат сообщение об ошибке без повторной попытки подключения.

Цель такого поведения заключается в том, чтобы избавить клиентов от необходимости ожидания в очереди, пока соединение с сервером станет доступным, если сервер не работает. Однако это также означает, что если сервер ненадолго станет недоступен, например, во время перезапуска или при ошибочной конфигурации, то пройдёт как минимум такой интервал времени, прежде чем пул соединений вновь допустит подключение к этому серверу. Во избежание таких ситуаций следует управлять запланированными событиями, такими как перезапуски, используя команду PAUSE.

По умолчанию: 15.0

client_login_timeout #

Если клиент подключается, но не может пройти аутентификацию за указанное время (в секундах), он будет отключён. Требуется в основном, чтобы «мёртвые» подключения не задерживали операцию SUSPEND и, как следствие, перезагрузку «на лету».

По умолчанию: 60.0

autodb_idle_timeout #

Если создаваемые автоматически (через «*») пулы баз данных не используются заданное время (в секундах), они освобождаются. Минусом этого является то, что их статистика также сбрасывается.

По умолчанию: 3600.0

dns_max_ttl #

Время кеширования результатов поиска DNS (в секундах). Фактический DNS TTL игнорируется.

По умолчанию: 15.0

dns_nxdomain_ttl #

Время кеширования ошибок DNS и результатов NXDOMAIN (в секундах).

По умолчанию: 15.0

dns_zone_check_period #

Интервал проверки серийного номера зоны.

pgbouncer может собрать список зон DNS из имён узлов (всё после первой точки) и затем периодически проверять, не изменился ли серийный номер зоны. Если он меняется, то все имена узлов, относящиеся к зоне, разрешаются заново. Если для какого-либо узла получается другой IP-адрес, его подключения признаются недействительными.

Работает только с серверным подключением с поддержкой c-ares (параметр configure с флагом --with-cares).

По умолчанию: 0.0 (отключено)

resolv_conf #

Расположение пользовательского файла resolv.conf, в котором можно указать адреса серверов DNS а также другие параметры разрешения имён, не зависящие от глобальной конфигурации операционной системы.

Обработку этого файла выполняет используемая библиотека DNS, а не pgbouncer, поэтому, чтобы ознакомиться с его синтаксисом и указаниями, обратитесь к документации этой библиотеки.

По умолчанию: не задан (используются параметры операционной системы)

query_wait_notify #

Время ожидания клиента в очереди перед получением уведомления от pgbouncer, что он находится в очереди. [секунды]

Если значение 0, уведомления отключаются.

По умолчанию: 5

Параметры TLS #

Если содержимое любого файла сертификата или ключа изменяется, а фактическое имя файла в конфигурационном файле остаётся неизменным, новое содержимое будет применяться в новых подключениях после выполнения RELOAD . При этом существующие подключения закрываться не будут. Если по требованиям безопасности необходимо, чтобы все подключения начали использовать новые файлы как можно скорее, после команды RELOAD рекомендуется выполнить команду RECONNECT.

Изменение любых параметров TLS вызывает автоматическое выполнение RECONNECT в целях безопасности.

client_tls_sslmode #

Режим TLS, выбираемый для подключений клиентов. По умолчанию подключения с использованием TLS запрещены. Когда этот режим включается, необходимо также настроить в client_tls_key_file и client_tls_cert_file ключ и сертификат, которые будет использовать pgbouncer. Основной формат файла сертификата, используемого pgBbouncer, — PEM.

disable

Обычный TCP. Если клиент запрашивает TLS, его запрос игнорируется. Это режим по умолчанию.

allow

Если клиент запрашивает TLS, он используется. В противном случае используется обычный протокол TCP. Если клиент предоставляет свой сертификат, он не проверяется.

prefer

То же, что и allow.

require

Клиент должен использовать TLS. В противном случае соединение клиента сбрасывается. Если клиент предоставляет свой сертификат, он не проверяется.

verify-ca

Клиент должен использовать TLS с годным клиентским сертификатом.

verify-full

То же, что и verify-ca.

client_tls_key_file #

Закрытый ключ pgbouncer, применяемый для шифрования клиентских подключений.

По умолчанию: не задано.

client_tls_cert_file #

Сертификат частного ключа. Клиенты могут проверить его.

По умолчанию: не задано.

client_tls_ca_file #

Файл с корневым сертификатом, по которому будут проверяться клиентские сертификаты.

По умолчанию: не задано.

client_tls_protocols #

Определяет, какие версии протокола TLS разрешены. Допустимые значения: tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3. Краткие обозначения: all (tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3), secure (tlsv1.2,tlsv1.3).

По умолчанию: secure

client_tls_ciphers #

Определяет допустимые шифры TLS в синтаксисе OpenSSL. Допустимые краткие значения: default/secure/fast/normal (используются системные значения OpenSSL по умолчанию),all (допускаются все шифры, не рекомендуется).

Распространяется только на соединения, использующие TLS версии 1.2 и ниже. В настоящее время нет параметра, который бы управлял выбором шифров при использовании TLS версии 1.3.

По умолчанию: default

client_tls13_ciphers #

Определяет, какие шифры TLS версии 1.3 разрешены. Если значение не задано, будет использоваться значение client_tls_ciphers. Допустимые значения: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256, TLS_AES_128_CCM_8_SHA256 и TLS_AES_128_CCM_SHA256.

Распространяется только на подключения, использующие TLS версии 1.3 и выше. Для версии 1.2 и ниже обратитесь к параметру client_tls_ciphers.

По умолчанию: <empty>

client_tls_ecdhcurve #

Имя эллиптической кривой, применяемой при обмене ключами ECDH.

Допустимые значения: none (DH отключён), auto (256-битный ECDH), имя кривой.

По умолчанию: auto

client_tls_dheparams #

Тип обмена ключами DHE.

Допустимые значения: none (DH отключён), auto (2048-битный DH), legacy (1024-битный DH).

По умолчанию: auto

server_tls_sslmode #

Режим TLS для подключений к серверам Postgres Pro. Режим по умолчанию — prefer.

disable

Обычный TCP. TLS даже не запрашивается у сервера.

prefer

Сначала всегда запрашивается TLS-подключение к Postgres Pro. В случае отказа происходит переключение на простой TCP. Сертификат сервера не проверяется. Это режим по умолчанию.

require

Подключение обязательно должно устанавливаться через TLS. Если сервер не принимает его, простой TCP использоваться не будет. Сертификат сервера не проверяется.

verify-ca

Подключение должно устанавливаться через TLS, а сертификат сервера должен быть действительным согласно файлу server_tls_ca_file. Имя узла сервера по сертификату не проверяется.

verify-full

Подключение должно устанавливаться через TLS, а сертификат сервера должен быть действительным согласно файлу server_tls_ca_file. Имя узла должно соответствовать указанному в сертификате.

server_tls_ca_file #

Файл с корневым сертификатом, по которому будут проверяться сертификаты сервера Postgres Pro.

По умолчанию: не задано.

server_tls_key_file #

Закрытый ключ pgbouncer, с которым он будет аутентифицироваться на сервере Postgres Pro.

По умолчанию: не задано.

server_tls_cert_file #

Сертификат закрытого ключа. Сервер Postgres Pro может проверять его.

По умолчанию: не задано.

server_tls_protocols #

Определяет, какие версии протокола TLS разрешены. Допустимые значения: tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3. Краткие обозначения: all (tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3), secure (tlsv1.2,tlsv1.3), legacy (равнозначно all).

По умолчанию: secure

server_tls_ciphers #

Определяет допустимые шифры TLS в синтаксисе OpenSSL. Допустимые краткие значения: default/secure/fast/normal (используются системные значения OpenSSL по умолчанию),all (допускаются все шифры, не рекомендуется).

Распространяется только на соединения, использующие TLS версии 1.2 и ниже. В настоящее время нет параметра, который бы управлял выбором шифров при использовании TLS версии 1.3.

По умолчанию: default

server_tls13_ciphers #

Определяет, какие шифры TLS версии 1.3 разрешены. Если значение не задано, будет использоваться значение server_tls_ciphers. Допустимые значения: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256, TLS_AES_128_CCM_8_SHA256 и TLS_AES_128_CCM_SHA256.

Распространяется только на подключения, использующие TLS версии 1.3 и выше. Для версий 1.2 и ниже обратитесь к server_tls_ciphers.

По умолчанию: <empty>

Опасные тайм-ауты #

Установка следующих тайм-аутов может приводить к неожиданным ошибкам.

query_timeout #

Запросы, выполняющиеся дольше этого времени (в секундах), будут отменяться. Его значение следует выбирать лишь немногим меньшим параметра statement_timeout на сервере, чтобы это происходило только при проблемах в сети.

По умолчанию: 0.0 (отключено)

query_wait_timeout #

Максимальное время, в течение которого запросы могут ожидать выполнения (в секундах). Если за это время запрос не назначается серверу, клиент отключается. Нулевое значение отключает этот параметр, то есть клиенты будут ожидать бесконечно.

Этот параметр используется для предотвращения захватывания подключений «зависшими» серверами. Кроме того, он полезен, когда сервер не работает или по какой-либо причине отклоняет подключения.

По умолчанию: 120.0

cancel_wait_timeout #

Максимальное время, в течение которого команды отмены запросов могут ожидать выполнения (в секундах). Если команды отмены запросов не назначаются серверу за это время, клиент отключается. Нулевое значение отключает этот параметр, то есть команды отмены запросов будут ожидать бесконечно.

Этот параметр используется для предотвращения блокировки клиента, когда команды отмены запросов не могут быть переданы из-за неработоспособности сервера.

По умолчанию: 10.0

client_idle_timeout #

Клиентские подключения, простаивающие дольше этого времени (в секундах), закрываются. Это значение должно быть больше тайм-аута подключения, установленного на стороне клиента, и применяется оно только для решения проблем с сетью.

По умолчанию: 0.0 (отключено)

idle_transaction_timeout #

Если клиент «простаивает в транзакции» дольше этого времени (в секундах), он будет отключён.

По умолчанию: 0.0 (отключено)

transaction_timeout #

Если клиент находится «в транзакции» дольше этого времени (в секундах), он будет отключён.

По умолчанию: 0.0 (отключено)

suspend_timeout #

Сколько (в секундах) ждать сброса буфера при выполнении SUSPEND или перезагрузке (-R). Если сброс не завершился, подключение сбрасывается.

По умолчанию: 10

Низкоуровневые параметры сети #

pkt_buf #

Размер внутреннего буфера для пакетов. Влияет на размер отправляемых TCP-пакетов и общее использование памяти. Собственно пакеты libpq могут быть больше этого буфера, так что нет необходимости делать его большим.

По умолчанию: 4096

max_packet_size #

Максимальный размер пакетов Postgres Pro, который сможет пропустить через себя pgbouncer. Один пакет представляет либо один запрос, либо строку из набора результатов. Размер всего набора результатов может быть больше.

По умолчанию: 2147483647

listen_backlog #

Значение параметра очереди для listen(). Определяет, сколько неотвеченных запросов на подключение будет находиться в очереди. Когда очередь заполнена, следующие новые подключения будут сбрасываться.

По умолчанию: 128

sbuf_loopcnt #

Устанавливает, сколько циклов должны обрабатываться данные для одного подключения, после чего нужно переходить к другим. Без этого ограничения одно подключение с большим набором результатом может занять pgbouncer на долгое время. В одном цикле обрабатываются данные размером pkt_buf байт. Ноль убирает ограничение.

По умолчанию: 5

so_reuseport #

Определяет, будет ли для принимающих TCP-сокетов устанавливаться параметр SO_REUSEPORT. В некоторых операционных системах данный параметр позволяет запускать несколько экземпляров pgbouncer на одном узле, с одним и тем же принимающим портом, при этом соединения автоматически распределяются ядром. Таким образом pgbouncer может использовать больше ядер процессора. (pgbouncer — однопоточное приложение и использует одно ядро для каждого экземпляра.)

Данный параметр имеет желаемый эффект в Linux. В системах, которые вообще не поддерживают указанный параметр сокета, включение этого параметра приведёт к ошибке.

Для всех экземпляров pgbouncer на одном узле должны задаваться разные значения как минимум для unix_socket_dir и pidfile, а также logfile, если он используется. Также обратите внимание, что при использовании этого параметра вы больше не сможете подключаться к конкретному экземпляру pgbouncer через TCP/IP, что может затруднить мониторинг и сбор метрик.

Чтобы отмена запросов продолжала работать, следует настроить пиринг между различными процессами pgbouncer. За более подробной информацией обратитесь к описанию параметра конфигурации peer_id и раздела конфигурации [peers]. Также в разделе Примеры есть пример с использованием пиринга и so_reuseport.

По умолчанию: 0

tcp_defer_accept #

Задаёт параметр сокета TCP_DEFER_ACCEPT; за подробным описанием обратитесь к man 7 tcp. (Это логический параметр: 1 означает, что он включён. Фактическое значение при включённом параметре в настоящее время неизменяемо и составляет 45 секунд.)

В настоящее время поддерживается только в Linux.

По умолчанию: 1 в Linux, в других системах — 0

tcp_socket_buffer #

По умолчанию: не задано.

tcp_keepalive #

Включает базовый опрос активности со стандартными параметрами ОС.

В Linux системные параметры по умолчанию: tcp_keepidle=7200, tcp_keepintvl=75, tcp_keepcnt=9. Вероятно, они имеют близкие значения и в других ОС.

По умолчанию: 1

tcp_keepcnt #

По умолчанию: не задано.

tcp_keepidle #

По умолчанию: не задано.

tcp_keepintvl #

По умолчанию: не задано.

tcp_user_timeout #

Задаёт параметр сокета TCP_USER_TIMEOUT. Он определяет максимальное количество времени в миллисекундах, в течение которого передаваемые данные могут оставаться неподтверждёнными, прежде чем соединение TCP будет принудительно закрыто. Если установлено значение 0, используются параметры операционной системы по умолчанию.

В настоящее время поддерживается только в Linux.

По умолчанию: 0

Раздел [databases] #

Раздел [databases] определяет имена баз данных, к которым могут подключаться клиенты pgbouncer, и указывает, куда будут перенаправляться эти подключения. Раздел содержит строки ключ=значение, такие как

dbname = connection string

, где ключ будет приниматься как имя базы данных, а значение — как строка подключения, состоящая из параметров подключения в виде пар ключ=значение, описанных ниже (аналогично libpq, но сам libpq не используется и имеет другую функциональность).

Пример:

foodb = host=host1.example.com port=5432
bardb = host=localhost dbname=bazdb

Имя базы данных может содержать символы _0-9A-Za-z без кавычек. Имена, содержащие другие символы, должны заключаться в двойные кавычки по правилам для идентификаторов SQL (две кавычки ("") воспринимаются внутри строки как одна).

Имя базы данных pgbouncer зарезервировано для административной консоли и не может использоваться здесь в качестве ключа.

«*» воспринимается как имя всех остальных баз: если точного соответствия имени для запрошенной базы данных не находится, в качестве строки подключения выбирается данное значение. Например, если есть следующая запись (и нет других переопределяющих записей):

* = host=foo

В этом случае подключение к pgbouncer с указанием базы данных bar будет работать так, как если бы существовала следующая запись (в качестве dbname по умолчанию используется имя базы, полученное от клиента):

bar = host=foo dbname=bar

Такие автоматически создаваемые записи баз данных очищаются, если они простаивают больше времени, задаваемого параметром autodb_idle_timeout.

dbname #

Имя целевой базы данных.

По умолчанию: имя базы данных, полученное от клиента

host #

Имя или IP-адрес узла, к которому нужно подключиться. Имена узлов разрешаются в момент подключения, и результат кешируется в течение времени, заданного параметром dns_max_ttl. Если результат разрешения имени меняется, существующие подключения к серверу автоматически закрываются при их освобождении (в соответствии с режимом пула), и изменение немедленно отражается на новых подключениях. Если DNS возвращает несколько записей, они используются по очереди.

Если значение начинается с /, используется сокет Unix в пространстве имён файловой системы. Если значение начинается с @, используется сокет Unix в абстрактном пространстве имён.

Можно указать список имён узлов или адресов через запятую. В этом случае подключения выполняются по кругу. (Если список узлов содержит имена узлов, которые, в свою очередь, разрешаются через DNS в несколько адресов, системы балансировщика работают независимо. Это зависит от реализации, которая может быть изменена.) Обратите внимание, что в списке все узлы должны быть доступны в любой момент: нет никаких механизмов для пропуска недоступных или выбора только доступных узлов из списка и т. п. (Это является существенным отличием от списка узлов в libpq.) Также учтите, что это повлияет только на выбор цели для новых подключений. Назначение клиентов для уже установленных подключений к серверу подробнее рассматривается в описании параметра server_round_robin.

Примеры:

host=localhost
host=127.0.0.1
host=2001:0db8:85a3:0000:0000:8a2e:0370:7334
host=/var/run/postgresql
host=192.168.0.1,192.168.0.2,192.168.0.3

По умолчанию: не задан, что подразумевает использование сокетов Unix

port #

По умолчанию: 5432

user #

Если задано user=, все подключения к целевой базе данных будут выполняться с заданным именем пользователя, что означает, что для этой базы данных будет всего один пул.

В противном случае pgbouncer подключается к целевой базе данных с именем пользователя, переданным клиентом, что означает, что для каждого пользователя будет отдельный пул.

password #

Если через этот параметр пароль не задан, для пользователей, определённых в user, будет использоваться пароль из файла auth_file. Динамические формы обнаружения пароля, такие как auth_query, на данный момент не поддерживаются.

auth_user #

Переопределяет глобальную переменную auth_user, если она задана.

auth_query #

Переопределяет глобальный параметр auth_query, если он задан. Весь SQL-оператор необходимо заключить в апострофы.

auth_dbname #

Переопределяет глобальную переменную auth_dbname, если она задана.

pool_size #

Задаёт максимальный размер пула для всех подключений данного пользователя. Если этот параметр не задан, применяется значение, заданное для базы данных, или default_pool_size.

min_pool_size #

Задаёт минимальный размер пулов для этой базы данных. Если не задано, применяется глобальное значение min_pool_size.

Действует только для пулов, для которых выполняется хотя бы одно из следующих условий:

  • Эта запись из раздела [databases] содержит набор значений для ключа пользователя (user, также называемого принудительным пользователем).

  • Есть как минимум один клиент, подключённый к пулу.

reserve_pool_size #

Задаёт число дополнительных подключений для этой базы данных. Если не задано, применяется глобальное значение reserve_pool_size. Для сохранения обратной совместимости reserve_pool — псевдоним этого параметра.

connect_query #

Запрос, который будет выполняться сразу после установления соединения, но до того, как его смогут использовать какие-либо клиенты. Если при запросе возникают ошибки, они только фиксируются в журнале, другой реакции не следует.

pool_mode #

Задаёт режим пула для данной базы данных. Если этот параметр не задаётся, применяется значение pool_mode по умолчанию.

load_balance_hosts #

Если в host указан разделённый запятыми список, load_balance_hosts управляет, какая запись выбирается для нового подключения.

Примечание

На данный момент этот параметр управляет балансировкой нагрузки, только когда в строке подключения несколько узлов. Он не действует, когда запись DNS одного узла ссылается на несколько IP-адресов.

Допустимые значения:

  • round-robin — при новой попытке подключения выбирается следующая запись из списка host.

  • disable — новое подключение продолжается с той же записью host, пока не произойдёт сбой. После этого выбирается новая запись host.

Рекомендуется задавать для server_login_retry значение ниже значения по умолчанию, чтобы ускорить повторные попытки подключения при наличии нескольких узлов.

По умолчанию: round-robin

max_db_connections #

Задаёт максимальное число серверных подключений для базы данных (то есть, используя все пулы этой базы данных, нельзя будет установить больше этого числа подключений к серверу).

max_db_client_connections #

Определяет максимальное число клиентских подключений для всей базы данных. Необходимо использовать в сочетании с max_client_conn, чтобы ограничить количество подключений, принимаемых pgbouncer.

server_lifetime #

Определяет значение server_lifetime для базы данных. Если значение не задано, для базы данных будет использоваться значение server_lifetime, заданное на уровне экземпляра.

client_encoding #

Запрашивает у сервера использование указанной клиентской кодировки (client_encoding).

datestyle #

Запрашивает у сервера использование указанного стиля даты (datestyle).

timezone #

Запрашивает у сервера использование указанного часового пояса (timezone).

Раздел [users] #

Этот раздел содержит строки ключ=значение, такие как

user1 = settings

, где в качестве ключа принимается имя пользователя, а в качестве значения — переопределяемые для него параметры конфигурации.

Пример:

user1 = pool_mode=session

Здесь доступно лишь несколько параметров. Обратите внимание, что при настроенном auth_file если пользователь определён в этом разделе, но не указан в auth_file, pgbouncer попытается использовать auth_query для поиска пароля этого пользователя при заданном значении auth_user. Если параметр auth_user не задан, pgbouncer будет рассматривать пользователя как существующего и не будет выводить клиенту сообщения "no such user" (пользователь не существует). При этом ни один пароль для пользователя приниматься не будет.

pool_size #

Задаёт максимальный размер пула для всех подключений данного пользователя. Если этот параметр не задан, применяется значение default_pool_size.

reserve_pool_size #

Задаёт число дополнительных подключений, разрешённых для пула данного пользователя. Если этот параметр не задан, применяется значение, заданное для базы данных, или глобальное значение reserve_pool_size.

pool_mode #

Задаёт режим пула для всех подключений данного пользователя. Если этот параметр не задан, применяется значение pool_mode по умолчанию или заданное для базы данных.

max_user_connections #

Задаёт максимальное число серверных подключений для пользователя (то есть, используя все пулы, нельзя будет установить больше этого числа подключений к серверу).

query_timeout #

Максимальное время в секундах, в течение которого может выполняться запрос пользователя. Если этот параметр задан, он переопределяет значение query_timeout, заданное на уровне сервера.

idle_transaction_timeout #

Максимальное время в секундах, в течение которого может простаивать транзакция. Если этот параметр задан, он переопределяет значение idle_transaction_timeout, заданное на уровне сервера.

transaction_timeout #

Максимальное время в секундах, в течение которого транзакция может оставаться открытой. Если этот параметр задан, он переопределяет значение transaction_timeout, заданное на уровне сервера.

client_idle_timeout #

Максимальное время в секундах, в течение которого клиент может сохранять простаивающее подключение к экземпляру pgbouncer. Если этот параметр задан, он переопределяет значение client_idle_timeout, заданное на уровне сервера.

Примечание

Этот параметр может представлять опасность.

max_user_client_connections #

Максимальное число клиентских подключений пользователя. Это параметр уровня пользователя, аналогичный параметру max_client_conn.

Раздел [peers] #

В этом разделе определяются одноранговые узлы, которым pgbouncer может пересылать команды отмены запросов, и куда будут перенаправляться эти команды.

Процессы pgbouncer можно объединить в группу, определив значение peer_id и раздел [peers] в конфигурациях всех процессов pgbouncer. Эти процессы могут затем пересылать команды отмены запросов своему родительскому процессу. Это необходимо для работы команд отмены запросов, когда несколько процессов pgbouncer (возможно, на разных серверах) работают с одним и тем же балансировщиком нагрузки TCP. Команды отмены запросов отправляются по разным TCP-подключениям, отличным от подключения запроса, который они отменяют, поэтому балансировщик нагрузки TCP может отправить подключение команды отмены запроса другому процессу, отличному от того, для которого оно предназначалось. Благодаря пирингу эти команды отмены запросов в конечном итоге попадают в правильный процесс.

Раздел содержит строки ключ=значение, такие как

peer_id = connection string

, где ключ будет приниматься как peer_id, а значение — как строка подключения, состоящая из параметров подключения в виде пар ключ=значение, описанных ниже (аналогично libpq, но сам libpq не используется и имеет другую функциональность).

Пример:

1 = host=host1.example.com
2 = host=/tmp/pgbouncer-2  port=5555

Примечание

Чтобы пиринг работал, peer_id каждого процесса pgbouncer в группе должен быть уникальным в пределах группы одноранговых узлов, а раздел [peers] должен содержать записи для каждого из этих идентификаторов. За примерами обратитесь к соответствующей главе. Раздел [peers] может (но не обязательно должен) содержать peer_id узла pgbouncer, для которого предназначена конфигурация. Такая запись не учитывается, но упрощает управление конфигурациями, так как позволяет использовать один и тот же раздел [peers] для нескольких конфигураций.

host #

Имя или IP-адрес узла, к которому нужно подключиться. Имена узлов разрешаются в момент подключения, и результат кешируется в течение времени, заданного параметром dns_max_ttl. Если DNS возвращает несколько результатов, они используются в циклическом порядке. Но в целом не рекомендуется использовать имя узла, которое разрешается для нескольких IP-адресов, поскольку тогда команда отмены запроса всё равно может быть перенаправлена не на тот узел, и её придётся пересылать снова (что разрешено не более трёх раз).

Если значение начинается с /, используется сокет Unix в пространстве имён файловой системы. Если значение начинается с @, используется сокет Unix в абстрактном пространстве имён.

Примеры:

host=localhost
host=127.0.0.1
host=2001:0db8:85a3:0000:0000:8a2e:0370:7334
host=/var/run/pgbouncer-1
port #

По умолчанию: 6432

pool_size #

Если не задан, используется default_pool_size.

Директива включения #

Файл конфигурации pgbouncer может содержать директивы включения, которые указывают, что нужно прочитать и обработать дополнительный файл конфигурации. Это позволяет разделить файл конфигурации на физически отдельные части. Директивы включения выглядят примерно так:

%include имя_файла

Если файл задаётся не абсолютным путём, его путь воспринимается относительно текущего рабочего каталога.

Формат файла аутентификации #

В этом разделе описывается формат файла, задаваемого параметром auth_file. Это текстовый файл следующего вида:

"username1" "password" ...
"username2" "md5abcdef012342345" ...
"username2" "SCRAM-SHA-256$число_итераций:соль$сохранённый_ключ:ключ_сервера"

В строке должно быть минимум два поля, заключённых в двойные кавычки. В первом поле задаётся имя пользователя, а во втором — пароль, либо открытым текстом, либо защищённый MD5 или SCRAM. Остальное содержимое строки pgbouncer игнорирует. Кавычки в этой строке можно записать, продублировав их.

Принятый в Postgres Pro формат пароля, защищённого MD5:

"md5" + md5(password + username)

Таким образом, для пользователя admin с паролем 1234 защищённый MD5 пароль будет следующим: md545f2603610af569b6155c45067268c6b.

Принятый в Postgres Pro формат пароля, защищённого SCRAM:

SCRAM-SHA-256$число_итераций:соль$сохранённый_ключ:ключ_сервера

Пароли или шифры, записанные в файле аутентификации, имеют два предназначения. Во-первых, если для клиента настроен метод аутентификации по паролю, то пароль пользователя сверяется с записанным в этом файле. Во-вторых, если сервер БД требует аутентификации по паролю (и пароль не задан явно в строке подключения), пароль для исходящего подключения к этому серверу также будет взят из этого файла.

Если пароль хранится в виде простого текста, его можно использовать для любого метода аутентификации по паролю на сервере: по паролю в формате простого текста или по паролю, защищённому MD5 или SCRAM (за подробной информацией обратитесь к Разделу 20.5).

Пароли, защищённые MD5, можно использовать, если на сервере используется MD5-аутентификация (или у отдельных пользователей есть защищённые MD5 пароли).

Пароли в формате SCRAM могут использоваться для входа на сервер, только если клиент проходит аутентификацию по протоколу SCRAM, в определении базы pgbouncer не задаётся имя пользователя, а секреты SCRAM на сервере Postgres Pro и в pgbouncer идентичны (совпадает не только пароль, но и соль, а также количество итераций). Эти условия объясняются присущим механизму SCRAM свойством — из секрета SCRAM нельзя извлечь данные, требующиеся для аутентификации.

Файл аутентификации можно составить вручную, но также можно сгенерировать его из какого-то другого списка пользователей и паролей. В качестве примера скрипта, который генерирует файл с данными аутентификации из таблицы pg_authid, может быть полезен ./etc/mkauth.py. Вы также можете использовать auth_query вместо auth_file и таким образом обойтись без отдельного файла аутентификации.

Обратите внимания на замечания ниже, которые касаются управляемых серверов.

Если на сервере настроена SCRAM-аутентификация, для выполнения аутентификации pgbouncer должен знать либо пароль в формате простого текста либо соответствующий секрет SCRAM.

Некоторые провайдеры облачных решений (например, AWS RDS) запрещают доступ к системным таблицам Postgres Pro, содержащим конфиденциальные данные, для получения паролей. Даже для пользователей с самым большим набором прав (например, членам rds_superuser) в выводе команды SELECT * FROM pg_authid; отобразится сообщение «ERROR: permission denied for table pg_authid.» (ОШИБКА: нет доступа к таблице pg_authid). Это типичное поведение (за подробной информацией обратитесь к https://aws.amazon.com/blogs/database/best-practices-for-migrating-postgresql-databases-to-amazon-rds-and-amazon-aurora/).

По этой причине невозможно извлечь уже существующий секрет SCRAM, который был сохранён на управляемом сервере. Это усложняет настройку pgbouncer, который должен использовать один и тот же секрет SCRAM. Однако настроить и использовать такой секрет и со стороны клиента, и со стороны сервера возможно с помощью следующей схемы:

Сгенерируйте секрет SCRAM для произвольного пароля, используя инструмент, который отображает секрет после генерации. Например, команды psql --echo-hidden и \password позволяют вывести секрет в консоль перед отправкой на сервер.

$ psql --echo-hidden <строка_подключения>
postgres=# \password <имя_роли>
Введите новый пароль для пользователя "<имя_роли>":
Повторите его:
********* QUERY **********
ALTER USER <имя_роли> PASSWORD 'SCRAM-SHA-256$<число_итераций>:<соль>$<сохранённый_ключ>:<ключ_сервера>'
**************************

Запишите секрет SCRAM из вывода запроса и задайте его в файле userlist.txt pgbouncer.

При использовании другого инструмента, не команды psql --echo-hidden, необходимо также задать секрет SCRAM на сервере (для этого можно выполнить команду alter role <имя_роли> пароль <секрет_scram>').

Формат файла HBA #

Расположение файла HBA определяется параметром auth_hba_file. Он используется, только если для auth_type задано значение hba.

Соответствует формату Postgres Pro pg_hba.conf, описанному в Разделе 20.1.

  • Поддерживаемые типы записей: local, host, hostssl, hostnossl.

  • В поле базы данных поддерживаются варианты: all, replication, sameuser, @файл, несколько имён. Не поддерживаются: samerole и samegroup.

  • В поле имени пользователя поддерживаются варианты: all, @файл, несколько имён. Не поддерживается: +groupname.

  • В поле адреса поддерживается: all, IPv4, IPv6. Не поддерживаются: samehost, samenet, имена DNS, префиксы доменов.

  • В поле метода аутентификации поддерживаются только те методы, которые поддерживает pgbouncer в auth_type, а также peer и reject, но исключая any и pam, которые работают только глобально. Сопоставления имён пользователей (map=) поддерживаются, когда для auth_type заданы значения cert или peer.

  • Параметр для сопоставления имён пользователей ('map=') поддерживается, если для параметра auth_type задано значение cert или peer.

Формат файла сопоставления для идентификации объектов #

Расположение файла сопоставления для идентификации объектов определяется параметром auth_ident_file. Он загружается, только если для параметра auth_type задано значение hba.

Формат файла — упрощённый вариант файла сопоставления для идентификации объектов Postgres Pro (за подробной информацией обратитесь к Разделу 20.2:

  • Поддерживаются только строки в формате map-name system-username database-username.

  • Добавление имени файла/каталога не поддерживается.

  • Поле system-username не поддерживает регулярные выражения.

  • Поле database-username поддерживает all или имя отдельного пользователя Postgres Pro. Не поддерживает +groupname и регулярные выражения.

Примеры #

Простой пример конфигурации:

[databases]
template1 = host=localhost dbname=template1 auth_user=someuser

[pgbouncer]
pool_mode = session
listen_port = 6432
listen_addr = localhost
auth_type = md5
auth_file = users.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = someuser
stats_users = stat_collector

Примеры базы данных:

[databases]

; подключение к foodb через сокет Unix
foodb =

; перенаправление bardb в базу bazdb на локальном узле
bardb = host=localhost dbname=bazdb

; обращение к целевой базе данных будет производить один пользователь
forcedb = host=localhost port=300 user=baz password=foo client_encoding=UNICODE datestyle=ISO

Пример безопасной функции для auth_query:

CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(in i_username text, out uname text, out phash text)
RETURNS record AS $$
BEGIN
    SELECT rolname, CASE WHEN rolvaliduntil < now() THEN NULL ELSE rolpassword END
    FROM pg_authid
    WHERE rolname=i_username AND rolcanlogin
    INTO uname, phash;
    RETURN;
END;
$$ LANGUAGE plpgsql
   SECURITY DEFINER
   -- Укажите безопасное значение search_path: одна или несколько доверенных схем, затем 'pg_temp'.
   SET search_path = pg_catalog, pg_temp;
REVOKE ALL ON FUNCTION pgbouncer.user_lookup(text) FROM public, pgbouncer;
GRANT EXECUTE ON FUNCTION pgbouncer.user_lookup(text) TO pgbouncer;

Примеры конфигураций для двух одноранговых процессов pgbouncer при создании многоядерной структуры pgbouncer с использованием so_reuseport.

Конфигурация для первого процесса:

[databases]
postgres = host=localhost dbname=postgres

[peers]
1 = host=/tmp/pgbouncer1
2 = host=/tmp/pgbouncer2

[pgbouncer]
listen_addr=127.0.0.1
auth_file=auth_file.conf
so_reuseport=1
unix_socket_dir=/tmp/pgbouncer1
peer_id=1

Конфигурация для второго процесса:

[databases]
postgres = host=localhost dbname=postgres

[peers]
1 = host=/tmp/pgbouncer1
2 = host=/tmp/pgbouncer2

[pgbouncer]
listen_addr=127.0.0.1
auth_file=auth_file.conf
so_reuseport=1
; only unix_socket_dir and peer_id are different
unix_socket_dir=/tmp/pgbouncer2
peer_id=2

pgbouncer

pgbouncer — a connection pooler for Postgres Pro

Synopsis

On Linux systems:

pgbouncer [ -d ] [ -R ] [ -v ] [ -u user ] pgbouncer.ini

pgbouncer -V | -h

On Windows:

pgbouncer [ -v ] [ -u user ] pgbouncer.ini

pgbouncer -V | -h

To use pgbouncer as a Windows service:

pgbouncer.exe --regservice pgbouncer.ini

pgbouncer.exe --unregservice pgbouncer.ini

Description #

pgbouncer is a connection pooler for Postgres Pro. Any target application can be connected to pgbouncer as if it were a Postgres Pro server, and pgbouncer will create a connection to the actual server, or it will reuse one of its existing connections.

The aim of pgbouncer is to lower the performance impact of opening new connections to Postgres Pro.

In order not to compromise transaction semantics for connection pooling, pgbouncer supports several types of pooling when rotating connections:

Session pooling

Most polite method. When a client connects, a server connection will be assigned to it for the whole duration the client stays connected. When the client disconnects, the server connection will be put back into the pool. This is the default method.

Transaction pooling

A server connection is assigned to a client only during a transaction. When pgbouncer notices that transaction is over, the server connection will be put back into the pool.

Statement pooling

Most aggressive method. The server connection will be put back into the pool immediately after a query completes. Multi-statement transactions are disallowed in this mode as they would break.

The administration interface of pgbouncer consists of some new SHOW commands available when connected to a special virtual database pgbouncer.

The connection pooler functionality is also provided by proxima, alongside a combination of other useful features.

Quick Start #

pgbouncer is provided with Postgres Pro Enterprise as a separate pre-built package pgbouncer (for the detailed installation instructions, see Chapter 17). Basic setup and usage is as follows.

  1. Create a pgbouncer.ini file. Details in the pgbouncer(5) man page. Simple example:

    [databases]
    template1 = host=localhost dbname=template1 auth_user=someuser
    
    [pgbouncer]
    listen_port = 6432
    listen_addr = localhost
    auth_type = md5
    auth_file = userlist.txt
    logfile = pgbouncer.log
    pidfile = pgbouncer.pid
    admin_users = someuser
    
  2. Create a userlist.txt file that contains the users allowed in:

    "someuser" "same_password_as_in_server"
    
  3. Launch pgbouncer:

    $ pgbouncer -d pgbouncer.ini
    

    Note

    The above command does not work on Windows systems. Instead, pgbouncer must be launched as a service that first needs to be registered, as follows:

    pgbouncer --regservice
    

  4. Have your application (or the psql client) connect to pgbouncer instead of directly to the Postgres Pro server:

    $ psql -p 6432 -U someuser template1
    
  5. Manage pgbouncer by connecting to the special administration database pgbouncer and issuing SHOW HELP; to begin:

    $ psql -p 6432 -U someuser pgbouncer
    pgbouncer=# SHOW HELP;
    NOTICE:  Console usage
    DETAIL:
      SHOW [HELP|CONFIG|DATABASES|FDS|POOLS|CLIENTS|SERVERS|SOCKETS|LISTS|VERSION|...]
      SET key = arg
      RELOAD
      PAUSE
      SUSPEND
      RESUME
      SHUTDOWN
      [...]
    
  6. If you made changes to the pgbouncer.ini file, you can reload it with:

    pgbouncer=# RELOAD;
    

LDAP Authentication Configuration #

pgbouncer supports LDAP authentication for DBMS users. You can configure LDAP authentication by means of PAM (Pluggable Authentication Modules).

This section contains an example of LDAP authentication configuration.

To enable LDAP authentication via pgbouncer, perform the following steps:

Prerequisites #

Before you start LDAP configuration, ensure that you have all required packages installed. If required, install any missing packages.

  1. To ensure that your pgbouncer installation includes the PAM library (libpam), use the ldd utility:

    $ ldd /usr/sbin/pgbouncer | grep pam
    libpam.so.0 => /lib64/libpam.so.0 (0x00007fb5d6dd7000)
    
  2. Ensure that your system includes the pam_ldap module:

    $ find / -type f -name pam_ldap.so 2>/dev/null
    /usr/lib64/security/pam_ldap.so
    
  3. (Optional) If necessary, install pam_ldap:

    apt-get install pam_ldap
    

Configuring Postgres Pro #

  1. In your Postgres Pro Enterprise instance, create a test user for LDAP authentication:

    CREATE USER testuser WITH PASSWORD 'testuser_password';
    
  2. In the pg_hba.conf file, specify the connection string for testuser. For example:

    host    all    testuser    0.0.0.0/0    ldap
    ldapurl=ldap_server_uri
    ldapbasedn="CN=testuser,CN=Users,DC=postgrespro,DC=ru"
    ldapbinddn="CN=service_user,CN=Users,DC=postgrespro,DC=ru"
    ldapbindpasswd="service_user_password"
    ldapsearchattribute=CN
    

    For more information about LDAP authentication configuration options, see Section 20.10.

As a result, the authentication operates as follows:

  1. A user connects to Postgres Pro as testuser.

  2. Postgres Pro connects to the LDAP server at ldapurl using ldapbinddn and ldapbindpasswd.

  3. In ldapbasedn, Postgres Pro searches for an object where ldapsearchattribute is testuser.

  4. Postgres Pro verifies the testuser password via LDAP.

Note

In a production environment, it is recommended to specify a container or an OU (OrganizationalUnitName) as the ldapbasedn value (for example, CN=Users,DC=postgrespro,DC=ru), so that the user name is not hardcoded, but searched via ldapsearchattribute.

Configuring pgbouncer #

  1. In the pgbouncer.ini configuration file, specify the auth_type = pam authentication method.

    The example of pgbouncer configuration looks as follows:

    [pgbouncer]
    listen_addr = *
    listen_port = 6500
    unix_socket_dir = /tmp/
    pool_mode = session
    max_client_conn = 15000
    default_pool_size = 5
    peer_id = 1
    so_reuseport = 1
    auth_type = pam
    admin_users=pgbouncer,testuser
    stats_users=pgbouncer,testuser
    
    [databases]
    * = host=localhost port=5432
    
  2. Enable and activate pgbouncer:

    systemctl enable --now pgbouncer
    

Configuring PAM #

  1. In the /etc/pam.d/ directory, create a separate pgbouncer configuration with the following content:

    #%PAM-1.0
    auth required pam_ldap.so
    account required pam_ldap.so
    

    Parameter descriptions:

    • in the auth required pam_ldap.so entry:

      • auth is the authentication phase where the user password is verified.

      • required is a control flag. It means that if the module returns an error, the authentication fails. However, if successful, execution of other lines continues (i.e., early exit is not allowed).

      • pam_ldap.so is the module that communicates with LDAP and validates the specified username and password.

    • in the account required pam_ldap.so entry:

      • account is the authorization or account phase where the system checks whether the user is permitted to log in. The account must be in the correct OU, must not be expired or locked.

      • required is a control flag. It means that if LDAP returns the account invalid error, the authentication fails.

      • pam_ldap.so is the same LDAP module. However, here it is used for password verification rather than for account state check.

  2. Configure the module configuration file located at /etc/pam_ldap.conf. The configuration example looks as follows:

    host ldap_server
    base CN=Users,DC=postgrespro,DC=ru
    binddn CN=service_user,CN=Users,DC=postgrespro,DC=ru
    bindpw service_user_password
    timelimit 5
    bind_timelimit 5
    pam_login_attribute CN
    

    Parameter descriptions:

    • host is the LDAP server(s) the client connects to.

    • base is the base DN (distinguished name) where all search queries in the directory begin.

    • binddn is the DN of the service account used by PAM to connect to LDAP for user searches.

    • bindpw is the password for the binddn account.

    • timelimit is the time limit (in seconds) for executing LDAP queries.

    • bind_timelimit is the timeout (in seconds) for binding with the LDAP server.

    • pam_login_attribute is the attribute of the LDAP user entry that will be compared to the specified username.

Testing Connection #

  1. Connect to your DBMS instance via LDAP:

    psql -h 127.0.0.1 -U testuser -d postgres
    
  2. Connect to your DBMS instance via pgbouncer:

    psql -h 127.0.0.1 -U testuser -d postgres -p 6500
    

In both cases, the server log must display that LDAP is used as an authentication method.

Options #

-d, --daemon

Run in the background. Without it, the process will run in the foreground. In daemon mode, setting pidfile as well as logfile or syslog is required. No log messages will be written to stderr after going into the background.

Note

Does not work on Windows, pgbouncer needs to run as service there.

-R, --reboot

Note

This option is deprecated. Instead of this option use a rolling restart with multiple pgbouncer processes listening on the same port using so_reuseport instead.

Do an online restart. That means connecting to the running process, loading the open sockets from it, and then using them. If there is no active process, boot normally.

Note

Works only if OS supports Unix sockets and the unix_socket_dir is not disabled in configuration. Does not work on Windows. Does not work with TLS connections, they are dropped.

-u user, --user user

Switch to the given user on startup.

-v, --verbose

Increase verbosity. Can be used multiple times.

-q, --quiet

Be quiet: do not log to stderr. This does not affect logging verbosity, only that stderr is not to be used. For use in init.d scripts.

-V, --version

Show version.

-h, --help

Show short help.

--regservice

Win32: Register to run as Windows service. The service_name configuration parameter value is used as the name to register under.

--unregservice

Win32: Unregister Windows service.

Admin Console #

The console is available by connecting as normal to the database pgbouncer:

$ psql -p 6432 pgbouncer

Only users listed in the configuration parameters admin_users or stats_users are allowed to log in to the console. (Except when auth_mode=any, then any user is allowed in as a stats_user.)

Additionally, the user name pgbouncer is allowed to log in without password, if the login comes via the Unix socket and the client has same Unix user uid as the running process.

The admin console currently only supports the simple query protocol. Some drivers use the extended query protocol for all commands; these drivers will not work for this.

Show Commands #

The SHOW commands output information. Each command is described below.

SHOW STATS #

Shows statistics. In this and related commands, the total figures are since process start, the averages are updated every stats_period.

database

Statistics are presented per database.

total_xact_count

Total number of SQL transactions pooled by pgbouncer.

total_query_count

Total number of SQL commands pooled by pgbouncer.

total_server_assignment_count

Total times a server was assigned to a client.

total_received

Total volume in bytes of network traffic received by pgbouncer.

total_sent

Total volume in bytes of network traffic sent by pgbouncer.

total_xact_time

Total number of microseconds spent by pgbouncer when connected to Postgres Pro in a transaction, either idle in transaction or executing queries.

total_query_time

Total number of microseconds spent by pgbouncer when actively connected to Postgres Pro, executing queries.

total_wait_time

Time spent by clients waiting for a server, in microseconds. Updated when a client connection is assigned a backend connection.

total_client_parse_count

Total number of prepared statements created by clients. Only applicable in named prepared statement tracking mode, see max_prepared_statements.

total_server_parse_count

Total number of prepared statements created by pgbouncer on a server. Only applicable in named prepared statement tracking mode, see max_prepared_statements.

total_bind_count

Total number of prepared statements readied for execution by clients and forwarded to Postgres Pro by pgbouncer. Only applicable in named prepared statement tracking mode, see max_prepared_statements.

avg_xact_count

Average transactions per second in last stat period.

avg_query_count

Average queries per second in last stat period.

avg_server_assignment_count

Average number of times a server is assigned to a client per second in the last stat period.

avg_recv

Average received (from clients) bytes per second.

avg_sent

Average sent (to clients) bytes per second.

avg_xact_time

Average transaction duration, in microseconds.

avg_query_time

Average query duration, in microseconds.

avg_wait_time

Time spent by clients waiting for a server, in microseconds (average of the wait times for clients assigned a backend during the current stats_period).

avg_client_parse_count

Average number of prepared statements created by clients. Only applicable in named prepared statement tracking mode, see max_prepared_statements.

avg_server_parse_count

Average number of prepared statements created by pgbouncer on a server. Only applicable in named prepared statement tracking mode, see max_prepared_statements.

total_bind_count

Average number of prepared statements readied for execution by clients and forwarded to Postgres Pro by pgbouncer. Only applicable in named prepared statement tracking mode, see max_prepared_statements.

SHOW STATS_TOTALS #

Subset of SHOW STATS showing the total values (total_).

SHOW STATS_AVERAGES #

Subset of SHOW STATS showing the average values (avg_).

SHOW TOTALS #

Like SHOW STATS but aggregated across all databases.

SHOW SERVERS #

type

S, for server.

user

User name pgbouncer uses to connect to server.

database

Database name.

replication

If server connection uses replication. Can be none, logical or physical.

state

State of the pgbouncer server connection, one of active, idle, used, tested, new, active_cancel, or being_canceled.

addr

IP address of Postgres Pro server.

port

Port of Postgres Pro server.

local_addr

Connection start address on local machine.

local_port

Connection start port on local machine.

connect_time

When the connection was made.

request_time

When last request was issued.

wait

Not used for server connections.

wait_us

Not used for server connections.

close_needed

1 if the connection will be closed as soon as possible, because a configuration file reload or DNS update changed the connection information or RECONNECT was issued.

ptr

Address of internal object for this connection. Used as unique ID.

link

Address of client connection the server is paired with.

remote_pid

PID of backend server process. In case connection is made over Unix socket and OS supports getting process ID info, its OS PID. Otherwise it's extracted from cancel packet the server sent, which should be the PID in case the server is Postgres Pro, but it's a random number in case the server is another pgbouncer.

tls

A string with TLS connection information, or empty if not using TLS.

application_name

A string containing the application_name set on the linked client connection, or empty if this is not set, or if there is no linked connection.

prepared_statements

The amount of prepared statements that are prepared on the server. This number is limited by the max_prepared_statements setting.

id

Unique ID for server.

SHOW CLIENTS #

type

C, for client.

user

Client connected user.

database

Database name.

replication

If client connection uses replication. Can be none, logical or physical.

state

State of the client connection, one of active — client connections that are linked to server connections, idle — client connections with no queries waiting to be processed, waiting, active_cancel_req, or waiting_cancel_req.

addr

IP address of the client.

port

Source port of the client.

local_addr

Connection end address on local machine.

local_port

Connection end port on local machine.

connect_time

Timestamp of connect time.

request_time

Timestamp of latest client request.

wait

Current waiting time in seconds.

wait_us

Microsecond part of the current waiting time.

close_needed

Not used for clients.

ptr

Address of internal object for this connection. Used as unique ID.

link

Address of server connection the client is paired with.

remote_pid

Process ID, in case client connects over Unix socket and OS supports getting it.

tls

A string with TLS connection information, or empty if not using TLS.

application_name

A string containing the application_name set by the client for this connection, or empty if this is not set.

prepared_statements

The amount of prepared statements that the client has prepared.

id

Unique ID for client.

SHOW POOLS #

A new pool entry is made for each couple of (database, user).

database

Database name.

user

User name.

cl_active

Client connections that are either linked to server connections or are idle with no queries waiting to be processed.

cl_waiting

Client connections that have sent queries but have not yet got a server connection.

cl_active_cancel_req

Client connections that have forwarded query cancellations to the server and are waiting for the server response.

cl_waiting_cancel_req

Client connections that have not forwarded query cancellations to the server yet.

sv_active

Server connections that are linked to a client.

sv_active_cancel

Server connections that are currently forwarding a cancel request.

sv_being_canceled

Servers that normally could become idle but are waiting to do so until all in-flight cancel requests have completed that were sent to cancel a query on this server.

sv_idle

Server connections that are unused and immediately usable for client queries.

sv_used

Server connections that have been idle for more than server_check_delay, so they need server_check_query to run on them before they can be used again.

sv_tested

Server connections that are currently running either server_reset_query or server_check_query.

sv_login

Server connections currently in the process of logging in.

maxwait

How long the first (oldest) client in the queue has waited, in seconds. If this starts increasing, then the current pool of servers does not handle requests quickly enough. The reason may be either an overloaded server or just too small of a pool_size setting.

maxwait_us

Microsecond part of the maximum waiting time.

pool_mode

The pooling mode in use.

load_balance_hosts

The load_balance_hosts in use if the pool's host contains a comma-separated list.

SHOW PEER_POOLS #

A new peer_pool entry is made for each configured peer.

database

ID of the configured peer entry.

cl_active_cancel_req

Client connections that have forwarded query cancellations to the server and are waiting for the server response.

cl_waiting_cancel_req

Client connections that have not forwarded query cancellations to the server yet.

sv_active_cancel

Server connections that are currently forwarding a cancel request.

sv_login

Server connections currently in the process of logging in.

SHOW LISTS #

Show following internal information, in columns (not rows):

databases

Count of databases.

users

Count of users.

pools

Count of pools.

free_clients

Count of free clients. These are clients that are disconnected, but pgbouncer keeps the memory around that was allocated for them so it can be reused for future clients to avoid allocations.

used_clients

Count of used clients.

login_clients

Count of clients in login state.

free_servers

Count of free servers. These are servers that are disconnected, but pgbouncer keeps the memory around that was allocated for them so it can be reused for future servers to avoid allocations.

used_servers

Count of used servers.

dns_names

Count of DNS names in the cache.

dns_zones

Count of DNS zones in the cache.

dns_queries

Count of in-flight DNS queries.

dns_pending

Not used.

SHOW USERS #

name

The user name.

pool_size

The user's override pool_size, or NULL if not set.

reserve_pool_size

The user's override reserve_pool_size, or NULL if not set.

pool_mode

The user's override pool_mode, or NULL if not set.

max_user_connections

The user's max_user_connections setting. If this setting is not set for this specific user, then the default value will be displayed.

current_connections

Current number of server connections that this user has open to all servers.

max_user_client_connections

The user's max_user_client_connections setting. If this setting is not set for this specific user, then the default value will be displayed.

current_client_connections

Current number of client connections that this user has open to pgbouncer.

SHOW DATABASES #

name

Name of configured database entry.

host

Host pgbouncer connects to.

port

Port pgbouncer connects to.

database

Actual database name pgbouncer connects to.

force_user

When the user is part of the connection string, the connection between pgbouncer and Postgres Pro is forced to the given user, whatever the client user.

pool_size

Maximum number of server connections.

min_pool_size

Minimum number of server connections.

reserve_pool_size

Maximum number of additional connections for this database.

server_lifetime

The maximum lifetime of a server connection for this database.

pool_mode

The database's override pool_mode, or NULL if the default will be used instead.

load_balance_hosts

The database's load_balance_hosts if the host contains a comma-separated list.

max_connections

Maximum number of allowed server connections for this database, as set by max_db_connections, either globally or per database.

current_connections

Current number of server connections for this database.

max_client_connections

Maximum number of allowed client connections for this pgbouncer instance, as set by max_db_client_connections per database.

current_client_connections

Current number of client connections for this database.

paused

1 if this database is currently paused, else 0.

disabled

1 if this database is currently disabled, else 0.

SHOW PEERS #

peer_id

ID of the configured peer entry.

host

Host pgbouncer connects to.

port

Port pgbouncer connects to.

pool_size

Maximum number of server connections that can be made to this peer.

SHOW FDS #

Internal command — shows list of file descriptors (FDs) in use with internal state attached to them.

When the connected user has the user name pgbouncer, connects through the Unix socket and has the same UID as the running process, the actual FDs are passed over the connection. This mechanism is used to do an online restart.

Note

This does not work on Windows.

This command also blocks the internal event loop, so it should not be used while pgbouncer is in use.

fd

File descriptor numeric value.

task

One of pooler, client or server.

user

User of the connection using the FD.

database

Database of the connection using the FD.

addr

IP address of the connection using the FD, unix if a Unix socket is used.

port

Port used by the connection using the FD.

cancel

Cancel key for this connection.

link

File descriptor for corresponding server/client. NULL if idle.

SHOW SOCKETS, SHOW ACTIVE_SOCKETS #

Shows low-level information about sockets or only active sockets. This includes the information shown under SHOW CLIENTS and SHOW SERVERS as well as other more low-level information.

SHOW CONFIG #

Show the current configuration settings, one per row, with the following columns:

key

Configuration variable name.

value

Configuration value.

default

Configuration default value.

changeable

Either yes or no, shows if the variable can be changed while running. If no, the variable can be changed only at boot-time. Use SET to change a variable at run time.

SHOW MEM #

Shows low-level information about the current sizes of various internal memory allocations. The information presented is subject to change.

SHOW DNS_HOSTS #

Show host names in DNS cache.

hostname

Host name.

ttl

How many seconds until next lookup.

addrs

Comma separated list of addresses.

SHOW DNS_ZONES #

Show DNS zones in cache.

zonename

Zone name.

serial

Current serial.

count

Host names belonging to this zone.

SHOW VERSION #

Show the pgbouncer version string.

SHOW STATE #

Show the pgbouncer state settings. Current states are active, paused and suspended.

Process Controlling Commands #

PAUSE [db] #

pgbouncer tries to disconnect from all servers. Disconnecting each server connection waits for that server connection to be released according to the server pool's pooling mode (in transaction pooling mode, the transaction must complete; in statement mode, the statement must complete; and in session pooling mode the client must disconnect). The command will not return before all server connections have been disconnected. To be used at the time of database restart.

If database name is given, only that database will be paused.

New client connections to a paused database will wait until RESUME is called.

DISABLE db #

Reject all new client connections on the given database.

ENABLE db #

Allow new client connections after a previous DISABLE command.

RECONNECT db #

Close each open server connection for the given database, or all databases, after it is released (according to the pooling mode), even if its lifetime is not up yet. New server connections can be made immediately and will connect as necessary according to the pool size settings.

This command is useful when the server connection setup has changed, for example to perform a gradual switchover to a new server. It is not necessary to run this command when the connection string in pgbouncer.ini has been changed and reloaded (see RELOAD) or when DNS resolution has changed, because then the equivalent of this command will be run automatically. This command is only necessary if something downstream of pgbouncer routes the connections.

After this command is run, there could be an extended period where some server connections go to an old destination and some server connections go to a new destination. This is likely only sensible when switching read-only traffic between read-only replicas, or when switching between nodes of a multimaster replication setup. If all connections need to be switched at the same time, PAUSE is recommended instead. To close server connections without waiting (for example, in emergency failover rather than gradual switchover scenarios), also consider KILL.

KILL [db] #

Immediately drop all client and server connections on given database or all databases, excluding the admin database.

New client connections to a killed database will wait until RESUME is called.

KILL_CLIENT id #

Immediately kill specified client connection along with any server connections for the given client. The client to kill is identified by the id value that can be found using the SHOW CLIENTS command.

An example command will look something like KILL_CLIENT 1234.

SUSPEND #

All socket buffers are flushed and pgbouncer stops listening for data on them. The command will not return before all buffers are empty. To be used at the time of pgbouncer online reboot.

New client connections to a suspended database will wait until RESUME is called.

RESUME [db] #

Resume work from previous KILL, PAUSE, or SUSPEND command.

SHUTDOWN #

The pgbouncer process will exit.

SHUTDOWN WAIT_FOR_SERVERS #

Stop accepting new connections and shutdown after all servers are released. This is basically the same as issuing PAUSE and SHUTDOWN, except that this also stops accepting new connections while waiting for the PAUSE as well as eagerly disconnecting clients that are waiting to receive a server connection. Please note that UNIX sockets will remain open during the shutdown but will only accept connections to the pgbouncer admin console.

SHUTDOWN WAIT_FOR_CLIENTS #

Stop accepting new connections and shutdown the process once all existing clients have disconnected. Please note that UNIX sockets will remain open during the shutdown but will only accept connections to the pgbouncer admin console. This command can be used to do zero-downtime rolling restart of two pgbouncer processes using the following procedure:

Have two or more pgbouncer processes running on the same port using so_reuseport is recommended, but not required. To achieve zero downtime when restarting we'll restart these processes one-by-one, thus leaving the others running to accept connections while one is being restarted.

  1. Pick a process to restart first, let's call it A.

  2. Run SHUTDOWN WAIT_FOR_CLIENTS (or send SIGTERM) to process A.

  3. Cause all clients to reconnect. Possibly by waiting some time until the client-side pooler causes reconnects due to its server_idle_timeout (or similar config). Or if no client-side pooler is used, possibly by restarting the clients. Once all clients have reconnected. Process A will exit automatically, because no clients are connected to it anymore.

  4. Start process A again.

  5. Repeat steps 2, 3 and 4 for each of the remaining processes, one-by-one until you restarted all processes.

RELOAD #

The pgbouncer process will reload its configuration files and update changeable settings. This includes the main configuration file as well as the files specified by the settings auth_file and auth_hba_file.

pgbouncer notices when a configuration file reload changes the connection parameters of a database definition. An existing server connection to the old destination will be closed when the server connection is next released (according to the pooling mode), and new server connections will immediately use the updated connection parameters.

WAIT_CLOSE [db] #

Wait until all server connections, either of the specified database or of all databases, have cleared the close_needed state (see the section called “SHOW SERVERS”). This can be called after a RECONNECT or RELOAD to wait until the respective configuration change has been fully activated, for example in switchover scripts.

Other Commands #

SET key = arg #

Changes a configuration setting (see also the section called “SHOW CONFIG”). For example:

SET log_connections = 1;
SET server_check_query = 'select 2';

(Note that this command is run on the pgbouncer admin console and sets pgbouncer settings. A SET command run on another database will be passed to the Postgres Pro backend like any other SQL command.)

Signals #

SIGHUP

Reload config. Same as issuing the command RELOAD on the console.

SIGTERM

Super safe shutdown. Wait for all existing clients to disconnect, but don't accept new connections. This is the same as issuing SHUTDOWN WAIT_FOR_CLIENTS on the console. If this signal is received while there is already a shutdown in progress, then an "immediate shutdown" is triggered instead of a "super safe shutdown".

SIGINT

Safe shutdown. Same as issuing SHUTDOWN WAIT_FOR_SERVERS on the console. If this signal is received while there is already a shutdown in progress, then an "immediate shutdown" is triggered instead of a "safe shutdown".

SIGQUIT

Immediate shutdown. Same as issuing SHUTDOWN on the console.

SIGUSR1

Same as issuing PAUSE on the console.

SIGUSR2

Same as issuing RESUME on the console.

Libevent Settings #

From the libevent documentation:

It is possible to disable support for epoll, kqueue, devpoll, poll, or select by setting the environment variable EVENT_NOEPOLL, EVENT_NOKQUEUE, EVENT_NODEVPOLL, EVENT_NOPOLL or EVENT_NOSELECT, respectively.

By setting the environment variable EVENT_SHOW_METHOD, libevent displays the kernel notification method that it uses.

pgbouncer.ini Configuration File #

The configuration file is in the .ini format. Section names are between [ and ]. Lines starting with ; or # are taken as comments and ignored. The characters ; and # are not recognized as special when they appear later in the line.

Generic Settings #

logfile #

Specifies the log file. For daemonization (-d), either this or syslog has to be set. The log file is kept open, so after rotation, kill -HUP or on console RELOAD; should be done. On Windows, the service must be stopped and started.

Note that setting logfile does not by itself turn off logging to stderr. Use the command-line option -q or -d for that.

Default: not set

pidfile #

Specifies the PID file. Without pidfile set, daemonization (-d) is not allowed.

Default: not set

listen_addr #

Specifies a list (comma-separated) of addresses where to listen for TCP connections. You may also use * meaning "listen on all addresses". When not set, only Unix socket connections are accepted.

Addresses can be specified numerically (IPv4/IPv6) or by name.

Default: not set

listen_port #

Which port to listen on. Applies to both TCP and Unix sockets.

Default: 6432

unix_socket_dir #

Specifies the location for Unix sockets. Applies to both the listening socket and server connections. If set to an empty string, Unix sockets are disabled. A value that starts with @ specifies that a Unix socket in the abstract namespace should be created (currently supported on Linux and Windows).

For online reboot (-R) to work, a Unix socket needs to be configured, and it needs to be in the file-system namespace.

Default: /tmp (empty on Windows)

unix_socket_mode #

File system mode for Unix socket. Ignored for sockets in the abstract namespace. Not supported on Windows.

Default: 0777

unix_socket_group #

Group name to use for Unix socket. Ignored for sockets in the abstract namespace. Not supported on Windows.

Default: not set

user #

If set, specifies the Unix user to change to after startup. Works only if pgbouncer is started as root or if it's already running as the given user.

Not supported on Windows.

Default: not set

pool_mode #

Specifies when a server connection can be reused by other clients.

session

Server is released back to pool after client disconnects. Default.

transaction

Server is released back to pool after transaction finishes.

statement

Server is released back to pool after query finishes. Transactions spanning multiple statements are disallowed in this mode.

max_client_conn #

Maximum number of client connections allowed.

When this setting is increased, then the file descriptor limits in the operating system might also have to be increased. Note that the number of file descriptors potentially used is more than max_client_conn. If each user connects under its own username to the server, the theoretical maximum used is:

max_client_conn + (max pool_size * total databases * total users)

If a database user is specified in the connection string (all users connect under the same user name), the theoretical maximum is:

max_client_conn + (max pool_size * total databases)

The theoretical maximum should never be reached, unless somebody deliberately crafts a special load for it. Still, it means you should set the number of file descriptors to a safely high number.

Search for ulimit in your favorite shell man page. Note: ulimit does not apply in a Windows environment.

Default: 100

default_pool_size #

How many server connections to allow per user/database pair. Can be overridden in the per-database configuration.

Default: 20

min_pool_size #

Add more server connections to pool if below this number. Improves the behavior when the normal load suddenly comes back after a period of total inactivity. The value is effectively capped at the pool size.

Only enforced for pools where at least one of the following is true:

  • The entry in the [databases] section for the pool has a value set for the user key (also known as forced user)

  • There is at least one client connected to the pool

Default: 0 (disabled)

reserve_pool_size #

How many additional connections to allow to a pool (see reserve_pool_timeout). The 0 value disables this parameter.

Default: 0 (disabled)

reserve_pool_timeout #

If a client has not been serviced in this time, pgbouncer enables use of additional connections from the reserve pool. The 0 value disables this parameter. [seconds]

Default: 5.0

max_db_connections #

Do not allow more than this many server connections per database (regardless of user). This considers the pgbouncer database that the client has connected to, not the Postgres Pro database of the outgoing connection. This can also be set per database in the [databases] section.

Note that when you hit the limit, closing a client connection to one pool will not immediately allow a server connection to be established for another pool, because the server connection for the first pool is still open. Once the server connection closes (due to idle timeout), a new server connection will immediately be opened for the waiting pool.

Default: 0 (unlimited)

max_db_client_connections #

Do not allow more than this many client connections to pgbouncer per database (regardless of user). This considers the pgbouncer database that the client has connected to, not the Postgres Pro database of the outgoing connection.

This should be set at a number greater than or equal to max_db_connections. The difference between the two numbers can be thought of as how many connections to a given database can be in the queue while waiting for active connections to finish.

This can also be set per database in the [databases] section.

Default: 0 (unlimited)

max_user_connections #

Do not allow more than this many server connections per user (regardless of database). This considers the pgbouncer user that is associated with a pool, which is either the user specified for the server connection or in absence of that the user the client has connected as. This can also be set per user in the [users] section.

Note that when you hit the limit, closing a client connection to one pool will not immediately allow a server connection to be established for another pool, because the server connection for the first pool is still open. Once the server connection closes (due to idle timeout), a new server connection will immediately be opened for the waiting pool.

Default: 0 (unlimited)

max_user_client_connections #

Do not allow more than this many client connections per user (regardless of database). This value should be set to a number higher than max_user_connections. This difference between max_user_connections and max_user_client_connections can be conceptualized as the max size of the queue for the user.

This can also be set per user in the [users] section.

Default: 0 (unlimited)

server_round_robin #

By default, pgbouncer reuses server connections in LIFO (last-in, first-out) manner, so that few connections get the most load. This gives best performance if you have a single server serving a database. But if there is a round-robin system behind a database address (TCP, DNS, or host list), then it is better if pgbouncer also uses connections in that manner, thus achieving uniform load.

Default: 0

track_extra_parameters #

By default, pgbouncer tracks client_encoding, datestyle, timezone, standard_conforming_strings and application_name parameters per client. To allow other parameters to be tracked, they can be specified here, so that pgbouncer knows that they should be maintained in the client variable cache and restored in the server whenever the client becomes active.

If you need to specify multiple values, use a comma-separated list (e.g. default_transaction_readonly, IntervalStyle)

Note

Most parameters cannot be tracked this way. The only parameters that can be tracked are ones that Postgres Pro reports to the client. Postgres Pro has an official list of parameters that it reports to the client. Postgres Pro extensions can change this list though, they can add parameters themselves that they also report, and they can start reporting already existing parameters that Postgres Pro does not report. Notably Citus 12.0+ causes PostgreSQL to also report search_path.

The postgres protocol allows specifying parameter settings, both directly as a parameter in the startup packet, or inside the options startup packet. Parameters specified using both of these methods are supported by track_extra_parameters. However, it's not possible to include options itself in track_extra_parameters, only the parameters contained in options.

Default: IntervalStyle

ignore_startup_parameters #

By default, pgbouncer allows only parameters it can keep track of in startup packets: client_encoding, datestyle, timezone and standard_conforming_strings.

All other parameters will raise an error. To allow other parameters, they can be specified here, so that pgbouncer knows that they are handled by the admin and it can ignore them.

If you need to specify multiple values, use a comma-separated list (e.g. options,extra_float_digits).

The postgres protocol allows specifying parameter settings, both directly as a parameter in the startup packet, or inside the options startup packet. Parameters specified using both of these methods are supported by ignore_startup_parameters. It's even possible to include options itself in ignore_startup_parameters, which results in any unknown parameters contained inside options to be ignored.

See options for more information.

Default: empty

peer_id #

The peer ID used to identify this pgbouncer process in a group of pgbouncer processes that are peered together. The peer_id value should be unique within a group of peered pgbouncer processes. When set to 0, pgbouncer peering is disabled. See also [peers] section for more information. The maximum value that can be used for the peer_id is 16383.

Default: 0

disable_pqexec #

Disable the Simple Query protocol (PQexec). Unlike the Extended Query protocol, Simple Query allows multiple queries in one packet, which allows some classes of SQL-injection attacks. Disabling it can improve security. Obviously, this means only clients that exclusively use the Extended Query protocol will stay working.

Default: 0

application_name_add_host #

Add the client host address and port to the application name setting set on connection start. This helps in identifying the source of bad queries, etc. This logic applies only at the start of a connection. If application_name is later changed with SET, pgbouncer does not change it again.

Default: 0

conffile #

Show location of current configuration file. Changing it will make pgbouncer use another configuration file for next RELOAD / SIGHUP.

Default: file from command line

service_name #

Used on win32 service registration.

Default: pgbouncer

job_name #

Alias for service_name.

stats_period #

Sets how often the averages shown in various SHOW commands are updated and how often aggregated statistics are written to the log (but see log_stats). [seconds]

Default: 60

max_prepared_statements #

When this is set to a non-zero value, pgbouncer tracks protocol-level named prepared statements related commands sent by the client in transaction and statement pooling mode. pgbouncer makes sure that any statement prepared by a client is available on the backing server connection. Even when the statement was originally prepared on another server connection.

pgbouncer internally examines all the queries that are sent by clients as a prepared statement, and gives each unique query string an internal name with the format PGBOUNCER_{unique_id}. If the same query string is prepared multiple times (possibly by different clients), then these queries share the same internal name. pgbouncer only prepares the statement on the actual Postgres Pro server using the internal name (so not the name provided by the client). pgbouncer keeps track of the name that the client gave to each prepared statement. It then rewrites each command that uses a prepared statement by replacing the client-side name with the internal name (e.g. replacing my_prepared_statement with PGBOUNCER_123) before forwarding that command to the server. More importantly, if the prepared statement that the client wants to execute is not yet prepared on the server (e.g. because a different server is now assigned to the client than when the client prepared the statement), then pgbouncer transparently prepares the statement before executing it.

Note

This tracking and rewriting of prepared statement commands does not work for SQL-level prepared statement commands, so PREPARE, EXECUTE and DEALLOCATE are forwarded straight to Postgres Pro. The exception to this rule are the DEALLOCATE ALL and DISCARD ALL commands, these do work as expected and will clear the prepared statements that pgbouncer tracked for the client that sends this command.

The actual value of this setting controls the number of prepared statements kept active in an LRU cache on a single server connection. When the setting is set to 0, prepared statement support for transaction and statement pooling is disabled. To get the best performance you should try to make sure that this setting is larger than the amount of commonly used prepared statements in your application. Keep in mind that the higher this value, the larger the memory footprint of each pgbouncer connection will be on Postgres Pro server because it will keep more queries prepared on those connections. It also increases the memory footprint of pgbouncer itself because it now needs to keep track of query strings.

The impact on pgbouncer memory usage is not that big though:

  • Each unique query is stored once in a global query cache.

  • Each client connection keeps a buffer that it uses to rewrite packets. This is, at most, 4 times the size of pkt_buf. This limit is often not reached though, it only happens when the queries in your prepared statements are between 2 and 4 times the size of pkt_buf.

So consider the following as an example scenario:

  • There are 1000 active clients

  • The clients prepare 200 unique queries

  • The clients prepare 200 unique queries

  • The average size of a query is 5kB

  • pkt_buf parameter is set to the default of 4096 (4kB)

In this case, pgbouncer needs at most the following amount of memory to handle these prepared statements:

200 x 5kB + 1000 x 4 x 4kB = ~17MB of memory.

Tracking prepared statements does not only come with a memory cost, but also with increased CPU usage, because pgbouncer needs to inspect and rewrite the queries. Multiple pgbouncer instances can listen on the same port to use more than one core for processing (see so_reuseport for details).

But of course there are also performance benefits to prepared statements. Just as when connecting to Postgres Pro directly, by preparing a query that is executed many times, it reduces the total amount of parsing and planning that needs to be done. The way that pgbouncer tracks prepared statements is especially beneficial to performance when multiple clients prepare the same queries. Because client connections automatically reuse a prepared statement on a server connection, even if it was prepared by another client. As an example, if you have a pool_size of 20 and you have 100 clients that all prepare the exact same query, then the query is prepared (and thus parsed) only 20 times on the Postgres Pro server.

The reuse of prepared statements has one downside. If the return or argument types of a prepared statement changes across executions then Postgres Pro currently throws an error such as:

ERROR:  cached plan must not change result type

You can avoid such errors by not having multiple clients that use the exact same query string in a prepared statement, but expecting different argument or result types. One of the most common ways of running into this issue is during a DDL migration where you add a new column or change a column type on an existing table. In those cases you can run RECONNECT on the pgbouncer admin console after doing the migration to force a re-prepare of the query and make the error go away.

Default: 200

scram_iterations #

The number of computational iterations to be performed when encrypting a password using SCRAM-SHA-256. A higher number of iterations provides additional protection against brute-force attacks on stored passwords, but makes authentication slower.

Default: 4096

Authentication Settings

pgbouncer handles its own client authentication and has its own database of users. These settings control this.

auth_type #

How to authenticate users.

cert

The client must connect over TLS connection with a valid client certificate. The user name is then taken from the CommonName field from the certificate.

md5

Use MD5-based password check. This is the default authentication method. auth_file may contain both MD5-encrypted and plain-text passwords. If md5 is configured and a user has a SCRAM secret, then SCRAM authentication is used automatically instead.

scram-sha-256

Use password check with SCRAM-SHA-256. auth_file has to contain SCRAM secrets or plain-text passwords. Note that SCRAM secrets can only be used for verifying the password of a client but not for logging into a server. To be able to use SCRAM on server connections, use plain-text passwords.

plain

The clear-text password is sent over the wire. Deprecated.

trust

No authentication is done. The user name must still exist in auth_file.

any

Like the trust method, but the user name given is ignored. Requires that all databases are configured to log in as a specific user. Additionally, the console database allows any user to log in as admin.

hba

The actual authentication type is loaded from auth_hba_file. This allows different authentication methods for different access paths, for example: connections over Unix socket use peer authentication method, connections over TCP must use TLS.

ldap

Users are authenticated against an LDAP server, like in Postgres Pro (see Section 20.10 for details). The LDAP connection options are configured using the setting auth_ldap_options, or alternatively in the auth_hba_file.

pam

Pluggable Authentication Modules (PAM) method is used to authenticate users, auth_file is ignored. This method is not compatible with databases using the auth_user option. The service name reported to PAM is pgbouncer. pam is not supported in the HBA configuration file.

auth_hba_file #

HBA configuration file to use when auth_type is hba. See the section called “HBA File Format” for details.

Default: not set

auth_ident_file #

Identity map file to use when auth_type is hba and a user map will be defined.

Default: not set

auth_file #

The name of the file to load user names and passwords from. See the section called “Authentication File Format” for details.

Most authentication types (see auth_type) require that either auth_file or auth_user be set; otherwise there would be no users defined.

Default: not set

auth_user #

If auth_user is set, then any user not specified in auth_file will be queried through the auth_query query from pg_authid in the database, using auth_user. The password of auth_user will be taken from auth_file. (If auth_user does not require a password, then it does not need to be defined in auth_file.)

Direct access to pg_authid requires admin rights. It's preferable to use a non-superuser that calls a SECURITY DEFINER function instead.

Default: not set

auth_query #

Query to load user's password from database.

Direct access to pg_authid requires admin rights. It's preferable to use a non-superuser that calls a SECURITY DEFINER function instead.

Note that the query is run inside the target database. So if a function is used, it needs to be installed into each database.

Default: SELECT rolname, CASE WHEN rolvaliduntil < now() THEN NULL ELSE rolpassword END FROM pg_authid WHERE rolname=$1 AND rolcanlogin

auth_dbname #

Database name in the [databases] section to be used for authentication purposes. This option can be either global or overriden in the connection string if this parameter is specified.

auth_ldap_options #

LDAP connection options to use if auth_type is ldap. (Not used if authentication is configured via auth_hba_file.) Example:

auth_ldap_options = ldapurl="ldap://127.0.0.1:12345/dc=example,dc=net?uid?sub"

Log Settings #

syslog #

Toggles syslog on/off. On Windows, the event log is used instead.

Default: 0

syslog_ident #

Under what name to send logs to syslog.

Default: pgbouncer (program name)

syslog_facility #

Under what facility to send logs to syslog. Possibilities: auth, authpriv, daemon, user, local0-7.

Default: daemon

log_connections #

Log successful logins.

Default: 1

log_disconnections #

Log disconnections with reasons.

Default: 1

log_pooler_errors #

Log error messages the pooler sends to clients.

Default: 1

log_stats #

Write aggregated statistics into the log, every stats_period. This can be disabled if external monitoring tools are used to grab the same data from SHOW commands.

Default: 1

verbose #

Increase verbosity. Mirrors the -v switch on the command line. For example, using -v -v on the command line is the same as verbose=2. 3 is the highest currently-supported verbosity.

Default: 0

Console Access Control #

admin_users #

Comma-separated list of database users that are allowed to connect and run all commands on the console. Ignored when auth_type is any, in which case any user name is allowed in as admin.

Default: empty

stats_users #

Comma-separated list of database users that are allowed to connect and run read-only queries on the console. That means all SHOW commands except SHOW FDS.

Default: empty

Connection Sanity Checks, Timeouts #

server_reset_query #

Query sent to server on connection release, before making it available to other clients. At that moment no transaction is in progress, so the value should not include ABORT or ROLLBACK.

The query is supposed to clean any changes made to the database session so that the next client gets the connection in a well-defined state. The default is DISCARD ALL, which cleans everything, but that leaves the next client no pre-cached state. It can be made lighter, e.g. DEALLOCATE ALL to just drop prepared statements, if the application does not break when some state is kept around.

When transaction pooling is used, the server_reset_query is not used, because in that mode, clients must not use any session-based features, since each transaction ends up in a different connection and thus gets a different session state.

Default: DISCARD ALL

server_reset_query_always #

Whether server_reset_query should be run in all pooling modes. When this setting is off (default), the server_reset_query will be run only in pools that are in sessions-pooling mode. Connections in transaction-pooling mode should not have any need for a reset query.

This setting is for working around broken setups that run applications that use session features over a transaction-pooled pgbouncer. It changes non-deterministic breakage to deterministic breakage: clients always lose their state after each transaction.

Default: 0

server_check_delay #

How long to keep released connections available for immediate re-use, without running server_check_query on it. If 0 then the query is always run.

Default: 30.0

server_check_query #

Simple do-nothing query to check if the server connection is alive.

If an empty string, then sanity checking is disabled.

If <empty>, then send empty query as sanity check.

Default: <empty>

server_fast_close #

Disconnect a server in session pooling mode immediately or after the end of the current transaction if it is in close_needed mode (set by RECONNECT, RELOAD that changes connection settings, or DNS change), rather than waiting for the session end. In statement or transaction pooling mode, this has no effect since that is the default behavior there.

If because of this setting a server connection is closed before the end of the client session, the client connection is also closed. This ensures that the client notices that the session has been interrupted.

This setting makes connection configuration changes take effect sooner if session pooling and long-running sessions are used. The downside is that client sessions are liable to be interrupted by a configuration change, so client applications will need logic to reconnect and reestablish session state. But note that no transactions will be lost, because running transactions are not interrupted, only idle sessions.

Default: 0

server_lifetime #

The pooler will close an unused (not currently linked to any client connection) server connection that has been connected longer than this. Setting it to 0 means the connection is to be used only once, then closed. [seconds]

This can also be set per database in the [databases] section.

Default: 3600.0

server_idle_timeout #

If a server connection has been idle more than this many seconds it will be closed. If 0 then timeout is disabled. [seconds]

Default: 600.0

server_connect_timeout #

If connection and login don't finish in this amount of time, the connection will be closed. [seconds]

Default: 15.0

server_login_retry #

If login to the server failed, because of failure to connect or from authentication, the pooler waits this much before retrying to connect. During the waiting interval, new clients trying to connect to the failing server will get an error immediately without another connection attempt. [seconds]

The purpose of this behavior is that clients don't unnecessarily queue up waiting for a server connection to become available if the server is not working. However, it also means that if a server is momentarily failing, for example during a restart or if the configuration was erroneous, then it will take at least this long until the pooler will consider connecting to it again. Planned events such as restarts should normally be managed using the PAUSE command to avoid this.

Default: 15.0

client_login_timeout #

If a client connects but does not manage to log in in this amount of time, it will be disconnected. Mainly needed to avoid dead connections stalling SUSPEND and thus online restart. [seconds]

Default: 60.0

autodb_idle_timeout #

If the automatically created (via "*") database pools have been unused this many seconds, they are freed. The negative aspect of that is that their statistics are also forgotten. [seconds]

Default: 3600.0

dns_max_ttl #

How long DNS lookups can be cached. The actual DNS TTL is ignored. [seconds]

Default: 15.0

dns_nxdomain_ttl #

How long DNS errors and NXDOMAIN DNS lookups can be cached. [seconds]

Default: 15.0

dns_zone_check_period #

Period to check if a zone serial has changed.

pgbouncer can collect DNS zones from host names (everything after first dot) and then periodically check if the zone serial changes. If it notices changes, all host names under that zone are looked up again. If any host IP changes, its connections are invalidated.

Works only with c-ares backend (configure option --with-cares).

Default: 0.0 (disabled)

resolv_conf #

The location of a custom resolv.conf file. This is to allow specifying custom DNS servers and perhaps other name resolution options, independent of the global operating system configuration.

The parsing of the file is done by the DNS backend library, not pgbouncer, so see the library's documentation for details on allowed syntax and directives.

Default: empty (use operating system defaults)

query_wait_notify #

Time that a client will be queued for before pgbouncer sends a notification message that they are being queued. [seconds]

A value of 0 disables this notification message.

Default: 5

TLS Settings #

If the contents of any of the cert or key files are changed without changing the actual setting filename in the config, the new file contents will be used for new connections after a RELOAD. Existing connections won't be closed though. If it's necessary for security reasons that all connections start using the new files ASAP, it's advised to run RECONNECT after the RELOAD.

Changing any TLS settings will trigger a RECONNECT automatically for security reasons.

client_tls_sslmode #

TLS mode to use for connections from clients. TLS connections are disabled by default. When enabled, client_tls_key_file and client_tls_cert_file must be also configured to set up the key and certificate pgbouncer uses to accept client connections. The most common certificate file format usable by pgBbouncer is PEM.

disable

Plain TCP. If client requests TLS, it's ignored. Default.

allow

If client requests TLS, it is used. If not, plain TCP is used. If the client presents a client certificate, it is not validated.

prefer

Same as allow.

require

The client must use TLS. If not, the client connection is rejected. If the client presents a client certificate, it is not validated.

verify-ca

Client must use TLS with valid client certificate.

verify-full

Same as verify-ca.

client_tls_key_file #

Private key for pgbouncer to accept client connections.

Default: not set

client_tls_cert_file #

Certificate for private key. Clients can validate it.

Default: not set

client_tls_ca_file #

Root certificate file to validate client certificates.

Default: not set

client_tls_protocols #

Which TLS protocol versions are allowed. Allowed values: tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3. Shortcuts: all (tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3), secure (tlsv1.2,tlsv1.3).

Default: secure

client_tls_ciphers #

Allowed TLS ciphers, in OpenSSL syntax. Shortcuts: default/secure/fast/normal (these all use system-wide OpenSSL defaults), all (enables all ciphers, not recommended).

Only connections using TLS version 1.2 and lower are affected. There is currently no setting that controls the cipher choices used by TLS version 1.3 connections.

Default: default

client_tls13_ciphers #

Allowed TLS v1.3 ciphers. When empty it will use the value of client_tls_ciphers Allowed values: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256, TLS_AES_128_CCM_8_SHA256, TLS_AES_128_CCM_SHA256.

Only connections using TLS version 1.3 and higher are affected. For version 1.2 and lower, see client_tls_ciphers.

Default: <empty>

client_tls_ecdhcurve #

Elliptic Curve name to use for ECDH key exchanges.

Allowed values: none (DH is disabled), auto (256-bit ECDH), curve name.

Default: auto

client_tls_dheparams #

DHE key exchange type.

Allowed values: none (DH is disabled), auto (2048-bit DH), legacy (1024-bit DH).

Default: auto

server_tls_sslmode #

TLS mode to use for connections to Postgres Pro servers. The default mode is prefer.

disable

Plain TCP. TLS is not even requested from the server.

prefer

TLS connection is always requested first from Postgres Pro. If refused, the connection will be established over plain TCP. Server certificate is not validated. Default.

require

Connection must go over TLS. If server rejects it, plain TCP is not attempted. Server certificate is not validated.

verify-ca

Connection must go over TLS and server certificate must be valid according to server_tls_ca_file. Server host name is not checked against certificate.

verify-full

Connection must go over TLS and server certificate must be valid according to server_tls_ca_file. Server host name must match certificate information.

server_tls_ca_file #

Root certificate file to validate Postgres Pro server certificates.

Default: not set

server_tls_key_file #

Private key for pgbouncer to authenticate against Postgres Pro server.

Default: not set

server_tls_cert_file #

Certificate for private key. Postgres Pro server can validate it.

Default: not set

server_tls_protocols #

Which TLS protocol versions are allowed. Allowed values: tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3. Shortcuts: all (tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3), secure (tlsv1.2,tlsv1.3), legacy (all).

Default: secure

server_tls_ciphers #

Allowed TLS ciphers, in OpenSSL syntax. Shortcuts: default/secure/fast/normal (these all use system-wide OpenSSL defaults), all (enables all ciphers, not recommended).

Only connections using TLS version 1.2 and lower are affected. There is currently no setting that controls the cipher choices used by TLS version 1.3 connections.

Default: default

server_tls13_ciphers #

Allowed TLS v1.3 ciphers. When empty it will use the value of server_tls_ciphers. Allowed values: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256, TLS_AES_128_CCM_8_SHA256, TLS_AES_128_CCM_SHA256.

Only connections using TLS version 1.3 and higher are affected. For versions 1.2 and lower, see server_tls_ciphers.

Default: <empty>

Dangerous Timeouts #

Setting the following timeouts can cause unexpected errors.

query_timeout #

Queries running longer than that are canceled. This should be used only with a slightly smaller server-side statement_timeout, to apply only for network problems. [seconds]

Default: 0.0 (disabled)

query_wait_timeout #

Maximum time queries are allowed to spend waiting for execution. If the query is not assigned to a server during that time, the client is disconnected. The 0 value disables this parameter. If this is disabled, clients will be queued indefinitely. [seconds]

This setting is used to prevent unresponsive servers from grabbing up connections. It also helps when the server is down or rejects connections for any reason.

Default: 120.0

cancel_wait_timeout #

Maximum time cancellation requests are allowed to spend waiting for execution. If the cancel request is not assigned to a server during that time, the client is disconnected. The value of 0 disables this setting. If this is disabled, cancel requests will be queued indefinitely. [seconds]

This setting is used to prevent a client locking up when a cancel cannot be forwarded due to the server being down.

Default: 10.0

client_idle_timeout #

Client connections idling longer than this many seconds are closed. This should be larger than the client-side connection lifetime settings, and only used for network problems. [seconds]

Default: 0.0 (disabled)

idle_transaction_timeout #

If a client has been in the idle in transaction state longer, it will be disconnected. [seconds]

Default: 0.0 (disabled)

transaction_timeout #

If a client has been in the in transaction state longer, it will be disconnected. [seconds]

Default: 0.0 (disabled)

suspend_timeout #

How long to wait for buffer flush during SUSPEND or reboot (-R). A connection is dropped if the flush does not succeed. [seconds]

Default: 10

Low-Level Network Settings #

pkt_buf #

Internal buffer size for packets. Affects size of TCP packets sent and general memory usage. Actual libpq packets can be larger than this, so no need to set it large.

Default: 4096

max_packet_size #

Maximum size for Postgres Pro packets that pgbouncer allows through. One packet is either one query or one result set row. The full result set can be larger.

Default: 2147483647

listen_backlog #

The value of the backlog argument for listen(). Determines how many new unanswered connection attempts are kept in the queue. When the queue is full, further new connections are dropped.

Default: 128

sbuf_loopcnt #

How many times to process data on one connection, before proceeding. Without this limit, one connection with a big result set can stall pgbouncer for a long time. One loop processes one pkt_buf amount of data. 0 means no limit.

Default: 5

so_reuseport #

Specifies whether to set the socket option SO_REUSEPORT on TCP listening sockets. On some operating systems, this allows running multiple pgbouncer instances on the same host listening on the same port and having the kernel distribute the connections automatically. This option is a way to get pgbouncer to use more CPU cores. (pgbouncer is single-threaded and uses one CPU core per instance.)

This setting has the desired effect on Linux. On systems that don't support the socket option at all, turning this setting on will result in an error.

Each pgbouncer instance on the same host needs different settings for at least unix_socket_dir and pidfile, as well as logfile if that is used. Also note that if you make use of this option, you can no longer connect to a specific pgbouncer instance via TCP/IP, which might have implications for monitoring and metrics collection.

To make sure query cancellations keep working, you should set up pgbouncer peering between the different pgbouncer processes. For details see the peer_id configuration option and the [peers] configuration section. There's also an example that uses peering and so_reuseport in the Examples section.

Default: 0

tcp_defer_accept #

Sets the TCP_DEFER_ACCEPT socket option; see man 7 tcp for details. (This is a Boolean option: 1 means enabled. The actual value set if enabled is currently hardcoded to 45 seconds.)

This is currently only supported on Linux.

Default: 1 on Linux, otherwise 0

tcp_socket_buffer #

Default: not set

tcp_keepalive #

Turns on basic keepalive with OS defaults.

On Linux, the system defaults are tcp_keepidle=7200, tcp_keepintvl=75, tcp_keepcnt=9. They are probably similar on other operating systems.

Default: 1

tcp_keepcnt #

Default: not set

tcp_keepidle #

Default: not set

tcp_keepintvl #

Default: not set

tcp_user_timeout #

Sets the TCP_USER_TIMEOUT socket option. This specifies the maximum amount of time in milliseconds that transmitted data may remain unacknowledged before the TCP connection is forcibly closed. If set to 0, then operating system's default is used.

This is currently only supported on Linux.

Default: 0

Section [databases] #

The section [databases] defines the names of the databases that clients of pgbouncer can connect to and specifies where those connections will be routed. The section contains key=value lines like

dbname = connection string

where the key will be taken as a database name and the value as a connection string, consisting of key=value pairs of connection parameters, described below (similar to libpq, but the actual libpq is not used and the set of available features is different).

Example:

foodb = host=host1.example.com port=5432
bardb = host=localhost dbname=bazdb

The database name can contain characters _0-9A-Za-z without quoting. Names that contain other chars need to be quoted with standard SQL ident quoting: double quotes where "" is taken as single quote.

The database name pgbouncer is reserved for the admin console and cannot be used as a key here.

* acts as fallback database: if the exact name does not exist, its value is taken as connection string for the requested database. For example, if there is the following entry (and no other overriding entries):

* = host=foo

In this case, a connection to pgbouncer specifying a database bar will effectively behave as if the following entry exists (taking advantage of the default for dbname being the client-side database name):

bar = host=foo dbname=bar

Such automatically created database entries are cleaned up if they stay idle longer than the time specified by the autodb_idle_timeout parameter.

dbname #

Destination database name.

Default: same as client-side database name

host #

Host name or IP address to connect to. Host names are resolved at connection time, the result is cached per dns_max_ttl parameter. When a host name's resolution changes, existing server connections are automatically closed when they are released (according to the pooling mode), and new server connections immediately use the new resolution. If DNS returns several results, they are used in a round-robin manner.

If the value begins with /, then a Unix socket in the file-system namespace is used. If the value begins with @, then a Unix socket in the abstract namespace is used.

A comma-separated list of host names or addresses can be specified. In that case, connections are made in a round-robin manner. (If a host list contains host names that in turn resolve via DNS to multiple addresses, the round-robin systems operate independently. This is an implementation dependency that is subject to change.) Note that in a list, all hosts must be available at all times: there are no mechanisms to skip unreachable hosts or to select only available hosts from a list or similar. (This is different from what a host list in libpq means.) Also note that this only affects how the destinations of new connections are chosen. See also the setting server_round_robin for how clients are assigned to already established server connections.

Examples:

host=localhost
host=127.0.0.1
host=2001:0db8:85a3:0000:0000:8a2e:0370:7334
host=/var/run/postgresql
host=192.168.0.1,192.168.0.2,192.168.0.3

Default: not set, meaning to use a Unix socket

port #

Default: 5432

user #

If user= is set, all connections to the destination database will be done with the specified user, meaning that there will be only one pool for this database.

Otherwise pgbouncer logs into the destination database with the client user name, meaning that there will be one pool per user.

password #

If no password is specified here, the password from the auth_file will be used for the user specified in user. Dynamic forms of password discovery such as auth_query are not currently supported.

auth_user #

Override of the global auth_user setting, if specified.

auth_query #

Override of the global auth_query setting, if specified. The entire SQL statement needs to be enclosed in single quotes.

auth_dbname #

Override of the global auth_dbname setting, if specified.

pool_size #

Set the maximum size of pools for all connections from this user. If not set, the database configuration or default_pool_size is used.

min_pool_size #

Set the minimum pool size for this database. If not set, the global min_pool_size is used.

Only enforced for pools where at least one of the following is true:

  • This entry in the [databases] section has a value set for the user key (also known as forced user)

  • There is at least one client connected to the pool

reserve_pool_size #

Set additional connections for this database. If not set, the global reserve_pool_size is used. For backwards compatibility reasons reserve_pool is an alias for this option.

connect_query #

Query to be executed after a connection is established, but before allowing the connection to be used by any clients. If the query raises errors, they are logged but ignored otherwise.

pool_mode #

Set the pool mode specific to this database. If not set, the default pool_mode is used.

load_balance_hosts #

When a comma-separated list is specified in host, load_balance_hosts controls which entry is chosen for a new connection.

Note

This setting currently only controls the load balancing behaviour when providing multiple hosts in the connection string, but not when a single host's DNS record references multiple IP addresses.

Allowed values:

  • round-robin — A new connection attempt chooses the next host entry in the list.

  • disable — A new connection continues using the same host entry until a connection fails, after which the next host entry is chosen.

It is recommended to set server_login_retry lower than the default to ensure fast retries when multiple hosts are available.

Default: round-robin

max_db_connections #

Configure a database-wide maximum of server connections (i.e. all pools within the database will not have more than this many server connections).

max_db_client_connections #

Configure a database-wide client connection maximum. Should be used in conjunction with max_client_conn to limit the number of connections that pgbouncer is allowed to accept.

server_lifetime #

Configure the server_lifetime per database. If not set, the database will fall back to the instance-wide configured value for server_lifetime.

client_encoding #

Ask specific client_encoding from server.

datestyle #

Ask specific datestyle from server.

timezone #

Ask specific timezone from server.

Section [users] #

This section contains key=value lines like

user1 = settings

where the key will be taken as a user name and the value as a list of configuration settings specific for this user.

Example:

user1 = pool_mode=session

Only a few settings are available here. Note that when auth_file is configured, if a user is defined in this section but not listed in auth_file, pgbouncer will attempt to use auth_query to find a password for that user if auth_user is set. If auth_user is not set, pgbouncer will pretend the user exists and fail to return "no such user" messages to the client, but neither will it accept any provided password.

pool_size #

Set the maximum size of pools for all connections from this user. If not set, the database or default_pool_size is used.

reserve_pool_size #

Set the number of additional connections to allow to a pool for this user. If not set, the database configuration or the global reserve_pool_size is used.

pool_mode #

Set the pool mode to be used for all connections from this user. If not set, the database or default pool_mode is used.

max_user_connections #

Configure a maximum for the user of server connections (i.e. all pools with the user will not have more than this many server connections).

query_timeout #

The maximum number of seconds that a user query can run for. If set, this timeout overrides the server-level query_timeout.

idle_transaction_timeout #

The maximum number of seconds that a user can have an idle transaction open. If set, this timeout overrides the server-level idle_transaction_timeout.

transaction_timeout #

The maximum number of seconds that a user can have a transaction open. If set, this timeout overrides the server-level transaction_timeout.

client_idle_timeout #

The maximum amount of time in seconds that a client is allowed to idly connect to the pgbouncer instance. If set, this timeout overrides the server-level client_idle_timeout.

Note

This is a potentially dangerous timeout.

max_user_client_connections #

The maximum for the user of client connections. This is the user equivalent of the max_client_conn setting.

Section [peers] #

This section defines the peers that pgbouncer can forward cancellation requests to and where those cancellation requests will be routed.

pgbouncer processes can be peered together in a group by defining a peer_id value and a [peers] section in the configs of all the pgbouncer processes. These pgbouncer processes can then forward cancellation requests to the process that it originated from. This is needed to make cancellations work when multiple pgbouncer processes (possibly on different servers) are behind the same TCP load balancer. Cancellation requests are sent over different TCP connections than the query they are cancelling, so a TCP load balancer might send the cancellation request connection to a different process than the one that it was meant for. By peering them these cancellation requests eventually end up at the right process.

The section contains key=value lines like

peer_id = connection string

where the key will be taken as a peer_id and the value as a connection string, consisting of key=value pairs of connection parameters, described below (similar to libpq, but the actual libpq is not used and the set of available features is different).

Example:

1 = host=host1.example.com
2 = host=/tmp/pgbouncer-2  port=5555

Note

For peering to work, the peer_id of each pgbouncer process in the group must be unique within the peered group. And the [peers] section should contain entries for each of those peer IDs. An example can be found in the Examples section. It is allowed, but not necessary, for the [peers] section to contain the peer_id of the pgbouncer that the config is for. Such an entry will be ignored, but it is allowed to make config management easier. Because it allows using the exact same [peers] section for multiple configs.

host #

Host name or IP address to connect to. Host names are resolved at connection time, the result is cached per dns_max_ttl parameter. If DNS returns several results, they are used in a round-robin manner. But in general it's not recommended to use a hostname that resolves to multiple IPs, because then the cancel request might still be forwarded to the wrong node and it would need to be forwarded again (which is only allowed up to three times).

If the value begins with /, then a Unix socket in the file-system namespace is used. If the value begins with @, then a Unix socket in the abstract namespace is used.

Examples:

host=localhost
host=127.0.0.1
host=2001:0db8:85a3:0000:0000:8a2e:0370:7334
host=/var/run/pgbouncer-1

port #

Default: 6432

pool_size #

If not set, the default_pool_size is used.

Include Directive #

The pgbouncer configuration file can contain include directives, which specify another configuration file to read and process. This allows splitting the configuration file into physically separate parts. The include directives look like this:

%include filename

If the filename is not an absolute path, it is taken as relative to the current working directory.

Authentication File Format #

This section describes the format of the file specified by the auth_file setting. It is a text file in the following format:

"username1" "password" ...
"username2" "md5abcdef012342345" ...
"username2" "SCRAM-SHA-256$iterations:salt$storedkey:serverkey"

There should be at least two fields, surrounded by double quotes. The first field is the user name and the second is either a plain-text, a MD5-hashed password, or a SCRAM secret. pgbouncer ignores the rest of the line. Double quotes in a field value can be escaped by writing two double quotes.

Postgres Pro MD5-hashed password format:

"md5" + md5(password + username)

So user admin with password 1234 will have MD5-hashed password md545f2603610af569b6155c45067268c6b.

Postgres Pro SCRAM secret format:

SCRAM-SHA-256$iterations:salt$storedkey:serverkey

The passwords or secrets stored in the authentication file serve two purposes. First, they are used to verify the passwords of incoming client connections, if a password-based authentication method is configured. Second, they are used as the passwords for outgoing connections to the backend server, if the backend server requires password-based authentication (unless the password is specified directly in the database's connection string).

If the password is stored in plain text, it can be used for any password-based authentication used in the backend server: plain text, MD5 or SCRAM (see Section 20.5 for details).

MD5-hashed passwords can be used if backend server uses MD5 authentication (or specific users have MD5-hashed passwords).

SCRAM secrets can only be used for logging into a server if the client authentication also uses SCRAM, the pgbouncer database definition does not specify a user name, and the SCRAM secrets are identical in pgbouncer and the Postgres Pro server (same salt and iterations, not merely the same password). This is due to an inherent security property of SCRAM: the stored SCRAM secret cannot by itself be used for deriving login credentials.

The authentication file can be written by hand, but it's also useful to generate it from some other list of users and passwords. See ./etc/mkauth.py for a sample script to generate the authentication file from the pg_authid system table. Alternatively, use auth_query instead of auth_file to avoid having to maintain a separate authentication file.

Mind the note below on managed servers.

If the backend server is configured to use SCRAM password authentication, pgbouncer cannot successfully authenticate if it does not know either user password in plain text or corresponding SCRAM secret.

Some cloud providers (i.e. AWS RDS) prohibit access to Postgres Pro sensitive system tables for fetching passwords. Even for the most privileged user (i.e. member of rds_superuser) the SELECT * FROM pg_authid; returns ERROR: permission denied for table pg_authid. That is a known behaviour (see https://aws.amazon.com/blogs/database/best-practices-for-migrating-postgresql-databases-to-amazon-rds-and-amazon-aurora/ for details).

Therefore, fetching an existing SCRAM secret once it has been stored in a managed server is impossible which makes it hard to configure pgbouncer to use the same SCRAM secret. Nevertheless, SCRAM secret can still be configured and used on both sides using the following trick:

Generate SCRAM secret for arbitrary password with a tool that is capable of printing out the secret. For example psql --echo-hidden and the command \password prints out the SCRAM secret to the console before sending it over to the server.

$ psql --echo-hidden <connection_string>
postgres=# \password <role_name>
Enter new password for user "<role_name>":
Enter it again:
********* QUERY **********
ALTER USER <role_name> PASSWORD 'SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>'
**************************

Note down the SCRAM secret from the QUERY and set it in pgbouncer's userlist.txt.

If you used a tool other than psql --echo-hidden then you need to set the SCRAM secret also in the server (you can use alter role <role_name> password '<scram_secret>' for that).

HBA File Format #

The location of the HBA file is specified by the setting auth_hba_file. It is only used if auth_type is set to hba.

The file follows the format of the Postgres Pro pg_hba.conf file described in Section 20.1.

  • Supported record types: local, host, hostssl, hostnossl.

  • Database field: Supports all, replication, sameuser, @file, multiple names. Not supported: samerole, samegroup.

  • User name field: Supports all, @file, multiple names. Not supported: +groupname.

  • Address field: Supports all, IPv4, IPv6. Not supported: samehost, samenet, DNS names, domain prefixes.

  • Auth-method field: Only methods supported by pgbouncer's auth_type are supported, plus peer and reject, but except any and pam, which only work globally. User name map (map=) parameter is supported when auth_type is cert or peer.

  • User name map ('map=') parameter is supported when auth_type is cert or peer.

Ident Map File Format #

The location of the ident map file is specified by the setting auth_ident_file. It is only loaded if auth_type is set to hba.

The file format is a simplified variation of the Postgres Pro ident map file (see Section 20.2 for details):

  • Supported lines are only of the form map-name system-username database-username.

  • There is no support for including file/directory.

  • System-username field: Not supported: regular expressions.

  • Database-username field: Supports all or a single Postgres Pro user name. Not supported: +groupname, regular expressions.

Examples #

Small example configuration:

[databases]
template1 = host=localhost dbname=template1 auth_user=someuser

[pgbouncer]
pool_mode = session
listen_port = 6432
listen_addr = localhost
auth_type = md5
auth_file = users.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = someuser
stats_users = stat_collector

Database examples:

[databases]

; foodb over Unix socket
foodb =

; redirect bardb to bazdb on localhost
bardb = host=localhost dbname=bazdb

; access to destination database will go with single user
forcedb = host=localhost port=300 user=baz password=foo client_encoding=UNICODE datestyle=ISO

Example of a secure function for auth_query:

CREATE OR REPLACE FUNCTION pgbouncer.user_lookup(in i_username text, out uname text, out phash text)
RETURNS record AS $$
BEGIN
    SELECT rolname, CASE WHEN rolvaliduntil < now() THEN NULL ELSE rolpassword END
    FROM pg_authid
    WHERE rolname=i_username AND rolcanlogin
    INTO uname, phash;
    RETURN;
END;
$$ LANGUAGE plpgsql
   SECURITY DEFINER
   -- Set a secure search_path: trusted schema(s), then 'pg_temp'.
   SET search_path = pg_catalog, pg_temp;
REVOKE ALL ON FUNCTION pgbouncer.user_lookup(text) FROM public, pgbouncer;
GRANT EXECUTE ON FUNCTION pgbouncer.user_lookup(text) TO pgbouncer;

Example configs for 2 peered pgbouncer processes to create a multi-core pgbouncer setup using so_reuseport.

The config for the first process:

[databases]
postgres = host=localhost dbname=postgres

[peers]
1 = host=/tmp/pgbouncer1
2 = host=/tmp/pgbouncer2

[pgbouncer]
listen_addr=127.0.0.1
auth_file=auth_file.conf
so_reuseport=1
unix_socket_dir=/tmp/pgbouncer1
peer_id=1

The config for the second process:

[databases]
postgres = host=localhost dbname=postgres

[peers]
1 = host=/tmp/pgbouncer1
2 = host=/tmp/pgbouncer2

[pgbouncer]
listen_addr=127.0.0.1
auth_file=auth_file.conf
so_reuseport=1
; only unix_socket_dir and peer_id are different
unix_socket_dir=/tmp/pgbouncer2
peer_id=2
FAQ