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.

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

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

  1. Создайте файл pgbouncer.ini. Например:

    [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 = users.txt
    logfile = pgbouncer.log
    pidfile = pgbouncer.pid
    admin_users = someuser
  2. Создайте файл users.txt со списком пользователей, которым разрешено подключение:

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

    $ pgbouncer -d pgbouncer.ini

    Примечание

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

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

    $ psql -p 6543 -U someuser template1
  5. Для управления 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
  6. Если вы вносили изменения в файл pgbouncer.ini, его можно перезагрузить командой:

    pgbouncer=# RELOAD;

Параметры

-d

Запустить в фоновом режиме. Без этого указания процесс будет работать на переднем плане.

Примечание

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

-R

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

Примечание

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

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

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

-v

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

-q

Приглушить вывод — не выводить ничего в stdout.

Примечание

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

-V

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

-h

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

--regservice

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

--unregservice

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

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

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

$ psql -p 6543 pgbouncer

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

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

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

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

SHOW STATS;

Выводит статистику.

database

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

total_requests

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

total_received

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

total_sent

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

total_query_time

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

avg_req

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

avg_recv

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

avg_sent

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

avg_query

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

SHOW SERVERS;

type

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

user

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

database

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

state

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

addr

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

port

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

local_addr

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

local_port

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

connect_time

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

request_time

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

ptr

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

link

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

remote_pid

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

SHOW CLIENTS;

type

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

user

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

database

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

state

Состояние клиентского подключения: active, used, waiting или idle.

addr

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

port

Порт, к которому подключён клиент.

local_addr

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

local_port

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

connect_time

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

request_time

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

ptr

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

link

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

remote_pid

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

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).

pool_mode

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

SHOW LISTS;

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

databases

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

users

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

pools

Число пулов.

free_clients

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

used_clients

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

login_clients

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

free_servers

Число свободных серверов.

used_servers

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

SHOW USERS;

name

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

pool_mode

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

SHOW DATABASES;

name

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

host

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

port

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

database

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

force_user

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

pool_size

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

pool_mode

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

SHOW FDS;

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

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

Примечание

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

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

fd

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

task

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

user

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

database

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

addr

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

port

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

cancel

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

link

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

SHOW CONFIG;

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

key

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

value

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

changeable

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

SHOW DNS_HOSTS;

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

hostname

Имя узла.

ttl

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

addrs

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

SHOW DNS_ZONES

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

zonename

Имя зоны.

serial

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

count

Число узлов, принадлежащих этой зоне.

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

PAUSE [бд];

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

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

DISABLE бд;

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

ENABLE бд;

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

KILL бд;

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

SUSPEND;

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

RESUME [бд];

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

SHUTDOWN;

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

RELOAD;

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

Сигналы

SIGHUP

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

SIGINT

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

SIGTERM

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

Параметры 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

Имя файла, из которого будет загружаться список пользователей и паролей. Этот файл имеет тот же формат, что и pg_auth/pg_pwd в PostgreSQL 8.x, поэтому в данном параметре можно указать на один из этих серверных файлов. Начиная с версии 9.0, PostgreSQL не использует подобный текстовый файл, поэтому его нужно создавать вручную. За подробностями обратитесь к Подразделу «Формат файла аутентификации».

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

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, а для TCPTLS. Поддерживается с версии 1.7.

cert

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

md5

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

plain

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

trust

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

any

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

auth_query

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

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

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

По умолчанию: SELECT usename, passwd FROM pg_shadow WHERE usename=$1

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.

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

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

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_lifetime

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

По умолчанию: 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 (когда сборка конфигурируется --with-udns).

По умолчанию: 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. Краткие обозначения: all (tlsv1.0,tlsv1.1,tlsv1.2), secure (tlsv1.2), legacy (все).

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

client_tls_ciphers

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

client_tls_ecdhcurve

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

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

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

client_tls_dheparams

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

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

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

server_tls_sslmode

Режим TLS для подключений к серверам Postgres Pro. По умолчанию подключения не используют 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. Краткие обозначения: all (tlsv1.0,tlsv1.1,tlsv1.2), secure (tlsv1.2), legacy (все).

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

server_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, password

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

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

auth_user

Если задан параметр auth_user, любой пользователь, не определённый в файле auth_file, будет проверен по таблице pg_shadow в базе данных (для подключения к ней будет использоваться auth_user). Пароль пользователя auth_user будет взят из файла auth_file.

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

pool_size

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

connect_query

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

pool_mode

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

max_db_connections

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

client_encoding

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

datestyle

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

timezone

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

Раздел [users]

Этот раздел содержит пары ключ=значение, где в качестве ключа принимается имя пользователя, а в качестве значения — строка подключения для libpq в виде пар ключ=значение. Так как сама libpq не используется, в этой строке можно задать не все свойства, которые понимает libpq.

pool_mode

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

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

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

%include имя_файла

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

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

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

"username1" "password" ...
"username2" "md5abcdef012342345" ...

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

Этот же формат файла применялся для текстовых файлов, в которых хранил данные для аутентификации PostgreSQL 8.x, благодаря чему pgbouncer мог работать непосредственно с этими файлами PostgreSQL в каталоге данных.

Начиная с PostgreSQL 9.0, текстовые файлы больше не используются. В качестве примера скрипта, который генерирует файл с данными аутентификации из таблицы pg_shadow, взгляните на ./etc/mkauth.py.

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

"md5" + md5(password + username)

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

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

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

Однако есть следующие различия:

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

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

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

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

  • В поле метода аутентификации поддерживаются варианты: trust, reject, md5, password, peer, cert. Не поддерживаются: gss, sspi, ident, ldap, radius, 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;