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.
Быстрый запуск
Базовая настройка и использование демонстрируются ниже.
Создайте файл
pgbouncer.ini. Подробнее он описывается на странице manpgbouncer(5). Например:[databases] template1 = host=127.0.0.1 port=5432 dbname=template1 [pgbouncer] listen_port = 6543 listen_addr = 127.0.0.1 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 6543 -U someuser template1
Для управления pgbouncer подключитесь к специальной административной базе данных pgbouncer и выполните
SHOW HELP;, чтобы ознакомиться с его справкой:$ psql -p 6543 -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;
Параметры
-dЗапустить в фоновом режиме. Без этого указания процесс будет работать на переднем плане.
Примечание
Это не работает в Windows, там pgbouncer нужно запускать в виде службы.
-RВыполнить перезапуск на «лету». При этом pgbouncer подключается к работающему процессу, забирает у него открытые сокеты и начинает использовать их. Если активного процесса нет, он запускается в обычном режиме.
Примечание
Это работает, только если ОС поддерживает сокеты Unix и в конфигурации определён параметр
unix_socket_dir. Не работает в Windows. Также при этом не поддерживаются подключения TLS, они сбрасываются.-uпользовательПереключиться на заданного пользователя при запуске.
-vУвеличить детализацию вывода. Может использоваться неоднократно.
-qПриглушить вывод: не выводить ничего в
stdout. Заметьте, что это не влияет на уровень выводимых сообщений, а только отключает вывод вstdout. Предназначено для применения в скриптахinit.d.-VВывести версию.
-hВывести короткую справку.
--regserviceWin32: Зарегистрировать pgbouncer в качестве службы Windows. Имя службы будет определяться значением параметра конфигурации
service_name.--unregserviceWin32: Разрегистрировать службу Windows.
Административная консоль
Эта консоль доступна при обычном подключении к базе pgbouncer:
$ psql -p 6543 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_receivedОбщий объём сетевого трафика (в байтах), который получил pgbouncer.
total_sentОбщий объём сетевого трафика (в байтах), который передал pgbouncer.
total_xact_timeОбщее время (в микросекундах), в течение которого pgbouncer использовал подключения к Postgres Pro, выполняя запросы или простаивая.
total_query_timeОбщее время (в микросекундах), в течение которого pgbouncer активно использовал подключения к Postgres Pro, выполняя запросы.
total_wait_timeВремя, в течение которого клиенты ожидали ответов сервера (в микросекундах).
avg_xact_countСреднее число транзакций в секунду за последний период статистики.
avg_query_countСреднее число запросов в секунду за последний период статистики.
avg_recvСредняя скорость получения данных от клиентов (байт в секунду).
avg_sentСредняя скорость передачи данных клиентам (байт в секунду).
avg_xact_timeСредняя длительность транзакции (в микросекундах).
avg_query_timeСредняя длительность запроса (в микросекундах).
avg_wait_timeСреднее время ожидания ответов сервера в течение секунды (в микросекундах).
SHOW STATS_TOTALS
Выводит подмножество результатов SHOW STATS, включающее только суммарные значения (total_).
SHOW STATS_AVERAGES
Выводит подмножество результатов SHOW STATS, включающее только средние значения (avg_).
SHOW TOTALS
Выводит ту же статистику, что SHOW STATS, но по всем базам данных в целом.
SHOW SERVERS
type«S» для серверов
userИмя пользователя, с которым pgbouncer подключается к серверу.
databaseИмя базы данных.
stateСостояние подключения pgbouncer к серверу, один из вариантов:
active,usedилиidle.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 не используется.
SHOW CLIENTS
type«C» для клиентов.
userПользователь, подключённый со стороны клиента.
databaseИмя базы данных.
stateСостояние клиентского подключения:
active,used,waitingилиidle.addrIP-адрес клиента.
portПорт, к которому подключён клиент.
local_addrКонечный адрес подключения на локальной машине.
local_portКонечный порт подключения на локальной машине.
connect_timeВремя установления подключения.
request_timeВремя последнего запроса клиента.
waitТекущая длительность ожидания (в секундах).
wait_usДробная часть текущей длительности ожидания (в микросекундах).
close_neededНе используется для клиентов.
ptrАдрес внутреннего объекта для данного подключения. Используется как уникальный идентификатор.
linkАдрес серверного подключения, с которым связан клиент.
remote_pidИдентификатор процесса (PID), в случае, если клиент подключается через сокет UNIX и ОС может выдать этот идентификатор.
tlsИнформация о TLS-подключении; пустая строка, если TLS не используется.
SHOW POOLS
Новый пул создаётся для каждой пары сущностей (база данных, пользователь).
databaseИмя базы данных.
userИмя пользователя.
cl_activeЧисло клиентских подключений, которые связаны с подключениями к серверу и могут обрабатывать запросы.
cl_waitingЧисло клиентских подключений, которые отправили запросы, но ещё не получили подключения к серверу.
sv_activeЧисло серверных подключений, связанных с клиентами.
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Действующий режим пула.
SHOW LISTS
Показывает следующие внутренние сведения, в столбцах (не строках):
databasesЧисло баз данных.
usersЧисло пользователей.
poolsЧисло пулов.
free_clientsЧисло свободных клиентов.
used_clientsЧисло активных клиентов.
login_clientsЧисло клиентов в состоянии входа (
login).free_serversЧисло свободных серверов.
used_serversЧисло задействованных серверов.
dns_namesКоличество имён DNS в кеше.
dns_zonesКоличество зон DNS в кеше.
dns_queriesКоличество выполняющихся запросов к DNS.
dns_pendingНе используется.
SHOW USERS
nameИмя пользователя.
pool_modeПереопределение
pool_modeдля пользователя либоNULL, если должен использоваться режим по умолчанию.
SHOW DATABASES
nameИмя настроенной записи базы данных.
hostКомпьютер, к которому подключается pgbouncer.
portПорт, к которому подключается pgbouncer.
databaseРеальное имя базы данных, к которой подключается pgbouncer.
force_userКогда пользователь указан в строке соединения, подключение между pgbouncer и Postgres Pro должно устанавливаться от его имени, вне зависимости от пользователя на стороне клиента.
pool_sizeМаксимальное число серверных подключений.
reserve_poolМаксимальное число дополнительных подключений для этой базы данных.
pool_modeПереопределение pool_mode для базы данных либо
NULL, если должен использоваться режим по умолчанию.max_connectionsМаксимально возможное число подключений для этой базы, установленное либо глобально, параметром
max_db_connections, либо на уровне базы.current_connectionsТекущее число подключений для этой базы.
paused1, если база данных находится в состоянии паузы, иначе — 0.
disabled1, если база данных находится в отключённом состоянии, иначе — 0.
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Значение переменной конфигурации.
changeableЗначение
yesилиno, показывающее, можно ли изменить переменную во время работы. Если значениеno, переменная может быть изменена только при перезагрузке. Чтобы изменить переменную во время работы, воспользуйтесь командойSET.
SHOW MEM
Выводит низкоуровневую информацию о размере различных блоков памяти, выделенных для внутреннего использования. Эта информация имеет динамическую природу и может меняться.
SHOW DNS_HOSTS
Выводит имена узлов, содержащиеся в кеше DNS.
hostnameИмя узла.
ttlСколько секунд остаётся до очередного внешнего поиска.
addrsСписок адресов, разделённых запятыми.
SHOW DNS_ZONES
Показывает зоны DNS в кеше.
zonenameИмя зоны.
serialТекущий серийный номер.
countИмена узлов, относящихся к этой зоне.
Команды управления процессом
PAUSE [бд]
pgbouncer пытается отключиться ото всех серверов, сначала ожидая завершения всех запросов. Выполнение этой команды заканчивается, только когда завершаются все запросы. Эта команда должна применяться во время перезапуска базы данных.
Если указано имя базы данных, будет приостановлена работа только с ней.
Новые подключения клиентов к базе, поставленной на паузу, будут находиться в состоянии ожидания, пока не будет выполнена команда RESUME.
DISABLE бд
Запрещает любые новые подключения клиентов к указанной базе данных.
ENABLE бд
Разрешает новые подключения клиентов после предыдущей команды DISABLE.
RECONNECT бд
Закрывает все открытые подключения к указанной базе (или ко всем базам) по мере их освобождения в соответствии с режимом пула, не дожидаясь окончания времени жизни подключений. При этом немедленно могут быть установлены новые подключения к серверу, согласно текущим параметрам пула.
Эта команда может быть полезна, когда изменяется конфигурация подключения к серверу, например, нужно постепенно переключиться на новый сервер. Эту команду не нужно выполнять, если вы меняете строку соединения в pgbouncer.ini и перезагружаете конфигурацию (см. RELOAD) или когда меняются адреса в DNS, так как равнозначное действие будет выполнено автоматически. Эта команда может быть полезна, только если подключения pgbouncer маршрутизируются какими-то внешними средствами.
После выполнения этой команды возможен длительный период, когда будут существовать и старые подключения, и новые. Это может иметь значение только при переключении трафика между читающими репликами или при переключении между узлами в конфигурации с несколькими ведущими. Если необходимо переключить все подключения сразу, рекомендуется использовать команду PAUSE. Чтобы закрыть подключения экстренно (например, когда произвести переключение нужно не постепенно, а срочно), вы можете воспользоваться командой KILL.
KILL бд
Немедленно закрывает все клиентские и серверные подключения к указанной базе данных, деактивируя её.
Новые подключения клиентов к деактивированной базе будут находиться в состоянии ожидания, пока не будет выполнена команда RESUME.
SUSPEND
Все буферы сокетов очищаются и pgbouncer прекращает принимать данные через них. Выполнение этой команды заканчивается, только когда все буферы будут очищены. Эта команда должна применяться, когда pgbouncer перезагружается «на лету».
Новые подключения клиентов к приостановленной базе будут находиться в состоянии ожидания, пока не будет выполнена команда RESUME.
RESUME [бд]
Восстанавливает работу после предыдущей команды KILL, PAUSE или SUSPEND.
SHUTDOWN
Приводит к завершению процесса pgbouncer.
RELOAD
Указывает процессу pgbouncer перезагрузить файл конфигурации и обновить значения изменяемых параметров.
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в консоли.SIGINTБезопасное отключение. Равносильно выполнению команд
PAUSEиSHUTDOWNв консоли.SIGTERMНемедленное отключение. Равносильно выполнению команды
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Указывает имя файла журнала. Файл журнала остаётся открытым, так что после смены имени для прокрутки следует выполнить
kill -HUPилиRELOAD;в консоли. Замечание: В Windows необходимо остановить и вновь запустить службу.По умолчанию: не задано.
pidfileУказывает имя файла PID. Без этого указания работа в режиме демона не допускается.
По умолчанию: не задано.
listen_addrУказывает список адресов, по которым должны приниматься TCP-подключения. Вы можете указать
*, что будет означать «принимать по всем адресам». Когда этот параметр не задан, принимаются только подключения через Unix-сокеты.Адреса могут задаваться числами (в формате IPv4/IPv6) или именами.
По умолчанию: не задано.
listen_portНомер принимающего порта. Задаётся и для сокетов TCP, и для Unix-сокетов.
По умолчанию: 6432
unix_socket_dirУказывает расположение сокетов Unix. Действует и для принимающего сокета, и для подключений к серверу. Если задана пустая строка, сокеты Unix отключаются. Требуется для выполнения перезагрузки «на лету» (-R). Замечание: не поддерживается в Windows.
По умолчанию: /tmp
unix_socket_modeРежим файловой системы для сокета Unix.
По умолчанию: 0777
unix_socket_groupИмя группы для сокета Unix.
По умолчанию: не задано.
userЕсли задан, определяет, на какого пользователя Unix нужно переключиться после запуска. Работает, только если pgbouncer запускается от имени root или уже запущен от имени заданного пользователя.
Замечание: Не поддерживается в Windows.
По умолчанию: не задано.
auth_fileИмя файла, из которого будут загружаться имена и пароли пользователей. За подробностями обратитесь к Подразделу «Формат файла аутентификации».
По умолчанию: не задано.
auth_hba_fileФайл конфигурации HBA, который используется когда режиме
auth_typeравенhba. Поддерживается с версии 1.7.По умолчанию: не задано.
auth_typeОпределяет, как аутентифицировать пользователей.
pamДля проверки подлинности пользователей используется инфраструктура PAM (Pluggable Authentication Modules, Подключаемые модули аутентификации). Файл
auth_fileигнорируется. Этот метод несовместим с базами данных, для которых используетсяauth_user. Инфраструктуре PAM в качестве имени службы передаётсяpgbouncer. PAM в файле конфигурации HBA не поддерживается.hbaФактический тип аутентификации загружается из
auth_hba_file. Это позволяет применять разные методы аутентификации для разных вариантов доступа. Например: для подключений через сокет Unix применять методpeer, а для TCP — TLS. Поддерживается с версии 1.7.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, но переданное имя пользователя игнорируется. Требует, чтобы для всех баз данных было настроено подключение заданного пользователя. Кроме того, база данных консоли допускает подключение любого пользователя в качестве администратора.
auth_queryЗапрос для извлечения пароля пользователя из базы данных.
Для прямого доступа к
pg_shadowтребуются права администратора. Поэтому рекомендуется, чтобы обычный пользователь обращался к ней, вызывая функцию SECURITY DEFINER (с контекстом безопасности определившего).Заметьте, что этот запрос выполняется в целевой базе данных, так что если в нём используются функции, они должны быть установлены в каждой базе.
По умолчанию:
SELECT usename, passwd FROM pg_shadow WHERE usename=$1auth_userЕсли задан параметр
auth_user, пользователи, не описанные в файлеauth_file, будут проверяться запросомauth_queryпо таблицеpg_shadowв базе данныхauth_user. Пароль пользователяauth_userбудет взят из файлаauth_file.Для прямого доступа к
pg_shadowтребуются права администратора. Поэтому рекомендуется, чтобы обычный пользователь обращался к ней, вызывая функцию SECURITY DEFINER (с контекстом безопасности определившего).По умолчанию: не задано.
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Добавить в пул дополнительные соединения, если число активных подключений меньше этого числа. Даёт положительный эффект, когда нагрузка появляется внезапно после периода простоя.
По умолчанию: 0 (отключено)
reserve_pool_sizeЧисло дополнительно разрешённых подключений в пуле. При 0 резерв отсутствует.
По умолчанию: 0 (отключено)
reserve_pool_timeoutЕсли клиент не обслуживается заданное число секунд, pgbouncer задействует дополнительные подключения из резервного пула. При 0 это не происходит.
По умолчанию: 5.0
max_db_connectionsНе допускать больше заданного числа подключений к базе данных (вне зависимости от пула, то есть пользователя). Следует заметить, что когда предел достигается, закрытие подключения клиента в одном пуле не позволяет немедленно установить другое подключение к серверу через другой пул, так как подключение первого пула по-прежнему открыто. Когда сервер закроет его (по тайм-ауту неактивности), новое подключение будет немедленно установлено для ожидающего пула.
По умолчанию: нет ограничения
max_user_connectionsНе допускать больше заданного числа подключений пользователя (вне зависимости от пула, то есть пользователя). Следует заметить, что когда предел достигается, закрытие подключения клиента в одном пуле не позволяет немедленно установить другое подключение к серверу через другой пул, так как подключение первого пула по-прежнему открыто. Когда сервер закроет его (по тайм-ауту неактивности), новое подключение будет немедленно установлено для ожидающего пула.
server_round_robinПо умолчанию pgbouncer повторно использует подключения сервера в порядке LIFO (последнее пришло, первое ушло), так что основная загрузка распределяется по нескольким последним соединениям. Это даёт наибольшую производительность, если базу данных обслуживает один сервер. Но если за IP базы данных скрывается балансировщик TCP-соединений, лучше, если pgbouncer будет использовать подключения в данном режиме, обеспечивая таким образом равномерную нагрузку.
По умолчанию: 0
ignore_startup_parametersПо умолчанию pgbouncer принимает только параметры, которые он может отслеживать в стартовых пакетах:
client_encoding,datestyle,timezoneиstandard_conforming_strings.Все другие параметры вызывают ошибку. Чтобы принимались и другие параметры, их нужно указать здесь, чтобы pgbouncer знал, что они обрабатываются администратором и их можно игнорировать.
По умолчанию: пустая строка
disable_pqexecОтключает протокол простых запросов (PQexec). В отличие от протокола расширенных запросов, этот протокол допускает указание нескольких запросов в одном пакете, что оставляет место для атак с SQL-инъекцией. Отключение этого протокола может улучшить безопасность. Разумеется, это означает, что при этом смогут работать только клиенты, которые используют исключительно протокол расширенных запросов.
По умолчанию: 0
application_name_add_hostДобавляет адрес компьютера и порт клиента к имени приложения, задаваемого при установлении подключения. Это помогает идентифицировать источник плохих запросов и т. п. Это выполняется, только когда подключение устанавливается; если свойство
application_nameбудет изменёно позднее командойSET, pgbouncer его уже не поменяет.По умолчанию: 0
conffileПоказывает расположение текущего файла конфигурации. При изменении этого параметра pgbouncer будет использовать другой файл конфигурации после команд
RELOAD/SIGHUP.По умолчанию: файл, заданный в командной строке.
service_nameИспользуется при регистрации службы win32.
По умолчанию: pgbouncer
job_nameПсевдоним
service_name.stats_periodОпределяет, с какой периодичностью (в секундах) будут пересчитываться средние значения, выводимые различными командами
SHOW, и как часто агрегированная статистика будет записываться в журнал (но см.log_stats).По умолчанию: 60
Параметры журнала
syslogВключает/отключает запись в syslog. В Windows вместо syslog применяется eventlog.
По умолчанию: 0
syslog_identИмя, с которым события передаются в syslog.
По умолчанию:
pgbouncer(имя программы)syslog_facilityСубъект, который будет указываться в событиях, отправляемых в syslog. Возможные варианты:
auth,authpriv,daemon,user,local0-7.По умолчанию: daemon
log_connectionsФиксировать в журнале успешные подключения.
По умолчанию: 1
log_disconnectionsФиксировать отключения с указаниями их причин.
По умолчанию: 1
log_pooler_errorsФиксировать сообщения об ошибках, которые pgbouncer передаёт клиентам.
По умолчанию: 1
stats_periodИнтервал для записи накопленной статистики в журнал.
По умолчанию: 60
log_statsЗаписывать агрегированную статистику в журнал, с периодичностью
stats_period. Это может быть лишним, если ту же статистику запрашивают внешние средства мониторинга, вызывая командыSHOW.По умолчанию: 1
verboseУвеличивает уровень детализации. Соответствует ключу «-v» в командной строке. Указание «-v -v» в командной строке равносильно записи
verbose=2в конфигурации.По умолчанию: 0
Управление доступом к консоли
admin_usersРазделённый запятыми список пользователей базы данных, которым разрешено подключаться к консоли и выполнять в ней любые команды. Игнорируется с
auth_type, равнымany, так как в этом случае любой пользователь может подключаться как администратор.По умолчанию: пустая строка
stats_usersРазделённый запятыми список пользователей баз данных, которым разрешено подключаться к консоли и выполнять команды только на чтение. Это включает все команды SHOW, за исключением SHOW FDS.
По умолчанию: не задан.
Проверки активности соединений, тайм-ауты
server_reset_queryЗапрос, посылаемый серверу при освобождении подключения, прежде чем оно станет доступно другим клиентам. В этот момент никакая транзакция не выполняется, так что запрос не должен включать команды
ABORTилиROLLBACK.Предполагается, что этот запрос очистит все изменения в состоянии сеанса базы данных, чтобы следующий клиент получил подключение в определённом состоянии. По умолчанию выполняется команда
DISCARD ALL, которая очищает всё, но при этом следующему клиенту не остаётся никакого кешированного состояния. Её можно поменять на более мягкую, напримерDEALLOCATE ALL, просто освобождающую подготовленные операторы (если работа приложения не нарушается, когда какое-то состояние сохраняется).Когда применяется пул транзакций,
server_reset_queryне действует, так как клиенты не должны использовать никакие свойства сеансов, потому что каждая транзакция завершается в отдельном соединении и таким образом получает разные состояния сеанса.По умолчанию: DISCARD ALL
server_reset_query_alwaysОпределяет, должен ли запрос
server_reset_queryвыполняться во всех режимах пула. Когда этот параметр отключён (по умолчанию),server_reset_queryбудет запускаться только в режиме пула сеансов. Соединениям в режиме пула транзакций не должен требоваться запрос сброса состояния.Эта возможность предоставляется для случаев, когда приложения не вполне корректно используют свойства сеансов, подключаясь к пулу транзакций pgbouncer. Она позволяет сменить недетерминированное неправильное поведение на детерминированное (но всё же неправильное) — клиенты всегда теряют своё состояние после каждой транзакции.
По умолчанию: 0
server_check_delayОпределяет, как долго должны сохраняться освобождаемые подключения в состоянии готовности к повторному использованию, без запуска запроса проверки подключения. При значении 0 этот запрос запускается всегда.
По умолчанию: 30.0
server_check_queryПростой холостой запрос, проверяющий, сохраняется ли подключение к серверу.
Если это пустая строка, проверка соединения отключается.
По умолчанию: SELECT 1;
server_fast_closeОпределяет, должен ли сервер в режиме пула сеансов отключаться немедленно либо после завершения текущей транзакции, если он находится в режиме
close_needed(который включается командамиRECONNECTиRELOADили при изменениях в DNS), или необходимо дожидаться завершения сеанса. Режимы пула запросов и транзакций так и работают, поэтому включение этого параметра на эти режимы не влияет.Если этот параметр включён, то есть подключение к серверу закрывается до завершения сеанса клиента, клиентское подключение также закрывается. Тем самым гарантируется, что прерывание сеанса не останется незамеченным для клиента.
Этот параметр позволяет ускорить вступление в силу изменений параметров соединений в случае использования пула сеансов и существования долгоживущих сеансов. Недостатком его использования может быть то, что клиентские сеансы могут прерываться при изменении конфигурации, так что клиентские приложения должны уметь переподключаться и восстанавливать состояние сеанса. Но заметьте, что никакие транзакции при этом не будут потеряны, так как прерываться будут не выполняющиеся транзакции, а только лишь простаивающие сеансы.
По умолчанию: 0
server_lifetimepgbouncer будет закрывать неиспользуемое серверное подключение, существующее дольше заданного времени (в секундах). Ноль означает, что соединение будет использоваться только один раз, а затем будет закрываться.
По умолчанию: 3600.0
server_idle_timeoutЕсли подключение к серверу простаивает дольше заданного времени (в секундах), оно будет сброшено. При значении 0 тайм-аут отключается.
По умолчанию: 600.0
server_connect_timeoutЕсли инициализация подключения и вход на сервер не завершается за указанное время (в секундах), соединение будет закрыто.
По умолчанию: 15.0
server_login_retryПри ошибке входа на сервер, из-за сбоя в connect() или при аутентификации, pgbouncer будет ждать заданное время (в секундах).
По умолчанию: 15.0
client_login_timeoutЕсли клиент подключается, но не может пройти аутентификацию за указанное время (в секундах), он будет отключён. Требуется в основном, чтобы «мёртвые» подключения не задерживали операцию SUSPEND и, как следствие, перезагрузку на лету.
По умолчанию: 60.0
autodb_idle_timeoutЕсли создаваемые автоматически (через «*») пулы баз данных не используются заданное время (в секундах), они освобождаются. Минусом этого является то, что их статистика также сбрасывается.
По умолчанию: 3600.0
dns_max_ttlВремя кеширования результатов поиска в DNS (в секундах). Если при поиске в DNS возвращаются разные ответы, pgbouncer будет использовать их по очереди. Действительное значение DNS TTL игнорируется.
По умолчанию: 15.0
dns_nxdomain_ttlВремя кеширования ошибок DNS и результатов NXDOMAIN (в секундах).
По умолчанию: 15.0
dns_zone_check_periodИнтервал проверки серийного номера зоны.
pgbouncer может собрать список зон DNS из имён узлов (всё после первой точки) и затем периодически проверять, не изменился ли серийный номер зоны. Если он меняется, то все имена узлов, относящиеся к зоне, разрешаются заново. Если для какого-либо узла получается другой IP-адрес, его подключения признаются недействительными.
Работает только с библиотекой UDNS или c-ares (когда сборка конфигурируется c
--with-udnsили--with-cares).По умолчанию: 0.0 (отключено)
Параметры TLS
client_tls_sslmodeРежим TLS, выбираемый для подключений клиентов. По умолчанию подключения с использованием TLS запрещены. Когда этот режим включается, необходимо также настроить в
client_tls_key_fileиclient_tls_cert_fileключ и сертификат, которые будет использовать pgbouncer.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),legacy(равнозначно all).По умолчанию:
allclient_tls_ciphersПо умолчанию:
fastclient_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. По умолчанию подключения не используют TLS.
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).По умолчанию:
allserver_tls_ciphersПо умолчанию:
fast
Опасные тайм-ауты
Установка следующих тайм-аутов может приводить к неожиданным ошибкам.
query_timeoutЗапросы, выполняющиеся дольше этого времени (в секундах), будут отменяться. Его значение следует выбирать лишь немногим меньшим параметра
statement_timeoutна сервере, чтобы это происходило только при проблемах в сети.По умолчанию: 0.0 (отключено)
query_wait_timeoutМаксимальное время, которое могут ожидать выполнения запросы (в секундах). Если запрос не назначается серверу за это время, клиент отключается. Это применяется для предотвращения захватывания подключений «зависшими» серверами.
Это также помогает в ситуациях, когда сервер отключён или база данных не принимает подключения по какой-либо причине. Если этот тайм-аут отключить, клиенты будут стоять в очереди неограниченно долго.
По умолчанию: 120
client_idle_timeoutКлиентские подключения, простаивающие дольше этого времени (в секундах), закрываются. Это значение должно быть больше тайм-аута подключения, установленного на стороне клиента, и применяется оно только для решения проблем с сетью.
По умолчанию: 0.0 (отключено)
idle_transaction_timeoutЕсли клиент «простаивает в транзакции» дольше этого времени (в секундах), он будет отключён.
По умолчанию: 0.0 (отключено)
Низкоуровневые параметры сети
pkt_bufРазмер внутреннего буфера для пакетов. Влияет на размер отправляемых TCP-пакетов и общее использование памяти. Собственно пакеты libpq могут быть больше этого буфера, так что нет необходимости делать его большим.
По умолчанию: 4096
max_packet_sizeМаксимальный размер пакетов Postgres Pro, который сможет пропустить через себя pgbouncer. Один пакет представляет либо один запрос, либо строку из набора результатов. Размер всего набора результатов может быть больше.
По умолчанию: 2147483647
listen_backlogПараметр очереди для listen(2). Определяет, сколько неотвеченных запросов на подключение будет находиться в очереди. Когда очередь заполнена, следующие новые подключения будут сбрасываться.
По умолчанию: 128
sbuf_loopcntУстанавливает, сколько циклов должны обрабатываться данные для одного подключения, после чего нужно переходить к другим. Без этого ограничения одно подключение с большим набором результатом может занять pgbouncer на долгое время. В одном цикле обрабатываются данные размером
pkt_bufбайт. Ноль убирает ограничение.По умолчанию: 5
suspend_timeoutСколько секунд ждать сброса буфера при выполнении SUSPEND или перезагрузки (-R). Если сброс не завершился, подключение сбрасывается.
По умолчанию: 10
tcp_defer_acceptПодробнее об этом и других параметрах TCP можно узнать в руководстве
man 7 tcp.По умолчанию: 45 в Linux, в других системах — 0
tcp_socket_bufferПо умолчанию: не задано.
tcp_keepaliveВключает базовый опрос активности со стандартными параметрами ОС.
В Linux системные параметры по умолчанию: tcp_keepidle=7200, tcp_keepintvl=75, tcp_keepcnt=9. Вероятно, они имеют близкие значения и в других ОС.
По умолчанию: 1
tcp_keepcntПо умолчанию: не задано.
tcp_keepidleПо умолчанию: не задано.
tcp_keepintvlПо умолчанию: не задано.
Раздел [databases]
Этот раздел содержит пары ключ=значение, где в качестве ключа принимается имя базы данных, а в качестве значения — строка подключения для libpq в виде пар ключ=значение. Так как сама libpq не используется, в этой строке можно задать не все свойства, которые понимает libpq (service=, .pgpass).
Имя базы данных может содержать символы _0-9A-Za-z без кавычек. Имена, содержащие другие символы, должны заключаться в двойные кавычки по правилам для идентификаторов SQL (две кавычки ("") воспринимаются внутри строки как одна).
«*» воспринимается как имя всех остальных баз: если точного соответствия имени для запрошенной базы данных не находится, в качестве строки подключения выбирается данное значение. Такие автоматически создаваемые записи баз данных очищаются, если они простаивают больше времени, задаваемого параметром autodb_idle_timeout.
dbnameИмя целевой базы данных.
По умолчанию: имя базы данных на стороне клиента.
hostИмя или IP-адрес компьютера, к которому нужно подключиться. Имена компьютеров разрешаются в момент подключения, и результат кешируется в течение времени, заданного параметром
dns_max_ttl. Если результат разрешения имени меняется, существующие подключения к серверу автоматически закрываются при их освобождении (в соответствии с режимом пула), и изменение немедленно отражается на новых подключениях. Если DNS возвращает несколько записей, они используются по очереди.По умолчанию: не задан, что подразумевает использование сокетов Unix.
portПо умолчанию: 5432
userЕсли задано
user=, все подключения к целевой базе данных будут выполняться с заданным именем пользователя, что означает, что для этой базы данных будет всего один пул.В противном случае pgbouncer пытается подключиться к целевой базе данных с именем пользователя, переданным клиентом, что означает, что для каждого пользователя будет отдельный пул.
passwordДлина значения
passwordограничивается 160 символами.Если пароль здесь не задаётся, будет использован пароль из
auth_fileилиauth_query.auth_userПереопределяет глобальную переменную
auth_user, если она задана.pool_sizeЗадаёт максимальное количество пулов для этой базы данных. Если не задано, применяется значение
default_pool_size.reserve_poolЗадаёт число дополнительных подключений для этой базы данных. Если не задано, применяется значение
reserve_pool_size.connect_queryЗапрос, который будет выполняться сразу после установления соединения, но до того, как его смогут использовать какие-либо клиенты. Если при запросе возникают ошибки, они только фиксируются в журнале, другой реакции не следует.
pool_modeЗадаёт режим пула для данной базы данных. Если этот параметр не задаётся, применяется значение pool_mode по умолчанию.
max_db_connectionsЗадаёт максимум подключений для базы данных (то есть, используя все пулы этой базы данных, нельзя будет установить больше этого числа подключений к серверу).
client_encodingЗапрашивает у сервера использование указанной клиентской кодировки (
client_encoding).datestyleЗапрашивает у сервера использование указанного стиля даты (
datestyle).timezoneЗапрашивает у сервера использование указанного часового пояса (
timezone).
Раздел [users]
Этот раздел содержит пары ключ=значение, где в качестве ключа принимается имя пользователя, а в качестве значения — переопределяемые для него параметры конфигурации в виде пар ключ=значение (в формате строк подключения libpq). Таким образом переопределить можно лишь немногие параметры.
pool_modeЗадаёт режим пула для всех подключений данного пользователя. Если этот параметр не задаётся, применяется значение pool_mode по умолчанию или заданное для базы данных.
max_user_connectionsЗадаёт максимум подключений для пользователя (то есть, используя все пулы, нельзя будет установить больше этого числа подключений к серверу).
Директива включения
Файл конфигурации pgbouncer может содержать директивы включения, которые указывают, что нужно прочитать и обработать дополнительный файл конфигурации. Это позволяет разделить файл конфигурации на физически отдельные части. Директивы включения выглядят примерно так:
%include имя_файлаЕсли файл задаётся не абсолютным путём, его путь воспринимается относительно текущего рабочего каталога.
Формат файла аутентификации
pgbouncer нуждается в собственной базе данных пользователей. Он загружает список пользователей из текстового файла в следующем формате:
"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$число_итераций:соль$сохранённый_ключ:ключ_сервера
Файл аутентификации можно составить вручную, но также можно сгенерировать его из какого-то другого списка пользователей и паролей. В качестве примера скрипта, который генерирует файл с данными аутентификации из таблицы pg_shadow, может быть полезен ./etc/mkauth.py.
Формат файла HBA
Он соответствует формату файла Postgres Pro pg_hba.conf, описанному в Разделе 20.1.
Поддерживаемые типы записей:
local,host,hostssl,hostnossl.В поле базы данных поддерживаются варианты:
all,sameuser, @файл, несколько имён. Не поддерживаются:replication,samerole,samegroup.В поле имени пользователя поддерживаются варианты:
all, @файл, несколько имён. Не поддерживается:+groupname.В поле адреса поддерживается:
IPv4,IPv6. Не поддерживаются: имена DNS, префиксы доменов.В поле метода аутентификации поддерживаются только те, которые поддерживает pgbouncer в
auth_type, за исключениемanyиpam, которые работают только глобально. Сопоставления имён пользователей (map=) не поддерживаются.
Пример
Минимальная конфигурация:
[databases] template1 = host=127.0.0.1 dbname=template1 auth_user=someuser [pgbouncer] pool_mode = session listen_port = 6543 listen_addr = 127.0.0.1 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=127.0.0.1 dbname=bazdb ; обращение к целевой базе данных будет производить один пользователь forcedb = host=127.0.0.1 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 usename, passwd FROM pg_catalog.pg_shadow
WHERE usename = i_username INTO uname, phash;
RETURN;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
REVOKE ALL ON FUNCTION pgbouncer.user_lookup(text) FROM public, pgbouncer;
GRANT EXECUTE ON FUNCTION pgbouncer.user_lookup(text) TO pgbouncer;