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). Базовая настройка и использование демонстрируются ниже.
Создайте файл
pgbouncer.ini. Подробнее он описывается на странице manpgbouncer(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
Создайте файл
userlist.txtсо списком пользователей, которым разрешено подключение:"некоторый_пользователь" "его_пароль_на_сервере"
Запустите pgbouncer:
$ pgbouncer -d pgbouncer.ini
Примечание
Эта команда не работает в системах Windows. Вместо этого pgbouncer должен запускаться в виде службы, которую необходимо сначала зарегистрировать следующим образом:
pgbouncer --regservice
Сделайте так, чтобы ваше приложение (или клиент
psql) подключалось к pgbouncer, а не к серверу Postgres Pro непосредственно:$ psql -p 6432 -U someuser template1
Для управления 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 [...]
Если вы вносили изменения в файл
pgbouncer.ini, его можно перезагрузить командой:pgbouncer=# RELOAD;
Настройка LDAP-аутентификации #
pgbouncer поддерживает LDAP-аутентификацию пользователей СУБД. LDAP-аутентификацию можно настроить с помощью PAM (Pluggable Authentication Modules, подключаемые модули аутентификации).
В этом разделе представлен пример настройки LDAP-аутентификации.
Чтобы включить LDAP-аутентификацию через pgbouncer, выполните следующие шаги:
Убедитесь, что выполнены все предварительные требования.
Предварительные требования #
Прежде чем приступить к настройке LDAP, убедитесь, что все необходимые пакеты установлены. При необходимости установите недостающие пакеты.
Чтобы убедиться, что установленный pgbouncer содержит библиотеку PAM (
libpam), воспользуйтесь утилитой ldd:$ ldd /usr/sbin/pgbouncer | grep pam libpam.so.0 => /lib64/libpam.so.0 (0x00007fb5d6dd7000)
Убедитесь, что в системе присутствует модуль pam_ldap:
$ find / -type f -name pam_ldap.so 2>/dev/null /usr/lib64/security/pam_ldap.so
(Необязательно) При необходимости установите pam_ldap:
apt-get install pam_ldap
Настройка Postgres Pro #
В экземпляре Postgres Pro Enterprise создайте пользователя для проверки LDAP-аутентификации:
CREATE USER testuser WITH PASSWORD '
пароль_пользователя_testuser';В файле
pg_hba.confукажите строку подключения для пользователяtestuser. Например:host all testuser 0.0.0.0/0 ldap ldapurl=
uri_сервера_ldapldapbasedn="CN=testuser,CN=Users,DC=postgrespro,DC=ru" ldapbinddn="CN=служебный_пользователь,CN=Users,DC=postgrespro,DC=ru" ldapbindpasswd="пароль_служебного_пользователя" ldapsearchattribute=CNЗа подробной информацией о параметрах конфигурации LDAP-аутентификации обратитесь к Разделу 20.10.
В итоге аутентификация работает следующим образом:
Пользователь подключается к Postgres Pro как
testuser.Postgres Pro подключается к LDAP-серверу по адресу
ldapurlс помощью учётной записиldapbinddnи пароляldapbindpasswd.В
ldapbasednPostgres Pro ищет объект, где атрибутldapsearchattribute— этоtestuser.Postgres Pro проверяет пароль
testuserчерез LDAP.
Примечание
В продуктивной среде рекомендуется указывать контейнер или OU (OrganizationalUnitName, название отдела или подразделения) в качестве значения ldapbasedn (например CN=Users,DC=postgrespro,DC=ru), чтобы имя пользователя не жёстко прописывалось, а выполнялся его поиск через атрибут ldapsearchattribute.
Настройка pgbouncer #
В файле конфигурации 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
Запустите и активируйте pgbouncer:
systemctl enable --now pgbouncer
Настройка PAM #
В каталоге
/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. В этом случае он используется для проверки пароля, а не для проверки статуса учётной записи.
Настройте файл конфигурации модуля, размещённый в
/etc/pam_ldap.conf. Пример конфигурации выглядит следующим образом:host
сервер_ldapbase 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-записи пользователя, который будет сравниваться с указанным именем пользователя.
Проверка подключения #
Подключитесь к экземпляру СУБД через LDAP:
psql -h 127.0.0.1 -U testuser -d postgres
Подключитесь к экземпляру СУБД через 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Вывести короткую справку.
--regserviceWin32: Зарегистрировать pgbouncer в качестве службы Windows. Имя службы будет определяться значением параметра конфигурации
service_name.--unregserviceWin32: Разрегистрировать службу 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.addrIP-адрес сервера Postgres Pro.
portПорт сервера Postgres Pro.
local_addrИсходный адрес подключения на локальной машине.
local_portИсходный порт подключения на локальной машине.
connect_timeВремя установления подключения.
request_timeВремя выдачи последнего запроса.
waitНе используется для серверных подключений.
wait_usНе используется для серверных подключений.
close_needed1, если соединение будет закрыто при ближайшей возможности в связи с выполнением команды
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.addrIP-адрес клиента.
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_hostsload_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_hostsload_balance_hostsдля базы данных, если параметр host содержит разделённый запятыми список.max_connectionsМаксимально возможное число серверных подключений для этой базы, установленное параметром
max_db_connectionsлибо глобально, либо на уровне базы данных.current_connectionsТекущее число серверных подключений для этой базы данных.
max_client_connectionsМаксимально возможное число клиентских подключений для этого экземпляра pgbouncer, аналогичное значению параметра
max_db_client_connectionsдля базы данных.current_client_connectionsТекущее число клиентских подключений для этой базы данных.
paused1, если база данных находится в состоянии паузы, иначе — 0.
disabled1, если база данных находится в отключённом состоянии, иначе — 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База данных подключения, занимающего этот ФД.
addrIP-адрес подключения, занимающего данный ФД;
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 выполнялись на одном узле, однако это необязательное условия. Чтобы избежать простоя в ходе перезапуска, процессы перезапускаются друг за другом. При перезапуске следующего процесса остальные работают и принимают подключения.
Выберите процесс, которые будет перезапускаться первым. Назовём его процесс А.
Выполните команду
SHUTDOWN WAIT_FOR_CLIENTS(или командуSIGTERM) в процессе А.Заставьте всех клиентов переподключиться. Переподключение может начаться не сразу из-за параметра
server_idle_timeout, заданного для пула соединений на стороне клиента (или аналогичного параметра конфигурации). Если пул соединений на стороне клиента не используется, может произойти перезапуск клиентов. После переподключения всех клиентов, процесс А автоматически завершается, поскольку у него больше нет активных клиентских подключений.Запустите процесс А снова.
Повторите шаги 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, но не само поле.По умолчанию:
IntervalStyleignore_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.
По умолчанию:
pgbouncerjob_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, а для TCP — TLS.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 rolcanloginauth_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.По умолчанию:
daemonlog_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 ALLserver_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).По умолчанию:
secureclient_tls_ciphers#Определяет допустимые шифры TLS в синтаксисе OpenSSL. Допустимые краткие значения:
default/secure/fast/normal(используются системные значения OpenSSL по умолчанию),all(допускаются все шифры, не рекомендуется).Распространяется только на соединения, использующие TLS версии 1.2 и ниже. В настоящее время нет параметра, который бы управлял выбором шифров при использовании TLS версии 1.3.
По умолчанию:
defaultclient_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), имя кривой.По умолчанию:
autoclient_tls_dheparams#Тип обмена ключами DHE.
Допустимые значения:
none(DH отключён),auto(2048-битный DH),legacy(1024-битный DH).По умолчанию:
autoserver_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).По умолчанию:
secureserver_tls_ciphers#Определяет допустимые шифры TLS в синтаксисе OpenSSL. Допустимые краткие значения:
default/secure/fast/normal(используются системные значения OpenSSL по умолчанию),all(допускаются все шифры, не рекомендуется).Распространяется только на соединения, использующие TLS версии 1.2 и ниже. В настоящее время нет параметра, который бы управлял выбором шифров при использовании TLS версии 1.3.
По умолчанию:
defaultserver_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-robinmax_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.
Create a
pgbouncer.inifile. Details in thepgbouncer(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
Create a
userlist.txtfile that contains the users allowed in:"someuser" "same_password_as_in_server"
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
Have your application (or the
psqlclient) connect to pgbouncer instead of directly to the Postgres Pro server:$ psql -p 6432 -U someuser template1
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 [...]
If you made changes to the
pgbouncer.inifile, 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:
Ensure you fulfill all the required prerequisites.
Prerequisites #
Before you start LDAP configuration, ensure that you have all required packages installed. If required, install any missing packages.
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)
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
(Optional) If necessary, install pam_ldap:
apt-get install pam_ldap
Configuring Postgres Pro #
In your Postgres Pro Enterprise instance, create a test user for LDAP authentication:
CREATE USER testuser WITH PASSWORD '
testuser_password';In the
pg_hba.conffile, specify the connection string fortestuser. For example:host all testuser 0.0.0.0/0 ldap ldapurl=
ldap_server_urildapbasedn="CN=testuser,CN=Users,DC=postgrespro,DC=ru" ldapbinddn="CN=service_user,CN=Users,DC=postgrespro,DC=ru" ldapbindpasswd="service_user_password" ldapsearchattribute=CNFor more information about LDAP authentication configuration options, see Section 20.10.
As a result, the authentication operates as follows:
A user connects to Postgres Pro as
testuser.Postgres Pro connects to the LDAP server at
ldapurlusingldapbinddnandldapbindpasswd.In
ldapbasedn, Postgres Pro searches for an object whereldapsearchattributeistestuser.Postgres Pro verifies the
testuserpassword 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 #
In the pgbouncer.ini configuration file, specify the
auth_type = pamauthentication 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
Enable and activate pgbouncer:
systemctl enable --now pgbouncer
Configuring PAM #
In the
/etc/pam.d/directory, create a separatepgbouncerconfiguration 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.soentry:authis the authentication phase where the user password is verified.requiredis 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.sois the module that communicates with LDAP and validates the specified username and password.
in the
account required pam_ldap.soentry:accountis 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.requiredis a control flag. It means that if LDAP returns the “account invalid” error, the authentication fails.pam_ldap.sois the same LDAP module. However, here it is used for password verification rather than for account state check.
Configure the module configuration file located at
/etc/pam_ldap.conf. The configuration example looks as follows:host
ldap_serverbase CN=Users,DC=postgrespro,DC=ru binddn CN=service_user,CN=Users,DC=postgrespro,DC=ru bindpwservice_user_passwordtimelimit 5 bind_timelimit 5 pam_login_attribute CNParameter descriptions:
hostis the LDAP server(s) the client connects to.baseis the base DN (distinguished name) where all search queries in the directory begin.binddnis the DN of the service account used by PAM to connect to LDAP for user searches.bindpwis the password for thebinddnaccount.timelimitis the time limit (in seconds) for executing LDAP queries.bind_timelimitis the timeout (in seconds) for binding with the LDAP server.pam_login_attributeis the attribute of the LDAP user entry that will be compared to the specified username.
Testing Connection #
Connect to your DBMS instance via LDAP:
psql -h 127.0.0.1 -U testuser -d postgres
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, --daemonRun in the background. Without it, the process will run in the foreground. In daemon mode, setting
pidfileas well aslogfileorsyslogis 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, --rebootNote
This option is deprecated. Instead of this option use a rolling restart with multiple pgbouncer processes listening on the same port using
so_reuseportinstead.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_diris not disabled in configuration. Does not work on Windows. Does not work with TLS connections, they are dropped.-uuser, --useruserSwitch to the given user on startup.
-v, --verboseIncrease verbosity. Can be used multiple times.
-q, --quietBe quiet: do not log to stderr. This does not affect logging verbosity, only that stderr is not to be used. For use in
init.dscripts.-V, --versionShow version.
-h, --helpShow short help.
--regserviceWin32: Register to run as Windows service. The
service_nameconfiguration parameter value is used as the name to register under.--unregserviceWin32: 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.
databaseStatistics are presented per database.
total_xact_countTotal number of SQL transactions pooled by pgbouncer.
total_query_countTotal number of SQL commands pooled by pgbouncer.
total_server_assignment_countTotal times a server was assigned to a client.
total_receivedTotal volume in bytes of network traffic received by pgbouncer.
total_sentTotal volume in bytes of network traffic sent by pgbouncer.
total_xact_timeTotal number of microseconds spent by pgbouncer when connected to Postgres Pro in a transaction, either idle in transaction or executing queries.
total_query_timeTotal number of microseconds spent by pgbouncer when actively connected to Postgres Pro, executing queries.
total_wait_timeTime spent by clients waiting for a server, in microseconds. Updated when a client connection is assigned a backend connection.
total_client_parse_countTotal number of prepared statements created by clients. Only applicable in named prepared statement tracking mode, see
max_prepared_statements.total_server_parse_countTotal number of prepared statements created by pgbouncer on a server. Only applicable in named prepared statement tracking mode, see
max_prepared_statements.total_bind_countTotal 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_countAverage transactions per second in last stat period.
avg_query_countAverage queries per second in last stat period.
avg_server_assignment_countAverage number of times a server is assigned to a client per second in the last stat period.
avg_recvAverage received (from clients) bytes per second.
avg_sentAverage sent (to clients) bytes per second.
avg_xact_timeAverage transaction duration, in microseconds.
avg_query_timeAverage query duration, in microseconds.
avg_wait_timeTime 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_countAverage number of prepared statements created by clients. Only applicable in named prepared statement tracking mode, see
max_prepared_statements.avg_server_parse_countAverage number of prepared statements created by pgbouncer on a server. Only applicable in named prepared statement tracking mode, see
max_prepared_statements.total_bind_countAverage 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 #
typeS, for server.
userUser name pgbouncer uses to connect to server.
databaseDatabase name.
replicationIf server connection uses replication. Can be
none,logicalorphysical.stateState of the pgbouncer server connection, one of
active,idle,used,tested,new,active_cancel, orbeing_canceled.addrIP address of Postgres Pro server.
portPort of Postgres Pro server.
local_addrConnection start address on local machine.
local_portConnection start port on local machine.
connect_timeWhen the connection was made.
request_timeWhen last request was issued.
waitNot used for server connections.
wait_usNot used for server connections.
close_needed1 if the connection will be closed as soon as possible, because a configuration file reload or DNS update changed the connection information or
RECONNECTwas issued.ptrAddress of internal object for this connection. Used as unique ID.
linkAddress of client connection the server is paired with.
remote_pidPID 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.
tlsA string with TLS connection information, or empty if not using TLS.
application_nameA string containing the
application_nameset on the linked client connection, or empty if this is not set, or if there is no linked connection.prepared_statementsThe amount of prepared statements that are prepared on the server. This number is limited by the
max_prepared_statementssetting.idUnique ID for server.
SHOW CLIENTS #
typeC, for client.
userClient connected user.
databaseDatabase name.
replicationIf client connection uses replication. Can be
none,logicalorphysical.stateState 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, orwaiting_cancel_req.addrIP address of the client.
portSource port of the client.
local_addrConnection end address on local machine.
local_portConnection end port on local machine.
connect_timeTimestamp of connect time.
request_timeTimestamp of latest client request.
waitCurrent waiting time in seconds.
wait_usMicrosecond part of the current waiting time.
close_neededNot used for clients.
ptrAddress of internal object for this connection. Used as unique ID.
linkAddress of server connection the client is paired with.
remote_pidProcess ID, in case client connects over Unix socket and OS supports getting it.
tlsA string with TLS connection information, or empty if not using TLS.
application_nameA string containing the
application_nameset by the client for this connection, or empty if this is not set.prepared_statementsThe amount of prepared statements that the client has prepared.
idUnique ID for client.
SHOW POOLS #
A new pool entry is made for each couple of (database, user).
databaseDatabase name.
userUser name.
cl_activeClient connections that are either linked to server connections or are idle with no queries waiting to be processed.
cl_waitingClient connections that have sent queries but have not yet got a server connection.
cl_active_cancel_reqClient connections that have forwarded query cancellations to the server and are waiting for the server response.
cl_waiting_cancel_reqClient connections that have not forwarded query cancellations to the server yet.
sv_activeServer connections that are linked to a client.
sv_active_cancelServer connections that are currently forwarding a cancel request.
sv_being_canceledServers 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_idleServer connections that are unused and immediately usable for client queries.
sv_usedServer connections that have been idle for more than
server_check_delay, so they needserver_check_queryto run on them before they can be used again.sv_testedServer connections that are currently running either
server_reset_queryorserver_check_query.sv_loginServer connections currently in the process of logging in.
maxwaitHow 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_sizesetting.maxwait_usMicrosecond part of the maximum waiting time.
pool_modeThe pooling mode in use.
load_balance_hostsThe
load_balance_hostsin 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.
databaseID of the configured peer entry.
cl_active_cancel_reqClient connections that have forwarded query cancellations to the server and are waiting for the server response.
cl_waiting_cancel_reqClient connections that have not forwarded query cancellations to the server yet.
sv_active_cancelServer connections that are currently forwarding a cancel request.
sv_loginServer connections currently in the process of logging in.
SHOW LISTS #
Show following internal information, in columns (not rows):
databasesCount of databases.
usersCount of users.
poolsCount of pools.
free_clientsCount 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_clientsCount of used clients.
login_clientsCount of clients in
loginstate.free_serversCount 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_serversCount of used servers.
dns_namesCount of DNS names in the cache.
dns_zonesCount of DNS zones in the cache.
dns_queriesCount of in-flight DNS queries.
dns_pendingNot used.
SHOW USERS #
nameThe user name.
pool_sizeThe user's override
pool_size, orNULLif not set.reserve_pool_sizeThe user's override
reserve_pool_size, orNULLif not set.pool_modeThe user's override
pool_mode, orNULLif not set.max_user_connectionsThe user's
max_user_connectionssetting. If this setting is not set for this specific user, then the default value will be displayed.current_connectionsCurrent number of server connections that this user has open to all servers.
max_user_client_connectionsThe user's
max_user_client_connectionssetting. If this setting is not set for this specific user, then the default value will be displayed.current_client_connectionsCurrent number of client connections that this user has open to pgbouncer.
SHOW DATABASES #
nameName of configured database entry.
hostHost pgbouncer connects to.
portPort pgbouncer connects to.
databaseActual database name pgbouncer connects to.
force_userWhen 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_sizeMaximum number of server connections.
min_pool_sizeMinimum number of server connections.
reserve_pool_sizeMaximum number of additional connections for this database.
server_lifetimeThe maximum lifetime of a server connection for this database.
pool_modeThe database's override
pool_mode, orNULLif the default will be used instead.load_balance_hostsThe database's
load_balance_hostsif the host contains a comma-separated list.max_connectionsMaximum number of allowed server connections for this database, as set by
max_db_connections, either globally or per database.current_connectionsCurrent number of server connections for this database.
max_client_connectionsMaximum number of allowed client connections for this pgbouncer instance, as set by
max_db_client_connectionsper database.current_client_connectionsCurrent number of client connections for this database.
paused1 if this database is currently paused, else 0.
disabled1 if this database is currently disabled, else 0.
SHOW PEERS #
peer_idID of the configured peer entry.
hostHost pgbouncer connects to.
portPort pgbouncer connects to.
pool_sizeMaximum 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.
fdFile descriptor numeric value.
taskOne of
pooler,clientorserver.userUser of the connection using the FD.
databaseDatabase of the connection using the FD.
addrIP address of the connection using the FD,
unixif a Unix socket is used.portPort used by the connection using the FD.
cancelCancel key for this connection.
linkFile descriptor for corresponding server/client.
NULLif 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:
keyConfiguration variable name.
valueConfiguration value.
defaultConfiguration default value.
changeableEither
yesorno, shows if the variable can be changed while running. Ifno, the variable can be changed only at boot-time. UseSETto 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.
hostnameHost name.
ttlHow many seconds until next lookup.
addrsComma separated list of addresses.
SHOW DNS_ZONES #
Show DNS zones in cache.
zonenameZone name.
serialCurrent serial.
countHost 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.
Pick a process to restart first, let's call it A.
Run
SHUTDOWN WAIT_FOR_CLIENTS(or sendSIGTERM) to process A.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.Start process A again.
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 #
SIGHUPReload config. Same as issuing the command
RELOADon the console.SIGTERMSuper safe shutdown. Wait for all existing clients to disconnect, but don't accept new connections. This is the same as issuing
SHUTDOWN WAIT_FOR_CLIENTSon 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".SIGINTSafe shutdown. Same as issuing
SHUTDOWN WAIT_FOR_SERVERSon 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".SIGQUITImmediate shutdown. Same as issuing
SHUTDOWNon the console.SIGUSR1Same as issuing
PAUSEon the console.SIGUSR2Same as issuing
RESUMEon the console.
Libevent Settings #
From the libevent documentation:
It is possible to disable support for
epoll,kqueue,devpoll,poll, orselectby setting the environment variableEVENT_NOEPOLL,EVENT_NOKQUEUE,EVENT_NODEVPOLL,EVENT_NOPOLLorEVENT_NOSELECT, respectively.By setting the environment variable
EVENT_SHOW_METHOD,libeventdisplays 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 orsysloghas to be set. The log file is kept open, so after rotation,kill -HUPor on consoleRELOAD;should be done. On Windows, the service must be stopped and started.Note that setting
logfiledoes not by itself turn off logging to stderr. Use the command-line option-qor-dfor that.Default: not set
pidfile#Specifies the PID file. Without
pidfileset, 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.
sessionServer is released back to pool after client disconnects. Default.
transactionServer is released back to pool after transaction finishes.
statementServer 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
ulimitin your favorite shell man page. Note:ulimitdoes 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
userkey (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 betweenmax_user_connectionsandmax_user_client_connectionscan 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_stringsandapplication_nameparameters 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
postgresprotocol allows specifying parameter settings, both directly as a parameter in the startup packet, or inside theoptionsstartup packet. Parameters specified using both of these methods are supported bytrack_extra_parameters. However, it's not possible to includeoptionsitself intrack_extra_parameters, only the parameters contained inoptions.Default:
IntervalStyleignore_startup_parameters#By default, pgbouncer allows only parameters it can keep track of in startup packets:
client_encoding,datestyle,timezoneandstandard_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
postgresprotocol allows specifying parameter settings, both directly as a parameter in the startup packet, or inside theoptionsstartup packet. Parameters specified using both of these methods are supported byignore_startup_parameters. It's even possible to includeoptionsitself inignore_startup_parameters, which results in any unknown parameters contained insideoptionsto 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_idvalue 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 thepeer_idis 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_nameis later changed withSET, 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:
pgbouncerjob_name#Alias for
service_name.stats_period#Sets how often the averages shown in various
SHOWcommands are updated and how often aggregated statistics are written to the log (but seelog_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. replacingmy_prepared_statementwithPGBOUNCER_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,EXECUTEandDEALLOCATEare forwarded straight to Postgres Pro. The exception to this rule are theDEALLOCATE ALLandDISCARD ALLcommands, 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 ofpkt_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_bufparameter 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_reuseportfor 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_sizeof 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
RECONNECTon 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.
certThe client must connect over TLS connection with a valid client certificate. The user name is then taken from the
CommonNamefield from the certificate.md5Use MD5-based password check. This is the default authentication method.
auth_filemay contain both MD5-encrypted and plain-text passwords. Ifmd5is configured and a user has a SCRAM secret, then SCRAM authentication is used automatically instead.scram-sha-256Use password check with SCRAM-SHA-256.
auth_filehas 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.plainThe clear-text password is sent over the wire. Deprecated.
trustNo authentication is done. The user name must still exist in
auth_file.anyLike the
trustmethod, 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.hbaThe actual authentication type is loaded from
auth_hba_file. This allows different authentication methods for different access paths, for example: connections over Unix socket usepeerauthentication method, connections over TCP must use TLS.ldapUsers 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 theauth_hba_file.pamPluggable Authentication Modules (PAM) method is used to authenticate users,
auth_fileis ignored. This method is not compatible with databases using theauth_useroption. The service name reported to PAM ispgbouncer.pamis not supported in the HBA configuration file.
auth_hba_file#HBA configuration file to use when
auth_typeishba. See the section called “HBA File Format” for details.Default: not set
auth_ident_file#Identity map file to use when
auth_typeishbaand 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 eitherauth_fileorauth_userbe set; otherwise there would be no users defined.Default: not set
auth_user#If
auth_useris set, then any user not specified inauth_filewill be queried through theauth_queryquery frompg_authidin the database, usingauth_user. The password ofauth_userwill be taken fromauth_file. (Ifauth_userdoes not require a password, then it does not need to be defined inauth_file.)Direct access to
pg_authidrequires admin rights. It's preferable to use a non-superuser that calls aSECURITY DEFINERfunction instead.Default: not set
auth_query#Query to load user's password from database.
Direct access to
pg_authidrequires admin rights. It's preferable to use a non-superuser that calls aSECURITY DEFINERfunction 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 rolcanloginauth_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_typeisldap. (Not used if authentication is configured viaauth_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:
daemonlog_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 fromSHOWcommands.Default: 1
verbose#Increase verbosity. Mirrors the
-vswitch on the command line. For example, using-v -von the command line is the same asverbose=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_typeisany, 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
SHOWcommands exceptSHOW 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
ABORTorROLLBACK.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 ALLto just drop prepared statements, if the application does not break when some state is kept around.When transaction pooling is used, the
server_reset_queryis 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 ALLserver_reset_query_always#Whether
server_reset_queryshould be run in all pooling modes. When this setting is off (default), theserver_reset_querywill 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_queryon 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_neededmode (set byRECONNECT,RELOADthat 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
PAUSEcommand 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
SUSPENDand 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
NXDOMAINDNS 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 (
configureoption--with-cares).Default: 0.0 (disabled)
resolv_conf#The location of a custom
resolv.conffile. 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_fileandclient_tls_cert_filemust 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.disablePlain TCP. If client requests TLS, it's ignored. Default.
allowIf client requests TLS, it is used. If not, plain TCP is used. If the client presents a client certificate, it is not validated.
preferSame as
allow.requireThe client must use TLS. If not, the client connection is rejected. If the client presents a client certificate, it is not validated.
verify-caClient must use TLS with valid client certificate.
verify-fullSame 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:
secureclient_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:
defaultclient_tls13_ciphers#Allowed TLS v1.3 ciphers. When empty it will use the value of
client_tls_ciphersAllowed 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:
autoclient_tls_dheparams#DHE key exchange type.
Allowed values:
none(DH is disabled),auto(2048-bit DH),legacy(1024-bit DH).Default:
autoserver_tls_sslmode#TLS mode to use for connections to Postgres Pro servers. The default mode is
prefer.disablePlain TCP. TLS is not even requested from the server.
preferTLS connection is always requested first from Postgres Pro. If refused, the connection will be established over plain TCP. Server certificate is not validated. Default.
requireConnection must go over TLS. If server rejects it, plain TCP is not attempted. Server certificate is not validated.
verify-caConnection 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-fullConnection 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:
secureserver_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:
defaultserver_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
SUSPENDor 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
backlogargument forlisten(). 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_bufamount of data. 0 means no limit.Default: 5
so_reuseport#Specifies whether to set the socket option
SO_REUSEPORTon 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_dirandpidfile, as well aslogfileif 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_idconfiguration option and the[peers]configuration section. There's also an example that uses peering andso_reuseportin the Examples section.Default: 0
tcp_defer_accept#Sets the
TCP_DEFER_ACCEPTsocket option; seeman 7 tcpfor 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_TIMEOUTsocket 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_ttlparameter. 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_robinfor 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_filewill be used for the user specified inuser. Dynamic forms of password discovery such asauth_queryare not currently supported.auth_user#Override of the global
auth_usersetting, if specified.auth_query#Override of the global
auth_querysetting, if specified. The entire SQL statement needs to be enclosed in single quotes.auth_dbname#Override of the global
auth_dbnamesetting, 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_sizeis used.min_pool_size#Set the minimum pool size for this database. If not set, the global
min_pool_sizeis 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
userkey (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_sizeis used. For backwards compatibility reasonsreserve_poolis 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_modeis used.load_balance_hosts#When a comma-separated list is specified in
host,load_balance_hostscontrols 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 nexthostentry in the list.disable— A new connection continues using the samehostentry until a connection fails, after which the nexthostentry is chosen.
It is recommended to set
server_login_retrylower than the default to ensure fast retries when multiple hosts are available.Default:
round-robinmax_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_connto 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_encodingfrom server.datestyle#Ask specific
datestylefrom server.timezone#Ask specific
timezonefrom 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_sizeis 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_sizeis used.pool_mode#Set the pool mode to be used for all connections from this user. If not set, the database or default
pool_modeis 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_connsetting.
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_ttlparameter. 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_sizeis 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_typeare supported, pluspeerandreject, but exceptanyandpam, which only work globally. User name map (map=) parameter is supported whenauth_typeiscertorpeer.User name map ('map=') parameter is supported when
auth_typeiscertorpeer.
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
allor 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