Перейти к содержанию

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

Вернуться к обычному виду страницы.

Документация PgBouncer 1.25.2

PgBouncer — лёгкий менеджер пула соединений PostgreSQL

PgBouncer — менеджер пула соединений PostgreSQL. Любое клиентское приложение может подключаться к PgBouncer как к серверу PostgreSQL, а PgBouncer создаст соединение с настоящим сервером либо повторно использует одно из существующих соединений.

Цель PgBouncer — уменьшить влияние открытия новых соединений с PostgreSQL на производительность.

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

  • Сеансовый режим пула: наиболее щадящий метод. При подключении клиента ему назначается серверное соединение на всё время клиентского соединения. После отключения клиента серверное соединение возвращается в пул. Это режим по умолчанию.
  • Транзакционный режим пула: серверное соединение назначается клиенту только на время транзакции. Когда PgBouncer определяет завершение транзакции, серверное соединение возвращается в пул.
  • Режим пула на уровне операторов: наиболее строгий метод. Серверное соединение возвращается в пул сразу после завершения запроса. В этом режиме запрещены транзакции из нескольких операторов.

1 - Возможности

Возможности PgBouncer: режимы пула и совместимость с SQL
  • Несколько уровней строгости при перераспределении соединений:

    Сеансовый режим пула
    Наиболее щадящий метод. При подключении клиента ему назначается серверное соединение на всё время клиентского соединения. После отключения клиента серверное соединение возвращается в пул. Этот режим поддерживает все возможности PostgreSQL.
    Транзакционный режим пула
    Серверное соединение назначается клиенту только на время транзакции. Когда PgBouncer определяет завершение транзакции, серверное соединение возвращается в пул. Этот режим нарушает работу некоторых сеансовых возможностей PostgreSQL. Его можно использовать, только если приложение не применяет несовместимые возможности. Они перечислены в таблице ниже.
    Режим пула на уровне операторов
    Наиболее строгий метод. Это транзакционный режим пула с дополнительным ограничением: транзакции из нескольких операторов запрещены. Такой режим принудительно обеспечивает клиентский режим «autocommit» и в основном предназначен для PL/Proxy.
  • Низкое потребление памяти (по умолчанию 2 kB на соединение), поскольку PgBouncer не требуется получать пакеты целиком.

  • Нет привязки к одному серверу бэкенда. Целевые базы данных могут находиться на разных узлах.

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

  • Поддерживается перезапуск и обновление без остановки обслуживания и разрыва клиентских соединений.


Совместимость возможностей SQL с режимами пула

В следующей таблице перечислены возможности PostgreSQL и их совместимость с режимами пула PgBouncer. Обратите внимание: транзакционный режим пула по своей архитектуре нарушает ожидания клиента от сервера и может использоваться только в приложениях, которые не применяют несовместимые возможности.

ВозможностьСеансовый режимТранзакционный режим
Параметры запуска 1ДаДа
SET/RESETДаНикогда
LISTENДаНикогда
NOTIFYДаДа
WITHOUT HOLD CURSORДаДа
WITH HOLD CURSORДаНикогда
Подготовленные планы протоколаДаДа 2
PREPARE / DEALLOCATEДаНикогда
Временные таблицы ON COMMIT DROPДаДа
Временные таблицы PRESERVE/DELETE ROWSДаНикогда
Сброс кэшированного планаДаДа
Оператор LOADДаНикогда
Сеансовые рекомендательные блокировкиДаНикогда

  1. Параметры запуска: client_encoding, DateStyle, IntervalStyle, Timezone, standard_conforming_strings и application_name. PgBouncer отслеживает их изменения и поэтому может гарантировать согласованные значения для клиента. Если PgBouncer должен поддерживать дополнительные параметры, см. track_extra_parameters и ignore_startup_parameters . ↩︎

  2. Чтобы включить эту поддержку, параметру max_prepared_statements необходимо присвоить ненулевое значение. ↩︎

2 - Конфигурация: pgbouncer.ini

Справочник по файлу конфигурации PgBouncer (pgbouncer.ini)

Описание

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


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

logfile

Задаёт файл журнала. Для демонизации (-d) обязательно задать этот параметр или syslog.

Файл журнала остаётся открытым, поэтому после ротации следует выполнить kill -HUP или RELOAD; в консоли. В Windows службу необходимо остановить и запустить.

Обратите внимание: сам по себе параметр logfile не отключает ведение журнала в stderr. Для этого используйте параметр командной строки -q или -d.

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

pidfile

Задаёт файл PID. Без pidfile демонизация (-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

Максимальное число серверных соединений на пару «пользователь — база данных». Его можно переопределить параметром pool_size в конфигурации базы данных или пользователя; это значение используется, если для базы или пользователя не задан отдельный pool_size.

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

min_pool_size

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

Применяется только к пулам, для которых выполняется хотя бы одно условие:

  • в записи пула в секции [database] задан ключ user — принудительный пользователь;
  • к пулу подключён хотя бы один клиент.

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

reserve_pool_size

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

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

reserve_pool_timeout

Если клиент не обслужен за это время, используются дополнительные соединения из резервного пула. 0 отключает параметр. [seconds]

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

max_db_connections

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

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

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

По умолчанию: 0 (без ограничений)

max_db_client_connections

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

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

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

По умолчанию: 0 (без ограничений)

max_user_connections

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

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

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

По умолчанию: 0 (без ограничений)

max_user_client_connections

Не разрешать одному пользователю больше указанного числа клиентских соединений независимо от базы данных. Значение должно быть больше max_user_connections. Разность max_user_client_connections и max_user_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_read_only, IntervalStyle.

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

Протокол Postgres позволяет задавать параметры непосредственно в пакете запуска или внутри options пакета запуска . track_extra_parameters поддерживает оба способа. Однако включить в track_extra_parameters сам options нельзя — только содержащиеся в options параметры.

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

ignore_startup_parameters

По умолчанию PgBouncer разрешает в пакетах запуска только параметры, которые может отслеживать: client_encoding, datestyle, timezone и standard_conforming_strings. Все остальные параметры вызывают ошибку. Здесь можно разрешить дополнительные параметры, сообщив PgBouncer, что администратор обрабатывает их самостоятельно и их можно игнорировать.

Для нескольких значений используйте список через запятую, например options,extra_float_digits.

Протокол Postgres позволяет задавать параметры непосредственно в пакете запуска или внутри options пакета запуска . ignore_startup_parameters поддерживает оба способа. Можно даже включить сам options в track_extra_parameters, в результате чего все неизвестные параметры внутри options будут игнорироваться.

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

peer_id

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

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

disable_pqexec

Отключить протокол Simple Query (PQexec). В отличие от Extended Query, Simple Query допускает несколько запросов в одном пакете, что делает возможными некоторые классы атак с внедрением SQL. Отключение может повысить безопасность, но работать продолжат только клиенты, использующие исключительно Extended Query.

По умолчанию: 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). [seconds]

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

max_prepared_statements

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

PgBouncer анализирует все запросы, отправленные клиентами как подготовленные операторы, и присваивает каждой уникальной строке запроса внутреннее имя формата PGBOUNCER_{unique_id}. Если одна строка подготавливается несколько раз, в том числе разными клиентами, запросы используют общее внутреннее имя. На настоящем сервере PostgreSQL PgBouncer подготавливает оператор только под внутренним, а не клиентским именем. PgBouncer запоминает имя, присвоенное клиентом каждому подготовленному оператору, и перед отправкой на сервер переписывает использующую его команду, заменяя клиентское имя внутренним, например my_prepared_statement на PGBOUNCER_123. Если требуемый клиенту оператор ещё не подготовлен на сервере, например потому, что клиенту назначен другой сервер, PgBouncer прозрачно подготавливает оператор перед выполнением.

Примечание: отслеживание и переписывание не работает для команд подготовленных операторов уровня SQL, поэтому PREPARE, EXECUTE и DEALLOCATE передаются Postgres без изменений. Исключение — DEALLOCATE ALL и DISCARD ALL: они работают ожидаемым образом и удаляют подготовленные операторы, которые PgBouncer отслеживал для отправившего команду клиента.

Значение параметра определяет число подготовленных операторов, сохраняемых активными в кэше LRU одного серверного соединения. При значении 0 поддержка подготовленных операторов в транзакционном режиме и режиме на уровне операторов отключается. Для лучшей производительности следует задать значение больше числа часто используемых приложением подготовленных операторов. Чем оно выше, тем больше памяти занимает каждое соединение PgBouncer на сервере PostgreSQL, поскольку в нём остаётся подготовлено больше запросов. Увеличивается и потребление памяти самим PgBouncer, которому нужно отслеживать строки запросов.

Однако влияние на потребление памяти PgBouncer невелико:

  • каждый уникальный запрос хранится один раз в глобальном кэше запросов;
  • каждое клиентское соединение хранит буфер для переписывания пакетов. Его размер не превышает 4 размеров pkt_buf. Этот предел достигается редко — только если запросы подготовленных операторов в 2–4 раза больше pkt_buf.

Рассмотрим пример:

  • имеется 1000 активных клиентов;
  • клиенты подготавливают 200 уникальных запросов;
  • средний размер запроса — 5kB;
  • параметр pkt_buf имеет значение по умолчанию 4096 (4kB).

Тогда PgBouncer требуется не более следующего объёма памяти для обработки подготовленных операторов:

200 x 5kB + 1000 x 4 x 4kB = ~17MB of memory.

Отслеживание подготовленных операторов увеличивает не только расход памяти, но и загрузку CPU, поскольку PgBouncer анализирует и переписывает запросы. Чтобы использовать для обработки несколько ядер, несколько экземпляров PgBouncer могут прослушивать один порт; подробности приведены в документации параметра so_reuseport .

Подготовленные операторы также повышают производительность. Как и при прямом подключении к PostgreSQL, подготовка многократно выполняемого запроса уменьшает общий объём разбора и планирования. Способ отслеживания в PgBouncer особенно полезен, когда несколько клиентов подготавливают одинаковые запросы: клиентские соединения автоматически повторно используют оператор в серверном соединении, даже если его подготовил другой клиент. Например, при pool_size 20 и 100 клиентах, подготавливающих один и тот же запрос, на сервере PostgreSQL запрос будет подготовлен и разобран только 20 раз.

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

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 или открытые пароли.
  • plain: открытый пароль передаётся по сети. Устарел.
  • trust: аутентификация не выполняется, но имя пользователя всё равно должно существовать в auth_file.
  • any: аналог trust, но указанное имя пользователя игнорируется. Все базы данных должны быть настроены для входа от конкретного пользователя. Кроме того, консольная база разрешает любому пользователю вход как администратору.
  • hba: фактический тип аутентификации загружается из auth_hba_file. Это позволяет применять разные методы для разных путей доступа: например, для соединений через Unix-сокет — peer, а для TCP обязательно использовать TLS.
  • ldap: пользователи аутентифицируются на сервере LDAP, как в PostgreSQL (подробности см. https://www.postgresql.org/docs/current/auth-ldap.html ). Параметры соединения LDAP задаются через auth_ldap_options или в auth_hba_file.
  • pam: для аутентификации пользователей применяется PAM, а auth_file игнорируется. Метод несовместим с базами данных, использующими auth_user. Имя службы, передаваемое PAM, — “pgbouncer”. pam не поддерживается в файле конфигурации HBA.

auth_hba_file

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

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

auth_ident_file

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

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

auth_file

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

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

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

auth_user

Если задан auth_user, любой отсутствующий в auth_file пользователь будет запрошен из pg_authid базы данных запросом auth_query от имени auth_user. Пароль auth_user берётся из auth_file. Если для auth_user пароль не нужен, его можно не определять в auth_file.

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

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

auth_query

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

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

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

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

auth_dbname

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

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

Facility для отправки журналов в syslog. Возможные значения: auth, authpriv, daemon, user, local0-7.

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

log_connections

Записывать успешные входы в журнал.

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

log_disconnections

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

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

log_pooler_errors

Записывать сообщения об ошибках, отправляемые пулом клиентам.

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

log_stats

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

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

verbose

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

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


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

admin_users

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

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

stats_users

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

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


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

server_reset_query

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

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

В транзакционном режиме пула server_reset_query не используется, поскольку клиенты не должны применять сеансовые возможности: каждая транзакция попадает в другое соединение и получает другое состояние сеанса.

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

server_reset_query_always

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

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

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

server_check_delay

Сколько времени сохранять освобождённые соединения для немедленного повторного использования без выполнения server_check_query. При 0 проверка выполняется всегда.

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

server_check_query

Простой ничего не изменяющий запрос для проверки работоспособности серверного соединения.

Пустая строка отключает проверку.

Значение <empty> отправляет пустой запрос для проверки.

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

server_fast_close

В сеансовом режиме пула отключать сервер в состоянии “close_needed” немедленно или после завершения текущей транзакции, не дожидаясь конца сеанса. Состояние задаётся командой RECONNECT, командой RELOAD, изменяющей параметры соединения, или изменением DNS. В режиме на уровне операторов и транзакционном режиме параметр не действует, поскольку там это поведение используется по умолчанию.

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

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

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

server_lifetime

Пул закрывает неиспользуемое серверное соединение, которое сейчас не связано ни с одним клиентом и существует дольше указанного времени. Значение 0 означает, что соединение используется один раз, а затем закрывается. [seconds]

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

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

server_idle_timeout

Серверное соединение закрывается после указанного числа секунд бездействия. Значение 0 отключает тайм-аут. [seconds]

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

server_connect_timeout

Если соединение и вход не завершены за указанное время, соединение закрывается. [seconds]

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

server_login_retry

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

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

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

client_login_timeout

Если клиент подключился, но не успел войти за указанное время, он отключается. Это главным образом предотвращает блокировку SUSPEND и, следовательно, перезапуска без остановки обслуживания неработающими соединениями. [seconds]

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

autodb_idle_timeout

Автоматически созданные через * пулы баз данных освобождаются после указанного числа секунд бездействия. При этом их статистика также забывается. [seconds]

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

dns_max_ttl

Сколько времени можно кэшировать результаты поиска DNS. Фактический TTL DNS игнорируется. [seconds]

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

dns_nxdomain_ttl

Сколько времени можно кэшировать ошибки DNS и результаты поиска DNS для NXDOMAIN. [seconds]

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

dns_zone_check_period

Период проверки изменения серийного номера зоны.

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

Работает только с бэкендом c-ares (параметр configure --with-cares).

По умолчанию: 0.0 (disabled)

resolv_conf

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

Требуется бэкенд evdns (>= 2.0.3) или c-ares (>= 1.15.0).

Файл разбирается библиотекой бэкенда DNS, а не PgBouncer. Допустимый синтаксис и директивы описаны в документации библиотеки.

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

query_wait_notify

Время нахождения клиента в очереди до отправки PgBouncer уведомления о постановке в очередь. [seconds]

Значение 0 отключает уведомление.

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


Параметры TLS

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

Изменение любого параметра TLS автоматически запускает RECONNECT по соображениям безопасности.

client_tls_sslmode

Режим TLS для соединений от клиентов. По умолчанию TLS отключён. При включении обязательно настроить client_tls_key_file и client_tls_cert_file, задающие ключ и сертификат, с которыми PgBouncer принимает клиентские соединения. Наиболее распространённый поддерживаемый формат сертификата — PEM.

  • disable: обычный TCP. Запрос клиента на TLS игнорируется. Значение по умолчанию.
  • allow: если клиент запрашивает TLS, он используется; иначе применяется обычный TCP. Представленный клиентом сертификат не проверяется.
  • prefer: аналог allow.
  • require: клиент обязан использовать TLS, иначе соединение отклоняется. Представленный клиентом сертификат не проверяется.
  • verify-ca: клиент обязан использовать TLS с действительным клиентским сертификатом.
  • verify-full: аналог verify-ca.

client_tls_key_file

Закрытый ключ, с которым PgBouncer принимает клиентские соединения.

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

client_tls_cert_file

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

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

client_tls_ca_file

Файл корневого сертификата для проверки клиентских сертификатов.

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

client_tls_protocols

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

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

client_tls_ciphers

Разрешённые шифры TLS в синтаксисе OpenSSL. Сокращения:

  • default/secure/fast/normal (все используют общесистемные значения OpenSSL по умолчанию)
  • all (включает все шифры; не рекомендуется)

Влияет только на соединения с TLS версии 1.2 и ниже. Для версии 1.3 см. ниже client_tls13_ciphers.

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

client_tls13_ciphers

Разрешённые шифры TLS v1.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-bit ECDH), имя кривой.

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

client_tls_dheparams

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

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

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

server_tls_sslmode

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

  • disable: обычный TCP. TLS даже не запрашивается у сервера.
  • allow: FIXME: если сервер отклоняет обычное соединение, попробовать TLS?
  • prefer: сначала у PostgreSQL всегда запрашивается соединение TLS. При отказе устанавливается обычное соединение TCP. Сертификат сервера не проверяется. Значение по умолчанию.
  • require: соединение обязательно должно использовать TLS. При отказе сервера обычный TCP не пробуется. Сертификат сервера не проверяется.
  • verify-ca: соединение обязательно должно использовать TLS, а сертификат сервера должен быть действителен согласно server_tls_ca_file. Имя узла сервера не сверяется с сертификатом.
  • verify-full: соединение обязательно должно использовать TLS, сертификат сервера должен быть действителен согласно server_tls_ca_file, а имя узла — соответствовать данным сертификата.

server_tls_ca_file

Файл корневого сертификата для проверки сертификатов сервера PostgreSQL.

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

server_tls_key_file

Закрытый ключ для аутентификации PgBouncer на сервере PostgreSQL.

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

server_tls_cert_file

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

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

server_tls_protocols

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

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

server_tls_ciphers

Разрешённые шифры TLS в синтаксисе OpenSSL. Сокращения:

  • default/secure/fast/normal (все используют общесистемные значения OpenSSL по умолчанию)
  • all (включает все шифры; не рекомендуется)

Влияет только на соединения с TLS версии 1.2 и ниже. Для версии 1.3 см. ниже server_tls13_ciphers.

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

server_tls13_ciphers

Разрешённые шифры TLS v1.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 и ниже см. client_tls_ciphers.

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


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

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

query_timeout

Запросы, выполняющиеся дольше указанного времени, отменяются. Параметр следует использовать только вместе с немного меньшим серверным statement_timeout, чтобы он срабатывал лишь при проблемах сети. [seconds]

По умолчанию: 0.0 (disabled)

query_wait_timeout

Максимальное разрешённое время ожидания выполнения запроса. Если за это время запросу не назначен сервер, клиент отключается. 0 отключает тайм-аут; тогда клиенты могут находиться в очереди неограниченно долго. [seconds]

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

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

cancel_wait_timeout

Максимальное разрешённое время ожидания выполнения запроса отмены. Если за это время запросу отмены не назначен сервер, клиент отключается. 0 отключает тайм-аут; тогда запросы отмены могут находиться в очереди неограниченно долго. [seconds]

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

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

client_idle_timeout

Клиентские соединения закрываются после указанного числа секунд бездействия. Значение должно превышать клиентские параметры времени существования соединения; параметр следует использовать только при проблемах сети. [seconds]

По умолчанию: 0.0 (disabled)

idle_transaction_timeout

Если клиент находится в состоянии “idle in transaction” дольше указанного времени, он отключается. [seconds]

По умолчанию: 0.0 (disabled)

transaction_timeout

Если клиент находится в состоянии “in transaction” дольше указанного времени, он отключается. [seconds]

По умолчанию: 0.0 (disabled)

suspend_timeout

Сколько ждать сброса буфера во время SUSPEND или перезапуска (-R). Если сброс не удаётся, соединение разрывается. [seconds]

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


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

pkt_buf

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

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

max_packet_size

Максимальный размер пакета PostgreSQL, пропускаемого PgBouncer. Один пакет содержит один запрос или одну строку набора результатов. Полный набор результатов может быть больше.

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

listen_backlog

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

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

sbuf_loopcnt

Сколько раз обрабатывать данные одного соединения перед переходом дальше. Без ограничения одно соединение с большим набором результатов может надолго заблокировать PgBouncer. За один цикл обрабатывается объём данных pkt_buf. 0 означает отсутствие ограничения.

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

so_reuseport

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

Подробное поведение зависит от ядра операционной системы. На момент написания параметр даёт требуемый эффект в достаточно новых версиях Linux, DragonFlyBSD и FreeBSD. В FreeBSD вместо него применяется параметр сокета SO_REUSEPORT_LB. Некоторые другие системы поддерживают этот параметр сокета, но без нужного эффекта: несколько процессов смогут привязаться к одному порту, однако соединения будет получать только один. Подробности см. в документации setsockopt() вашей системы.

В системах без поддержки этого параметра сокета его включение приведёт к ошибке.

Каждому экземпляру 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, и назначения маршрутизации этих соединений. Секция содержит строки key=value вида:

dbname = connection string

Ключ считается именем базы данных, а значение — строкой соединения из описанных ниже пар key=value параметров соединения. Синтаксис похож на libpq, но сама libpq не используется, а набор доступных возможностей отличается. Пример:

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

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

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

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

* = host=foo

соединение с PgBouncer, указавшее базу bar, будет фактически вести себя так, как если бы существовала запись:

bar = host=foo dbname=bar

При этом используется значение dbname по умолчанию — имя базы данных на стороне клиента; см. ниже.

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

Если пароль здесь не указан, для заданного выше пользователя используется пароль из 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.

Применяется только при выполнении хотя бы одного условия:

  • в этой записи секции [database] задан ключ 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: новая попытка соединения выбирает следующую запись узла в списке.
  • disable: новые соединения используют одну запись узла до ошибки, после чего выбирается следующая.

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

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

max_db_connections

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

max_db_client_connections

Задаёт общий для базы данных максимум клиентских соединений. Следует использовать вместе с max_client_conn, чтобы ограничить число соединений, принимаемых PgBouncer.

server_lifetime

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

client_encoding

Запрашивает у сервера конкретное значение client_encoding.

datestyle

Запрашивает у сервера конкретное значение datestyle.

timezone

Запрашивает у сервера конкретное значение timezone.


Секция [users]

Эта секция содержит строки key=value вида:

user1 = settings

Ключ считается именем пользователя, а значение — списком пар key=value параметров конфигурации этого пользователя. Пример:

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]

Секция [peers] определяет одноранговые узлы, которым PgBouncer может передавать запросы отмены, и маршруты этих запросов.

Процессы PgBouncer можно связать в одноранговую группу, задав peer_id и секцию [peers] в конфигурации каждого процесса. Тогда процессы смогут передавать запросы отмены тому процессу, где возник отменяемый запрос. Это необходимо, чтобы отмена работала, когда несколько процессов PgBouncer, возможно на разных серверах, находятся за одним балансировщиком TCP. Запрос отмены передаётся по другому соединению TCP, чем отменяемый запрос, поэтому балансировщик TCP может направить его не тому процессу. Одноранговое взаимодействие в конечном счёте доставляет запрос отмены нужному процессу. Подробнее см. запись доклада на конференции .

Секция содержит строки key=value вида:

peer_id = connection string

Ключ считается peer_id, а значение — строкой соединения из описанных ниже пар key=value параметров. Синтаксис похож на libpq, но сама libpq не используется, а набор доступных возможностей отличается. Пример:

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

Примечание 1: для однорангового взаимодействия peer_id каждого процесса PgBouncer должен быть уникален в группе, а секция [peers] должна содержать записи всех этих идентификаторов. Пример приведён в разделе примеров. Секция [peers] может, но не обязана содержать peer_id самого PgBouncer, которому принадлежит конфигурация. Такая запись игнорируется, но упрощает управление: одну и ту же секцию [peers] можно использовать в нескольких конфигурациях.

Примечание 2: одноранговое взаимодействие разных версий поддерживается, пока все узлы находятся по одну сторону границы v1.21.0. В v1.21.0 формат кодирования токенов отмены был несовместимо изменён, поэтому они не совместимы с токенами предыдущих версий.

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

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

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


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

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

%include filename

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


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

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

"username1" "password" ...
"username2" "md5abcdef012342345" ...
"username2" "SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>"

Должно присутствовать не менее 2 полей в двойных кавычках. Первое поле — имя пользователя, второе — открытый пароль, хешированный MD5 пароль или секрет SCRAM. Остаток строки PgBouncer игнорирует. Двойную кавычку внутри значения поля можно экранировать двумя двойными кавычками.

Формат хешированного MD5 пароля PostgreSQL:

"md5" + md5(password + username)

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

Формат секрета SCRAM PostgreSQL:

SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>

Подробности приведены в документации PostgreSQL и RFC 5803.

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

Ограничения

Открытый пароль можно использовать с любым парольным методом аутентификации сервера бэкенда: plain text, MD5 или SCRAM (подробности см. https://www.postgresql.org/docs/current/auth-password.html ).

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

Секреты SCRAM можно использовать для входа на сервер только при одновременном выполнении трёх условий: клиентская аутентификация также использует SCRAM, определение базы данных PgBouncer не задаёт имя пользователя, а секреты SCRAM в PgBouncer и на сервере PostgreSQL идентичны — совпадают соль и итерации, а не только пароль. Это следует из свойства безопасности SCRAM: одного хранимого секрета SCRAM недостаточно для получения учётных данных входа.

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

Примечание об управляемых серверах

Если сервер бэкенда использует парольную аутентификацию SCRAM, PgBouncer не сможет пройти аутентификацию, не зная: a) открытого пароля пользователя или b) соответствующего секрета SCRAM.

Некоторые облачные провайдеры, например AWS RDS, запрещают доступ к конфиденциальным системным таблицам PostgreSQL для получения паролей. Даже у самого привилегированного пользователя, например участника rds_superuser, запрос select * from pg_authid возвращает ERROR: permission denied for table pg_authid. Это известное поведение (статья ).

Поэтому получить существующий секрет SCRAM после его сохранения на управляемом сервере невозможно, что затрудняет настройку PgBouncer с тем же секретом SCRAM. Тем не менее секрет SCRAM можно настроить с обеих сторон следующим способом:

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

$ 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>'
**************************

Скопируйте секрет SCRAM из QUERY и укажите его в userlist.txt PgBouncer.

Если использован другой инструмент, а не psql --echo-hidden, секрет SCRAM необходимо также задать на сервере, например командой ALTER ROLE <role_name> PASSWORD '<scram_secret>'.


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

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

Файл соответствует формату PostgreSQL pg_hba.conf (см. https://www.postgresql.org/docs/current/auth-pg-hba-conf.html ).

  • Поддерживаемые типы записей: local, host, hostssl, hostnossl.
  • Поле базы данных: поддерживаются all, replication, sameuser, @file и несколько имён. Не поддерживаются samerole, samegroup.
  • Поле имени пользователя: поддерживаются all, @file и несколько имён. Не поддерживается +groupname.
  • Поле адреса: поддерживаются all, IPv4, IPv6. Не поддерживаются samehost, samenet, имена DNS и префиксы доменов.
  • Поле метода аутентификации: поддерживаются методы auth_type PgBouncer, а также peer и reject, кроме any и pam, работающих только глобально.
  • Параметр сопоставления имён пользователей (map=) поддерживается при auth_type со значением cert или peer.

Формат файла сопоставления ident

Местоположение файла сопоставления ident задаётся параметром auth_ident_file. Он загружается только при auth_type со значением hba.

Формат представляет собой упрощённый вариант файла сопоставления ident PostgreSQL (см. https://www.postgresql.org/docs/current/auth-username-maps.html ).

  • Поддерживаются только строки вида map-name system-username database-username.
  • Включение файла или каталога не поддерживается.
  • Поле system-username: регулярные выражения не поддерживаются.
  • Поле database-username: поддерживается all или одно имя пользователя Postgres. Не поддерживаются +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 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

Пример безопасной функции для 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;

Примеры конфигураций для 2 одноранговых процессов 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(1) — страница man с общими сведениями об использовании и командах консоли.

https://www.pgbouncer.org/

3 - Использование команды pgbouncer

Использование командной строки и административной консоли PgBouncer

Синтаксис

pgbouncer [-d][-R][-v][-u user] <pgbouncer.ini>
pgbouncer -V|-h

Параметры для Windows:

pgbouncer.exe [-v][-u user] <pgbouncer.ini>
pgbouncer.exe -V|-h

Дополнительные параметры для настройки службы Windows:

pgbouncer.exe --regservice   <pgbouncer.ini>
pgbouncer.exe --unregservice <pgbouncer.ini>

Описание

PgBouncer — менеджер пула соединений PostgreSQL. Любое клиентское приложение может подключаться к PgBouncer как к серверу PostgreSQL, а PgBouncer создаст соединение с настоящим сервером либо повторно использует одно из существующих соединений.

Цель PgBouncer — уменьшить влияние открытия новых соединений с PostgreSQL на производительность.

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

Сеансовый режим пула

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

Транзакционный режим пула

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

Режим пула на уровне операторов

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

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


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

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

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

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

     "someuser" "same_password_as_in_server"
    
  3. Запустите PgBouncer:

     $ pgbouncer -d pgbouncer.ini
    
  4. Подключите приложение или клиент psql к PgBouncer, а не напрямую к серверу PostgreSQL:

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

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

     pgbouncer=# RELOAD;
    

Ключи командной строки

-d, --daemon
Запустить в фоновом режиме. Без этого ключа процесс работает на переднем плане.

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

Примечание: в Windows этот ключ не работает; там PgBouncer должен быть запущен как служба.

-R, --reboot
УСТАРЕЛ: вместо этого параметра используйте поэтапный перезапуск нескольких процессов PgBouncer, прослушивающих один порт с помощью so_reuseport. Выполнить перезапуск без остановки обслуживания: подключиться к работающему процессу, получить от него открытые сокеты и использовать их. Если активного процесса нет, выполняется обычный запуск. Примечание: работает только при поддержке Unix-сокетов операционной системой и включённом в конфигурации unix_socket_dir. Не работает в Windows и с соединениями TLS — они разрываются.
-u USERNAME, --user= USERNAME
При запуске переключиться на указанного пользователя.
-v, --verbose
Увеличить подробность вывода. Можно указывать несколько раз.
-q, --quiet
Не записывать журнал в stderr. Это не влияет на подробность ведения журнала, а лишь запрещает использование stderr. Предназначено для сценариев init.d.
-V, --version
Показать версию.
-h, --help
Показать краткую справку.
--regservice
Win32: зарегистрировать PgBouncer как службу Windows. В качестве имени регистрации используется значение параметра конфигурации service_name.
--unregservice
Win32: отменить регистрацию службы Windows.

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

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

$ psql -p 6432 pgbouncer

Вход в консоль разрешён только пользователям, перечисленным в параметрах конфигурации admin_users или stats_users. Исключение — auth_type=any: в этом случае любой пользователь допускается как stats_user.

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

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

Команды SHOW

Команды SHOW выводят сведения. Каждая команда описана ниже.

SHOW STATS

Показывает статистику. В этой и связанных командах итоговые значения считаются с момента запуска процесса, а средние обновляются каждые 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 в соединении с PostgreSQL внутри транзакции — в состоянии ожидания либо при выполнении запросов.
total_query_time
Общее число микросекунд, проведённых PgBouncer в активном соединении с PostgreSQL при выполнении запросов.
total_wait_time
Время ожидания сервера клиентами в микросекундах. Обновляется при назначении клиентскому соединению соединения с бэкендом.
total_client_parse_count
Общее число подготовленных операторов, созданных клиентами. Применимо только в режиме отслеживания именованных подготовленных операторов; см. max_prepared_statements.
total_server_parse_count
Общее число подготовленных операторов, созданных PgBouncer на сервере. Применимо только в режиме отслеживания именованных подготовленных операторов; см. max_prepared_statements.
total_bind_count
Общее число подготовленных операторов, которые клиенты подготовили к выполнению, а PgBouncer передал PostgreSQL. Применимо только в режиме отслеживания именованных подготовленных операторов; см. 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.
avg_bind_count
Среднее число подготовленных операторов, которые клиенты подготовили к выполнению, а PgBouncer передал PostgreSQL. Применимо только в режиме отслеживания именованных подготовленных операторов; см. max_prepared_statements.

SHOW STATS_TOTALS

Подмножество SHOW STATS, отображающее итоговые значения (total_).

SHOW STATS_AVERAGES

Подмножество SHOW STATS, отображающее средние значения (avg_).

SHOW TOTALS

Аналог SHOW STATS с агрегированием по всем базам данных.

SHOW SERVERS

type
S — сервер.
user
Имя пользователя, от которого PgBouncer подключается к серверу.
database
Имя базы данных.
replication
Использует ли серверное соединение репликацию. Возможные значения: none, logical или physical.
state
Состояние серверного соединения PgBouncer: active, idle, used, tested, new, active_cancel или being_canceled.
addr
IP-адрес сервера PostgreSQL.
port
Порт сервера PostgreSQL.
local_addr
Начальный адрес соединения на локальном компьютере.
local_port
Начальный порт соединения на локальном компьютере.
connect_time
Время установления соединения.
request_time
Время отправки последнего запроса.
wait
Для серверных соединений не используется.
wait_us
Для серверных соединений не используется.
close_needed
1, если соединение будет закрыто при первой возможности, поскольку перезагрузка файла конфигурации или обновление DNS изменили сведения о соединении либо была выполнена команда RECONNECT.
ptr
Адрес внутреннего объекта этого соединения.
link
Адрес клиентского соединения, связанного с сервером.
remote_pid
PID серверного процесса бэкенда. Если соединение установлено через Unix-сокет и операционная система поддерживает получение идентификатора процесса, это PID ОС. В противном случае он извлекается из отправленного сервером пакета отмены: для сервера PostgreSQL это должен быть PID, а для другого PgBouncer — случайное число.
tls
Строка со сведениями о соединении TLS либо пустая строка, если TLS не используется.
application_name
Строка со значением application_name, заданным в связанном клиентском соединении; пустая строка, если значение не задано или связанного соединения нет.
prepared_statements
Число подготовленных на сервере операторов. Оно ограничено параметром max_prepared_statements.
id
Уникальный идентификатор сервера.

SHOW CLIENTS

type
C — клиент.
user
Пользователь подключённого клиента.
database
Имя базы данных.
replication
Использует ли клиентское соединение репликацию. Возможные значения: none, logical или physical.
state
Состояние клиентского соединения: active (клиентские соединения, связанные с серверными), idle (клиентские соединения без ожидающих обработки запросов), waiting, active_cancel_req или waiting_cancel_req.
addr
IP-адрес клиента.
port
Исходный порт клиента.
local_addr
Конечный адрес соединения на локальном компьютере.
local_port
Конечный порт соединения на локальном компьютере.
connect_time
Отметка времени установления соединения.
request_time
Отметка времени последнего запроса клиента.
wait
Текущее время ожидания в секундах.
wait_us
Микросекундная часть текущего времени ожидания.
close_needed
Для клиентов не используется.
ptr
Адрес внутреннего объекта этого соединения.
link
Адрес серверного соединения, связанного с клиентом.
remote_pid
Идентификатор процесса, если клиент подключается через Unix-сокет и операционная система поддерживает его получение.
tls
Строка со сведениями о соединении TLS либо пустая строка, если TLS не используется.
application_name
Строка со значением application_name, заданным клиентом для этого соединения, либо пустая строка, если значение не задано.
prepared_statements
Число подготовленных клиентом операторов.
id
Уникальный идентификатор клиента.

SHOW POOLS

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

database
Имя базы данных.
user
Имя пользователя.
cl_active
Клиентские соединения, связанные с серверными, либо неактивные клиентские соединения без запросов, ожидающих обработки.
cl_waiting
Клиентские соединения, отправившие запросы, но ещё не получившие серверного соединения.
cl_active_cancel_req
Клиентские соединения, передавшие серверу запросы отмены и ожидающие ответа сервера.
cl_waiting_cancel_req
Клиентские соединения, которые ещё не передали серверу запросы отмены.
sv_active
Серверные соединения, связанные с клиентом.
sv_active_cancel
Серверные соединения, которые сейчас передают запрос отмены.
sv_being_canceled
Серверы, которые обычно могли бы перейти в состояние ожидания, но ждут завершения всех выполняющихся запросов отмены, отправленных для отмены запроса на этом сервере.
sv_idle
Неиспользуемые серверные соединения, немедленно доступные для клиентских запросов.
sv_used
Серверные соединения, остававшиеся неактивными дольше server_check_delay; перед повторным использованием на них необходимо выполнить server_check_query.
sv_tested
Серверные соединения, на которых сейчас выполняется server_reset_query или server_check_query.
sv_login
Серверные соединения, в которых сейчас выполняется вход.
maxwait
Время ожидания первого, самого старого клиента в очереди, в секундах. Рост этого значения означает, что текущий пул серверов обрабатывает запросы недостаточно быстро. Причиной может быть перегруженный сервер или слишком малое значение pool_size.
maxwait_us
Микросекундная часть максимального времени ожидания.
pool_mode
Используемый режим пула.
load_balance_hosts
Используемое значение load_balance_hosts, если узел пула содержит список через запятую.

SHOW PEER_POOLS

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

database
Идентификатор настроенной записи peer.
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 и PostgreSQL принудительно устанавливается от указанного пользователя независимо от пользователя клиента.
pool_size
Максимальное число серверных соединений.
min_pool_size
Минимальное число серверных соединений.
reserve_pool_size
Максимальное число дополнительных соединений для этой базы данных.
server_lifetime
Максимальное время существования серверного соединения для этой базы данных.
pool_mode
Переопределённое базой данных значение pool_mode либо NULL, если используется значение по умолчанию.
load_balance_hosts
Значение load_balance_hosts базы данных, если узел содержит список через запятую.
max_connections
Максимальное разрешённое число серверных соединений для этой базы данных, заданное max_db_connections глобально или для конкретной базы.
current_connections
Текущее число серверных соединений для этой базы данных.
max_client_connections
Максимальное разрешённое число клиентских соединений для этого экземпляра PgBouncer, заданное max_db_client_connections для базы данных.
current_client_connections
Текущее число клиентских соединений для этой базы данных.
paused
1, если база данных сейчас приостановлена, иначе 0.
disabled
1, если база данных сейчас отключена, иначе 0.

SHOW PEERS

peer_id
Идентификатор настроенной записи peer.
host
Узел, к которому подключается PgBouncer.
port
Порт, к которому подключается PgBouncer.
pool_size
Максимальное число серверных соединений с этим одноранговым узлом.

SHOW FDS

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

Если подключённый пользователь имеет имя «pgbouncer», подключается через Unix-сокет и имеет тот же UID, что и работающий процесс, по соединению передаются настоящие файловые дескрипторы. Этот механизм используется для перезапуска без остановки обслуживания. Примечание: в Windows он не работает.

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

fd
Числовое значение файлового дескриптора.
task
Одно из значений: pooler, client или server.
user
Пользователь соединения, использующего файловый дескриптор.
database
База данных соединения, использующего файловый дескриптор.
addr
IP-адрес соединения, использующего файловый дескриптор, либо unix при использовании Unix-сокета.
port
Порт соединения, использующего файловый дескриптор.
cancel
Ключ отмены для этого соединения.
link
fd соответствующего сервера/клиента; 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. Текущие состояния: active, paused и suspended.

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

PAUSE [db]

PgBouncer пытается отключиться от всех серверов. Перед отключением каждого серверного соединения PgBouncer ждёт его освобождения в соответствии с режимом пула: в транзакционном режиме должна завершиться транзакция, в режиме на уровне операторов — оператор, а в сеансовом режиме должен отключиться клиент. Команда не завершится, пока не будут разорваны все серверные соединения. Используйте её при перезапуске базы данных.

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

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

DISABLE db

Отклонить все новые клиентские соединения с указанной базой данных.

ENABLE db

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

RECONNECT [db]

Закрыть каждое открытое серверное соединение указанной базы данных или всех баз после его освобождения в соответствии с режимом пула, даже если срок его существования ещё не истёк. Новые серверные соединения можно создавать сразу; они будут устанавливаться по мере необходимости согласно параметрам размера пула.

Эта команда полезна при изменении настройки серверного соединения, например для постепенного планового переключения на новый сервер. Выполнять её не нужно, если строка соединения в pgbouncer.ini была изменена и перезагружена (см. RELOAD) или изменилось разрешение DNS: в таких случаях эквивалентная команда выполняется автоматически. Команда необходима только тогда, когда соединения маршрутизирует компонент ниже PgBouncer.

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

KILL [db]

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

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

KILL_CLIENT id

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

Пример команды: KILL_CLIENT 1234.

SUSPEND

Все буферы сокетов сбрасываются, и PgBouncer прекращает принимать из них данные. Команда не завершится, пока все буферы не опустеют. Используйте её при перезапуске PgBouncer без остановки обслуживания.

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

RESUME [db]

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

SHUTDOWN

Процесс PgBouncer завершится.

SHUTDOWN WAIT_FOR_SERVERS

Прекратить принимать новые соединения и завершить работу после освобождения всех серверов. По сути, это равнозначно выполнению PAUSE и SHUTDOWN, но во время ожидания PAUSE также прекращается приём новых соединений и сразу отключаются клиенты, ожидающие серверного соединения. Обратите внимание: во время завершения работы UNIX-сокеты останутся открыты, но будут принимать только подключения к административной консоли PgBouncer.

SHUTDOWN WAIT_FOR_CLIENTS

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

  1. Запустите два или более процессов PgBouncer на одном порту с использованием so_reuseport (настройка одноранговых узлов рекомендуется, но не обязательна). Для перезапуска без простоя процессы перезапускаются по одному: остальные продолжают принимать соединения, пока один процесс перезапускается.
  2. Выберите первый процесс для перезапуска и назовите его A.
  3. Выполните для процесса A SHUTDOWN WAIT_FOR_CLIENTS или отправьте SIGTERM.
  4. Заставьте всех клиентов переподключиться. Можно дождаться, пока клиентский пул инициирует переподключение из-за server_idle_timeout или аналогичного параметра. Если клиентский пул не используется, можно перезапустить клиентов. После переподключения всех клиентов процесс A завершится автоматически, поскольку к нему больше никто не подключён.
  5. Снова запустите процесс A.
  6. Повторите шаги 3, 4 и 5 по очереди для каждого оставшегося процесса, пока не перезапустите их все.

RELOAD

Процесс PgBouncer перезагрузит файлы конфигурации и обновит изменяемые параметры. Это относится к основному файлу конфигурации, а также к файлам, указанным параметрами auth_file и auth_hba_file.

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

WAIT_CLOSE [db]

Ждать, пока все серверные соединения указанной базы данных или всех баз не выйдут из состояния “close_needed” (см. SHOW SERVERS). Команду можно вызвать после RECONNECT или RELOAD, чтобы дождаться полного применения соответствующего изменения конфигурации, например в сценариях планового переключения.

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

SET key = arg

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

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

(Обратите внимание: эта команда выполняется в административной консоли PgBouncer и задаёт параметры PgBouncer. Команда SET, выполненная в другой базе данных, передаётся бэкенду PostgreSQL как любая другая команда SQL.)

Сигналы

SIGHUP
Перезагрузить конфигурацию. Равнозначно команде RELOAD в консоли.
SIGTERM
Сверхбезопасное завершение работы. Дождаться отключения всех существующих клиентов, не принимая новые соединения. Равнозначно команде SHUTDOWN WAIT_FOR_CLIENTS в консоли. Если сигнал получен во время уже выполняющегося завершения работы, вместо «сверхбезопасного завершения» запускается «немедленное завершение». В версиях PgBouncer до 1.23.0 этот сигнал вызывал «немедленное завершение».
SIGINT
Безопасное завершение работы. Равнозначно команде SHUTDOWN WAIT_FOR_SERVERS в консоли. Если сигнал получен во время уже выполняющегося завершения, вместо «безопасного завершения» запускается «немедленное завершение».
SIGQUIT
Немедленное завершение работы. Равнозначно команде SHUTDOWN в консоли.
SIGUSR1
Равнозначно команде PAUSE в консоли.
SIGUSR2
Равнозначно команде RESUME в консоли.

Параметры Libevent

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

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

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


См. также

pgbouncer(5) — страница man с описанием параметров конфигурации.

https://www.pgbouncer.org/

4 - Компиляция и установка PgBouncer

Инструкции по компиляции и установке PgBouncer

Сборка

Для компиляции PgBouncer требуется несколько компонентов:

  • GNU Make 3.81+
  • Libevent 2.0+
  • pkg-config
  • OpenSSL 1.0.1+ для поддержки TLS
  • (необязательно) c-ares как альтернатива evdns из Libevent
  • (необязательно) библиотеки LDAP
  • (необязательно) библиотеки PAM

После установки зависимостей выполните:

$ ./configure --prefix=/usr/local
$ make
$ make install

Для сборки из Git или под Windows используйте отдельные инструкции ниже.


Поддержка поиска DNS

PgBouncer разрешает имена узлов при установке соединения, а не только один раз при загрузке конфигурации. Для этого нужна асинхронная реализация DNS. В таблице перечислены поддерживаемые бэкенды в порядке их проверки:

БэкендПараллельноEDNS0 (1)/etc/hostsПоиск SOA (2)Примечание
c-aresдадададаошибки IPv6+CNAME в <=1.10
evdns, libevent 2.xданетданетне проверяет обновления /etc/hosts
getaddrinfo_a, glibc 2.9+дада (3)данетнедоступен вне glibc
getaddrinfo, libcнетда (3)данеттребует pthreads
  1. EDNS0 необходим, если с одним именем узла связано более 8 адресов.
  2. Поиск SOA необходим для повторной проверки имён узлов при изменении серийного номера зоны.
  3. Чтобы включить EDNS0, добавьте options edns0 в /etc/resolv.conf.

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

По умолчанию при наличии c-ares используется именно он. Его можно принудительно выбрать с помощью configure --with-cares или отключить через --without-cares. Если c-ares не используется — не найден или отключён, — выбирается Libevent. Укажите --disable-evdns, чтобы отключить evdns из Libevent и перейти к реализации на основе libc.


Аутентификация PAM

Для включения аутентификации PAM у ./configure есть флаг --with-pam (по умолчанию отключён). После компиляции с поддержкой PAM становится доступен новый глобальный тип аутентификации pam для проверки пользователей через PAM.


Аутентификация LDAP

Для включения аутентификации LDAP у ./configure есть флаг --with-ldap (по умолчанию отключён). После компиляции с поддержкой LDAP становится доступен новый глобальный тип аутентификации ldap для проверки пользователей через LDAP.


Интеграция с systemd

Чтобы включить интеграцию с systemd, используйте параметр configure --with-systemd. Он позволяет применять Type=notify либо Type=notify-reload в systemd 253 и новее, а также активацию через сокеты. Примеры приведены в etc/pgbouncer.service и etc/pgbouncer.socket.


Сборка из Git

При сборке PgBouncer из Git перед запуском configure необходимо создать файлы заголовков и конфигурации:

$ git clone https://github.com/pgbouncer/pgbouncer.git
$ cd pgbouncer
$ ./autogen.sh
$ ./configure
$ make
$ make install

По умолчанию все файлы устанавливаются в /usr/local. Команде configure можно передать один или несколько параметров командной строки. Выполните ./configure --help, чтобы получить список доступных параметров и переменных окружения для настройки конфигурации.

Дополнительно требуются пакеты: autoconf, automake, libtool, pandoc.


Тестирование

Порядок запуска тестов приведён в файле README.md каталога тестов .


Сборка под Windows

Единственная поддерживаемая среда сборки в Windows — MinGW. Cygwin и Visual $ANYTHING не поддерживаются.

Для сборки в MinGW выполните обычные команды:

$ ./configure
$ make

При кросс-компиляции из Unix:

$ ./configure --host=i586-mingw32msvc

Сборка с LDAP в Windows сейчас не поддерживается.


Запуск в Windows

Запуск из командной строки выполняется обычным образом, но ключи -d (демонизация), -R (перезапуск) и -u (смена пользователя) не работают.

Чтобы запустить PgBouncer как службу Windows, задайте имя службы параметром service_name, затем выполните:

$ pgbouncer -regservice config.ini

Чтобы удалить службу:

$ pgbouncer -unregservice config.ini

Чтобы использовать журнал событий Windows, задайте в файле конфигурации syslog = 1. Перед этим необходимо зарегистрировать pgbevent.dll:

$ regsvr32 pgbevent.dll

Чтобы отменить регистрацию:

$ regsvr32 /u pgbevent.dll

5 - Загрузка исходных выпусков

Выпуски исходного кода и двоичные пакеты PgBouncer

PgBouncer 1.25

ФайлДатаРазмерSHA256
pgbouncer-1.25.2.tar.gz2026-05-08865371 bytessha256
pgbouncer-1.25.1.tar.gz2025-12-03864801 bytessha256
pgbouncer-1.25.0.tar.gz2025-11-09863322 bytessha256

PgBouncer 1.24

ФайлДатаРазмерSHA256
pgbouncer-1.24.1.tar.gz2025-04-16717796 bytessha256
pgbouncer-1.24.0.tar.gz2025-01-10706573 bytessha256

PgBouncer 1.23

ФайлДатаРазмерSHA256
pgbouncer-1.23.1.tar.gz2024-08-02700025 bytessha256
pgbouncer-1.23.0.tar.gz2024-07-03694845 bytessha256

PgBouncer 1.22

ФайлДатаРазмерSHA256
pgbouncer-1.22.1.tar.gz2024-03-04677351 bytessha256
pgbouncer-1.22.0.tar.gz2024-01-31670589 bytessha256

PgBouncer 1.21

ФайлДатаРазмерSHA256
pgbouncer-1.21.0.tar.gz2023-10-16668211 bytessha256

PgBouncer 1.20

ФайлДатаРазмерSHA256
pgbouncer-1.20.1.tar.gz2023-08-09638844 bytessha256
pgbouncer-1.20.0.tar.gz2023-07-20638020 bytessha256

PgBouncer 1.19

ФайлДатаРазмерSHA256
pgbouncer-1.19.1.tar.gz2023-05-31623569 bytessha256
pgbouncer-1.19.0.tar.gz2023-05-04616947 bytessha256

PgBouncer 1.18

ФайлДатаРазмерSHA256
pgbouncer-1.18.0.tar.gz2022-12-12600825 bytessha256

PgBouncer 1.17

ФайлДатаРазмерSHA256
pgbouncer-1.17.0.tar.gz2022-03-23598294 bytessha256

PgBouncer 1.16

ФайлДатаРазмерSHA256
pgbouncer-1.16.1.tar.gz2021-11-11591450 bytessha256
pgbouncer-1.16.0.tar.gz2021-08-09592136 bytessha256

PgBouncer 1.15

ФайлДатаРазмерSHA256
pgbouncer-1.15.0.tar.gz2020-11-19588042 bytessha256

PgBouncer 1.14

ФайлДатаРазмерSHA256
pgbouncer-1.14.0.tar.gz2020-06-11578955 bytessha256

PgBouncer 1.13

ФайлДатаРазмерSHA256
pgbouncer-1.13.0.tar.gz2020-04-27574955 bytessha256

PgBouncer 1.12

ФайлДатаРазмерSHA256
pgbouncer-1.12.0.tar.gz2019-10-17567465 bytessha256

PgBouncer 1.11

ФайлДатаРазмерSHA256
pgbouncer-1.11.0.tar.gz2019-08-27571414 bytessha256

PgBouncer 1.10

ФайлДатаРазмерSHA256
pgbouncer-1.10.0.tar.gz2019-07-01480571 bytessha256

PgBouncer 1.9

ФайлДатаРазмерSHA256
pgbouncer-1.9.0.tar.gz2018-08-13469300 bytessha256

PgBouncer 1.8

ФайлДатаРазмерSHA256
pgbouncer-1.8.1.tar.gz2017-12-20465930 bytessha256
pgbouncer-1.8.tar.gz2017-12-19465612 bytessha256

PgBouncer 1.7

ФайлДатаРазмерSHA256
pgbouncer-1.7.2.tar.gz2016-02-26462374 bytessha256
pgbouncer-1.7.1.tar.gz2016-02-18461903 bytessha256
pgbouncer-1.7.tar.gz2015-12-18459080 bytessha256

PgBouncer 1.6

ФайлДатаРазмерSHA256
pgbouncer-1.6.1.tar.gz2015-09-03431076 bytessha256
pgbouncer-1.6.tar.gz2015-08-01412700 bytessha256

PgBouncer 1.5

ФайлДатаРазмерSHA256
pgbouncer-1.5.5.tar.gz2015-04-09336145 bytessha256
pgbouncer-1.5.4.tar.gz2012-11-28339610 bytessha256
pgbouncer-1.5.3.tar.gz2012-09-12339013 bytessha256
pgbouncer-1.5.2.tar.gz2012-05-29335338 bytessha256
pgbouncer-1.5.1.tar.gz2012-04-17334413 bytessha256
pgbouncer-1.5.tar.gz2012-01-05411488 bytessha256

PgBouncer 1.4

ФайлДатаРазмерSHA256
pgbouncer-1.4.2.tgz2011-06-16283204 bytessha256
pgbouncer-1.4.1.tgz2011-04-01282728 bytessha256
pgbouncer-1.4.tgz2011-01-11231691 bytessha256

PgBouncer 1.3

ФайлДатаРазмерSHA256
pgbouncer-1.3.4.tgz2010-09-09167957 bytessha256
pgbouncer-1.3.3.tgz2010-05-10167476 bytessha256
pgbouncer-1.3.2.tgz2010-03-15166756 bytessha256
pgbouncer-1.3.1.tgz2009-07-06161518 bytessha256
pgbouncer-1.3.tgz2009-02-18160154 bytessha256

PgBouncer 1.2

ФайлДатаРазмерSHA256
pgbouncer-1.2.3.tgz2008-08-08145372 bytessha256
pgbouncer-1.2.2.tgz2008-08-06145017 bytessha256
pgbouncer-1.2.1.tgz2008-08-04144903 bytessha256
pgbouncer-1.2.tgz2008-07-29143915 bytessha256

PgBouncer 1.1

ФайлДатаРазмерSHA256
pgbouncer-1.1.2.tgz2007-12-10122054 bytessha256
pgbouncer-1.1.1.tgz2007-10-26121042 bytessha256
pgbouncer-1.1.tgz2007-10-09120462 bytessha256

PgBouncer 1.0

ФайлДатаРазмерSHA256
pgbouncer-1.0.8.tgz2007-06-1893636 bytessha256
pgbouncer-1.0.7.tgz2007-04-1993086 bytessha256
pgbouncer-1.0.6.tgz2007-04-1292244 bytessha256
pgbouncer-1.0.5.tgz2007-04-1191934 bytessha256
pgbouncer-1.0.4.tgz2007-04-1191889 bytessha256
pgbouncer-1.0.3.tgz2007-04-1191489 bytessha256
pgbouncer-1.0.2.tgz2007-03-2890555 bytessha256
pgbouncer-1.0.1.tgz2007-03-1589609 bytessha256
pgbouncer-1.0.tgz2007-03-1388587 bytessha256

Двоичные пакеты

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

Специализированные сборки могут содержать более новые версии, чем репозитории дистрибутивов:

6 - Журнал изменений

История версий PgBouncer и примечания к выпускам

PgBouncer 1.25.x

2026-05-08 - PgBouncer 1.25.2 - «Человеческое прикосновение и новый поворот в полной неопределённости борьбе за титул»

  • Безопасность

    • Исправлена CVE-2026-6664: целочисленное переполнение в коде разбора сетевых пакетов в PgBouncer до 1.25.2 позволяло обойти проверку границ и могло привести к аварийному завершению. Неаутентифицированный удалённый злоумышленник мог вывести PgBouncer из строя некорректным пакетом аутентификации SCRAM.
    • Исправлена CVE-2026-6665: код SCRAM в PgBouncer до 1.25.2 неверно проверял возвращаемое значение strlcat() при построении содержимого SCRAM client-final-message. Злонамеренный бэкенд, отправивший SCRAM server-final-message с длинным nonce, мог вызвать переполнение стека.
    • Исправлена CVE-2026-6666: возможное обращение по нулевому указателю в PgBouncer до 1.25.2 могло привести к аварийному завершению, если сервер отправлял ответ об ошибке без поля SQLSTATE.
    • Исправлена CVE-2026-6667: PgBouncer до 1.25.2 не выполнял надлежащую проверку авторизации для административной команды KILL_CLIENT. Её могли выполнять все пользователи с доступом к административной консоли, хотя сама консоль требует авторизации. Команда должна быть разрешена только пользователям, перечисленным в параметре admin_users.
  • Исправления

    • Уточнена документация параметра default_pool_size.
    • Исправлена документация client_tls13_ciphers и server_tls13_ciphers.

2025-12-03 - PgBouncer 1.25.1 - «Исправляем множество ошибок перед Рождеством»

  • Безопасность

    • Исправлена CVE-2025-12819: до этого выпуска неаутентифицированный злоумышленник мог выполнить произвольный SQL во время аутентификации, передав вредоносный параметр search_path в StartupMessage. Уязвимы системы, в которых одновременно выполнены ВСЕ следующие условия:

      1. track_extra_parameters включает search_path (нестандартная конфигурация, вероятно, применяемая только в установках с Citus или PostgreSQL 18)
      2. auth_user содержит непустую строку (нестандартная конфигурация)
      3. auth_query настроен без полностью квалифицированных имён объектов (стандартная конфигурация, оператор < не квалифицирован схемой)
  • Исправления

    • Исправлены ошибки специальной аутентификации SCRAM после переподключения к серверу (#1432 , появились в 1.25.0)
    • Добавлены отсутствовавшие typedef для экзотических архитектур без поддержки SIMD (#1414 , появились в 1.25.0)
    • Удалено шумное предупреждение, когда клиент закрывает соединение до отправки данных (#1420 , появилось в 1.25.0)
    • Предотвращено потенциальное разыменование указателя NULL (#1423 , появилось в 1.25.0)
    • Исправлена потенциальная утечка памяти (#1422 , появилась в 1.25.0)
    • Исправлен разбор серверных сообщений SCRAM (#1431 , появился в 1.25.0)

2025-11-09 - PgBouncer 1.25.0 - «Тот самый выпуск с поддержкой LDAP»

  • Возможности
    • Добавлена аутентификация LDAP! Её можно настроить с помощью файла HBA или auth_ldap_options. (#731 )
    • Добавлена поддержка прямых TLS-соединений на стороне клиента. Клиенты могут использовать ускоренное установление TLS-соединения, появившееся в PostgreSQL 17. PgBouncer пока не может подключаться к серверам PostgreSQL таким ускоренным способом. (#1359 )
    • В SHOW CLIENTS добавлено состояние idle. (#1191 )
    • Добавлен параметр transaction_timeout — глобальный и на уровне пользователя. (#1242 )
    • Клиенту отправляется сообщение NOTICE, если он находится в очереди без соединения более 5 секунд. Длительность можно изменить или отключить через query_wait_notify. (#1264 )
    • Добавлен параметр scram_iterations, позволяющий операторам выбирать компромисс между безопасностью и скоростью аутентификации. (#1339 )
    • Добавлены client_tls13_ciphers и server_tls13_ciphers для выбора включаемых наборов шифров TLSv1.3. (#1352 )
  • Изменения
    • Значительно повышена производительность специальной аутентификации SCRAM. (#1338 )
    • Команду KILL можно вызывать без базы данных, что теперь означает KILL для всех баз. (#1317 )
    • Запрос проверки работоспособности по умолчанию отправляет пустой запрос вместо SELECT 1. (#1233 )
    • Переполнение очереди PAM записывается как предупреждение, что упрощает поиск причины вызванных им медленных запросов. (#1297 )
    • Команда RELOAD теперь сообщает обо всех ошибках во время перезагрузки. (#1231 )
    • Во время завершения работы административным соединениям разрешён доступ к UNIX-сокету PgBouncer. Оператору проще выяснить, почему процесс PgBouncer не завершается, и вручную выполнить KILL_CLIENT для зависших соединений. (#1305 )
    • mkauth.py больше не добавляет устаревшее третье поле. (#1365 )
    • Улучшены сообщения FATAL в функциях disconnect_client и disconnect_server. (#1382 )
    • Прекращено использование устаревшей функции OpenSSL EVP_PKEY_get0_EC_KEY, способной вызывать проблемы в некоторых реализациях FIPS. (#1384 )
  • Исправления
    • Исправлено аварийное завершение при паролях длиной 1024 символа и более. (#1215 )
    • Исправлены соединения с несколькими узлами при server_tls_sslmode=verify-full. (#1303 )
    • Исправлена редкая ошибка FATAL при передаче запросов отмены. (#1383 )
    • Исправлена сортировка параметров в SHOW CONFIG. (#1403 )
    • Усилен разбор пакета запуска. (#1407 )

PgBouncer 1.24.x

2025-04-16 - PgBouncer 1.24.1 - «CVE-2025-2291: VALID UNTIL было вчера»

  • Безопасность

    • Исправлена CVE-2025-2291: ранее PgBouncer не учитывал VALID UNTIL пароля пользователя при запросе хешей паролей через auth_query. Если PgBouncer использовался как прозрачный прокси перед Postgres, он мог разрешать уже просроченные пароли. Для устранения проблемы запрос auth_query по умолчанию и примеры пользовательских функций auth_query в документации изменены так, чтобы учитывать VALID UNTIL. Если используется пользовательский auth_query, его следует обновить. При стандартном auth_query можно обновиться до PgBouncer 1.24.1 или в предыдущем выпуске изменить конфигурацию, указав новый запрос auth_query по умолчанию.
  • Исправления

    • Исправлена поддержка PAM: поддержка аутентификации pam в файле HBA отменена. (#1291 ) (ошибка появилась в 1.24.0)
    • Исправлена ошибка уменьшения счётчика соединений пользователя. Исправление присутствовало в теге 1.24.0 на GitHub, но отсутствовало в архиве выпуска. (#1238 ) (ошибка появилась в 1.24.0)
    • test_load_balance_hosts.py добавлен в архив выпуска. (#1282 )
    • Исправлены тесты для запуска сборщиками пакетов Debian. (#1266 , #1250 )
  • Документация

    • Пример auth_query обновлён для задания безопасного search_path. (#1245 )

2025-01-10 - PgBouncer 1.24.0 - «Новый год, новый баунсер»

  • Возможности

    • Добавлена поддержка Type=notify-reload для systemd. Требуется systemd версии 253 или новее. (#1148 )
    • В административную консоль добавлена команда KILL_CLIENT для принудительного завершения клиентского соединения. (#1147 )
    • Добавлен параметр max_user_client_connections — глобальный и на уровне пользователя. (#1137 )
    • Добавлен параметр max_db_client_connections — глобальный и на уровне базы данных. (#1138 )
    • В вывод SHOW USERS и SHOW DATABASES добавлен счётчик current_client_connections. (#1137 , #1138 )
    • Добавлен параметр load_balance_hosts, позволяющий не балансировать нагрузку между узлами. (#736 )
    • В SHOW STATS доступны счётчики использования подготовленных операторов. (#1192 )
    • Добавлен параметр client_idle_timeout. (#1189 )
    • Добавлены пользовательские query_timeout и reserve_pool_size. (#1180 , #1228 )
    • В файле HBA включена поддержка аутентификации pam. (#326 )
  • Изменения

    • Соединения не пересоздаются при RELOAD, если конфигурация TLS не изменилась. Ранее все соединения TLS пересоздавались при RELOAD, что могло вызвать временное, но серьёзное падение производительности. Теперь это происходит только при фактическом изменении параметров TLS. (#1157 )
    • Поддержка подготовленных операторов включена по умолчанию: max_prepared_statements теперь равен 200. Изменение должно затронуть только клиентов, действительно использующих подготовленные операторы. Таким клиентам рекомендуется изучить ограничения поддержки в документации . (#1144 )
    • Сокеты, клиенты и серверы в административном выводе теперь имеют уникальный ID. Раньше их определяли по указателям, которые после отключения часто повторно использовались новыми клиентами. (#1172 )
    • Сообщение об ошибке пустого pidfile стало понятнее. (#1195 )
    • При ошибке server_login_retry клиенту возвращается исходная ошибка. (#1152 )
    • При ошибке auth_query исходная ошибка сервера записывается в журнал. (#1187 )
    • Значение default_pool_size 0 означает неограниченный размер. (#1227 )
    • Параметр базы данных reserve_pool переименован в reserve_pool_size. Прежнее имя остаётся его псевдонимом. (#1232 )
  • Исправления

    • Улучшена обработка различных маловероятных ошибок, например OOM, которые раньше могли приводить к аварийному завершению или утечке памяти. (#1108 , #1101 , #1099 , #1169 , #1202 )
    • Исправлено значение server_tls_sslmode по умолчанию в примере файла конфигурации. (#1133 )
    • Из документации удалено упоминание недопустимого псевдонима server_tls_protocols. (#1155 )
    • Исправлена ошибка совместного использования auth_query и соединений репликации, вызывавшая сбои соединений. (#1166 )
    • Запросы отмены клиентов игнорируются, пока PgBouncer настраивает параметры сервера. (#298 )

PgBouncer 1.23.x

2024-08-02 - PgBouncer 1.23.1 - «Всё снова приведено в порядок»

  • Исправления
    • Исправлена возможная ошибка сегментации после перезагрузки конфигурации PgBouncer. ([#1105]) (ошибка появилась в 1.23.0)
    • Исправлены все известные аварийные завершения в put_in_order. ([#1120]) (новые ошибки были введены в версии 1.23.0)
    • В архив выпуска добавлены отсутствовавшие файлы, необходимые для тестирования. ([#1124]) (файлы отсутствовали начиная с 1.23.0) [#1120]: https://github.com/pgbouncer/pgbouncer/pull/1120 [#1105]: https://github.com/pgbouncer/pgbouncer/pull/1105 [#1124]: https://github.com/pgbouncer/pgbouncer/pull/1124 2024-07-03 - PgBouncer 1.23.0 - «К новым начинаниям»
  • Возможности
    • Добавлена поддержка поэтапных перезапусков. SIGTERM больше не вызывает немедленное завершение процесса PgBouncer. Теперь выполняется «сверхбезопасное завершение»: процесс ждёт отключения всех клиентов. Новое поведение SIGTERM позволяет поэтапно перезапускать несколько процессов PgBouncer за балансировщиком нагрузки или на одном порту с so_reuseport. Это незначительное нарушение обратной совместимости. Если Dockerfile или служба Systemd рассчитывали на прежнее поведение SIGTERM, теперь следует использовать SIGQUIT. ([#902])
    • Добавлена поддержка карт пользовательских имен для методов аутентификации cert и peer. Эта функция предоставляет гибкость, так как пользователь, инициирующий соединение, не обязательно должен быть пользователем базы данных. Поддержка PgBouncer для карт пользовательских имен работает очень похоже на postgres, с исключениями, описанными в документации. ([#996])
    • Добавлена поддержка репликационных соединений через PgBouncer. ([#876])
  • Изменения
    • Улучшен список соединений в выводе SHOW USERS. ([#1040])
    • Разрешена настройка pool_size на уровне пользователя. ([#1049])
    • Разрешена настройка server_lifetime на уровне базы данных. ([#1057])
    • Добавлена поддержка вывода динамически созданных пользователей в выводе SHOW USERS. ([#1052])
    • Добавлена поддержка типа адреса all в конфигурации HBA. ([#1078])
    • Добавлена поддержка автоматического перезапуска при использовании systemd. ([#1080])
    • Минимальная требуемая версия c-ares повышена до 1.9.0 ([#1076])
  • Исправления

PgBouncer 1.22.x

2024-03-04 - PgBouncer 1.22.1 - «В Бангалоре лето»

  • Исправления
    • Исправлены проблемы, вызванные некоторыми клиентами использованием запросов COPY FROM STDIN. Такие запросы могли приводить к утечкам памяти, регрессиям производительности и неправильному поведению подготовленных операторов. ([#1025]) (ошибка появилась в 1.21.0)
    • В архив выпуска добавлены отсутствовавшие тесты ([#1026]) (пропущенные тесты были добавлены в версиях 1.19.0 и 1.21.0) [#1025]: https://github.com/pgbouncer/pgbouncer/pull/1025 [#1026]: https://github.com/pgbouncer/pgbouncer/pull/1026 2024-01-31 - PgBouncer 1.22.0 - «DEALLOCATE ALL»
  • Возможности
    • Добавлена поддержка DEALLOCATE ALL и DISCARD ALL при установке max_prepared_statements в значение, отличное от нуля (стандартная поддержка DEALLOCATE все еще не поддерживается) ([#972])
    • Добавлена настройка auth_query на уровне базы данных. ([#979])
  • Изменения
    • Улучшены настройки в рекомендуемом файле systemd ([#983])
    • Логика быстрого отказа теперь обрабатывает все ситуации, когда рабочих соединений с базой данных больше нет и установить новые невозможно. ([#998])
    • Внесены многочисленные улучшения документации.
  • Исправления

PgBouncer 1.21.x

2023-10-16 - PgBouncer 1.21.0 - «Тот самый выпуск с подготовленными операторами»

  • Возможности
    • Добавлена поддержка именованных подготовленных операторов на уровне протокола! Вероятно, это одна из самых востребованных возможностей PgBouncer. Использование подготовленных операторов вместе с PgBouncer позволяет значительно снизить нагрузку на CPU системы — как со стороны PgBouncer, так и со стороны PostgreSQL. В синтетических тестах эта возможность повышала пропускную способность запросов от 15% до 250% в зависимости от нагрузки. Чтобы воспользоваться ею, необходимо установить для нового параметра max_prepared_statements ненулевое значение (точное значение зависит от нагрузки, но 100, вероятно, будет разумным). Подробнее о работе, ограничениях и настройке этой возможности см. в документации по max_prepared_statements . После этого следует убедиться, что клиентская библиотека действительно использует подготовленные операторы. Способ их включения зависит от конкретного клиента, поэтому обратитесь к его документации. Перед выпуском возможность была тщательно протестирована, однако из-за её сложности всё ещё возможны проблемы с производительностью или ошибки. Сообщайте о найденных проблемах. ([#845])
  • Изменения
    • Повышена безопасность параметров OpenSSL: прежние значения по умолчанию были крайне устаревшими. Теперь они совпадают со стандартными значениями OpenSSL в системе, где работает PgBouncer. ([#948] & [libusual/#41])
    • PgBouncer теперь использует OpenSSL для вычисления MD5-хешей, когда это возможно. Это необходимо для использования PgBouncer в FIPS-совместимом режиме. ([#949])
    • min_pool_size поддерживается для пулов с принудительным пользователем, даже если к PgBouncer не подключены клиенты. ([#947])
    • Изменено кодирование peer_id в токене отмены. Поэтому одноранговое взаимодействие разных версий PgBouncer не работает, если версии находятся по разные стороны границы v1.21.0. ([#945])
  • Исправления
    • Исправлено аварийное завершение с сообщением: “FATAL in function client_proto(): bad client state: 6/7” ([#928]) (ошибка появилась в 1.18.0)
    • Исправлено аварийное завершение с сообщением: “FATAL in function server_proto(): server in bad state: 11” ([#927]) (ошибка появилась в 1.18.0)
    • Снижен уровень журналирования при отправке запросов отмены. ([#903])
    • Исправлен префикс журнала slog для одноранговых узлов. ([#922])
    • Исправлены опечатки в документации ([#932])
    • Исправлены ошибки, выявленные статическим анализатором ([#943])
    • При временных ошибках FATAL во время входа больше не отключаются все ожидающие клиенты. ([#946])
    • Если база из auth_dbname не настроена явно, используется автоматически созданная база данных. ([#921])
  • Внутренняя переработка

PgBouncer 1.20.x

2023-08-09 - PgBouncer 1.20.1 - «Необязательные опции»

  • Исправления
    • Исправлена ошибка, при которой включение options внутри ignore_startup_parameters больше не игнорировало неизвестные параметры внутри параметра запуска options. ([#908]) (ошибка была введена в версии 1.20.0)
    • Исправлена вводящая в заблуждение опечатка в документации. ([#917]) [#908]: https://github.com/pgbouncer/pgbouncer/pull/908 [#917]: https://github.com/pgbouncer/pgbouncer/pull/917 2023-07-20 - PgBouncer 1.20.0 - «Здесь должно быть забавное название»
  • Устаревшие функции
    • Опция перезапуска без остановки обслуживания теперь считается устаревшей. Эта функция получила очень мало внимания в последние годы. У нее известны несколько проблем, и новые функции часто не поддерживают ее. Рекомендуемый метод для выполнения перезапусков без остановки обслуживания в настоящее время — использование функций so_reuseport и peers. Таким образом, вы можете запускать несколько различных процессов PgBouncer на одном порту. Затем, перезапуская эти процессы по одному, вы можете быть уверены, что всегда будет работать процесс PgBouncer на нужном порту. ([#894])
  • Возможности
    • Добавлен параметр track_extra_parameters, позволяющий отслеживать больше параметров в транзакционном режиме пула. Ранее PgBouncer отслеживал только application_name, DateStyle, TimeZone и standard_conforming_strings. Теперь по умолчанию также отслеживается IntervalStyle. Изменив track_extra_parameters, можно отслеживать дополнительные параметры, но только [те, о которых PostgreSQL сообщает клиенту][guc_report]. При использовании Citus 12.0+ Citus обеспечивает передачу PostgreSQL параметра search_path клиенту. Поэтому при использовании Citus можно добавить search_path в параметр track_extra_parameters. ([#867])
    • SQLSTATE передаётся на этапе аутентификации. Это позволяет Npgsql, поставщику данных .NET для PostgreSQL, обнаруживать отсутствие базы данных. ([#814])
    • Значение server_tls_sslmode по умолчанию изменено на prefer. ([#866])
    • Добавлена поддержка стартового параметра options. Это позволяет использовать [переменную окружения PGOPTIONS, известную psql и libpq][pgoptions]. С помощью этой переменной при запуске можно задать любой параметр PostgreSQL. Это работает только для параметров PostgreSQL, которые PgBouncer отслеживает через track_extra_parameters. ([#878])
  • Исправления

PgBouncer 1.19.x

2023-05-31 - PgBouncer 1.19.1 - «Солнечная весна» Это небольшой выпуск, который исправляет несколько недавно появившихся ошибок.

  • Исправления
    • Исправлено: FATAL in function disconnect_client(): bad client state: 0 ([#846]) (ошибка была введена в версии 1.18.0)
    • Исправлено: FATAL in function server_proto(): server in bad state: 14 ([#849]) (ошибка была введена в версии 1.18.0)
    • В архив выпуска добавлены файлы, необходимые для тестов на Python. ([#852]) (тесты появились в 1.19.0) [#846]: https://github.com/pgbouncer/pgbouncer/pull/846 [#849]: https://github.com/pgbouncer/pgbouncer/pull/849 [#852]: https://github.com/pgbouncer/pgbouncer/pull/852 2023-05-04 - PgBouncer 1.19.0 - «Старомодный, ручной вид»
  • Возможности
    • Добавлен параметр auth_dbname, задающий базу данных, в которой выполняется auth_query. ([#764])
    • Добавлена команда SHOW STATE, показывающая, находится ли PgBouncer в состоянии active, paused или suspended. ([#528])
    • Добавлена поддержка однорангового взаимодействия процессов PgBouncer. Благодаря ей запросы отмены продолжают работать, когда несколько процессов PgBouncer находятся за одним балансировщиком нагрузки. ([#666])
    • Добавлена специальная настройка cancel_wait_timeout, которая определяет, через какое время прекращать попытки передачи запроса отмены. По умолчанию значение равно 10 секундам. ([#833])
    • Добавлена новая среда тестирования. ([#792])
  • Исправления
    • Исправлена возможная утечка памяти при ошибке рукопожатия TLS. ([#796])
    • Уточнены сообщения об ошибках для неподдерживаемых параметров командной строки в Windows. ([#620])
    • Исправлена ошибка при вызове disconnect_server на сервере, находящемся в состоянии BEING_CANCELED. ([#815]) (введено в 1.18.0)
    • При получении SIGTERM процесс больше не завершается с ненулевым статусом. ([#834])
    • Запуск завершается ошибкой, если сокет в unix_socket_dir создать невозможно. ([#830])
    • Запуск завершается ошибкой, если невозможно прослушивать ни один адрес из listen_addr. ([#838])
    • При ошибке sbuf_connect выводятся более информативные предупреждения, особенно полезные при сбое создания Unix-сокетов. ([#837])
  • Внутренняя переработка

PgBouncer 1.18.x

2022-12-12 - PgBouncer 1.18.0 - «Никакой настоящей тайны»

  • Возможности
    • application_name добавлено в вывод SHOW CLIENTS/SERVERS/SOCKETS. (#449 )
    • Добавлена информация о запросах отмены в вывод SHOW CLIENTS /SERVERS/ POOLS (#782 )
  • Исправления
    • Операция sbuf_send_pending завершается ошибкой, если целевой сокет закрыт (#652 )
    • Исправлено несколько возможных сбоев (#700 , #730 )
    • Исправлено переполнение при обработке списка узлов через запятую, из-за которого соединение перенаправлялось в Unix-сокет. (#747 )
    • Соединения больше не удаляются ради достижения min_pool_size (#648 )
    • Исправлено SHOW HELP с PostgreSQL 15 (#769 )
    • Исправлено состояние гонки при обработке отмены запросов. Раньше отмена запроса одного клиента могла отменить запрос другого, если PgBouncer получал её после самостоятельного завершения целевого запроса. (#717 )
  • Внутренняя переработка
    • Разные обновления CI

PgBouncer 1.17.x

2022-03-23 - PgBouncer 1.17.0 - «Черта проведена»

  • Возможности
    • Определение базы данных может включать список узлов через запятую. Соединения с ними устанавливаются циклически.
    • При подключении к несуществующей базе ошибка (“no such database”) теперь сообщается после аутентификации. Это не позволяет неаутентифицированным клиентам выяснять, какие базы существуют. (Изменение аналогично переносу сообщения об отсутствующем пользователе после аутентификации в версии 1.15.0.)
    • Ошибки отключения сервера не отправляются клиенту до входа. Это может раскрыть не совсем конфиденциальную информацию, такую как детали конфигурации, клиенту, который еще не вошел в систему.
    • Максимальная длина пароля снова увеличена: предыдущего увеличения оказалось недостаточно.
    • Удалена автоматическая перезагрузка auth_file. Теперь файл конфигурации auth_file будет перечитываться только при перезагрузке конфигурации, а не автоматически при любом изменении.
    • Теперь сборка для Windows включает файл ресурса с информацией о версии.
    • Сборки для Windows, создаваемые на CI, теперь статически связанные, поэтому их можно использовать напрямую без необходимости в дополнительных зависимостях.
  • Исправления
    • Исправлена поддержка OpenSSL 3. Предыдущие выпуски могли вызывать сбой.
    • Быстрый отказ больше не применяется при подключении. Это часть описанного выше переноса ошибок сервера после аутентификации. Изменение также исправляет сквозную аутентификацию SCRAM: клиентский обмен должен состояться, чтобы серверное соединение можно было исправить повторной аутентификацией. Сразу после аутентификации механизм быстрого отказа по-прежнему действует, поэтому в большинстве случаев наблюдаемое поведение не изменится.
    • Параметр auth_type в образце pgbouncer.ini изменён на md5, чтобы соответствовать встроенному значению по умолчанию. Некоторые используют этот файл как основной конфигурационный файл, поэтому проверьте, подходит ли вам изменённая конфигурация.
    • Исправлен сбой при выходе в сборках с включенной проверкой assert.
    • Улучшены документация и поведение tcp_defer_accept. Документация неверно описывала значение по умолчанию, а “show config” иногда показывал неправильное значение. Если параметр задан, но не поддерживается, теперь выдаётся ошибка вместо молчаливого игнорирования, как и для других платформенных параметров сокета.
    • Исправлена сборка с c-ares в Windows. Теперь в Windows требуется c-ares версии >=1.18.0.
  • Внутренняя переработка
    • Большинство предупреждений о deprecation от Autoconf >=2.70 были устранены. Поддержка более старых версий Autoconf по-прежнему сохраняется.
    • Использование Cirrus CI расширено на дополнительные платформы.
    • Поддержка Travis CI была удалена.
    • Обновлены локации поиска по умолчанию файла корневого CA, чтобы поддерживать больше платформ, таких как Fedora, RHEL и CentOS.
    • Все сценарии Python теперь по умолчанию используют python3; совместимость с Python 2 больше не поддерживается.
    • Скрипты тестового набора используют command -v вместо which, который устарел.
    • Несколько сообщений об ошибках переформулированы, чтобы яснее указывать соответствующую команду или параметр.
    • Скрипты тестового набора больше не требуют GNU sed.
    • make check теперь поддерживается на Windows (хотя тестовый набор SSL пока не работает).
    • Документировано, что административная консоль поддерживает только простой протокол запросов; соответствующие сообщения об ошибках улучшены.

PgBouncer 1.16.x

2021-11-11 - PgBouncer 1.16.1 - «Тест глубины против тихой эффективности» Это небольшой выпуск с исправлением безопасности.

  • PgBouncer, действующий как сервер, отклоняет лишние данные после рукопожатия шифрования SSL или GSS.

    Злоумышленник, способный внедрять данные в TCP-соединение, может поместить открытые данные в начало предположительно защищённого шифрованием сеанса базы данных. Это можно использовать для отправки серверу поддельных команд SQL, хотя атака сработает только в том случае, если PgBouncer не запрашивает никаких данных аутентификации. (Однако конфигурация PgBouncer, использующая аутентификацию по сертификатам SSL, вполне может их не запрашивать.) (CVE-2021-3935) 2021-08-09 - PgBouncer 1.16.0 - «Отбились от ягуара»

  • Возможности
    • Поддерживается горячая перезагрузка параметров TLS: после перезагрузки файла конфигурации изменения автоматически вступают в силу.
    • Добавлены Unix-сокеты в абстрактном пространстве имён. Для их использования путь начинается с @. Это соответствует аналогичной возможности PostgreSQL 14.
    • Длина паролей и имен пользователей была увеличена до 996 символов и 128 символов соответственно. Различные облаковые сервисы требуют этого.
    • Минимальный размер пула теперь можно настроить для каждой базы данных, как основной и резервный размеры.
    • Число ожидающих отмен запросов отображается в SHOW POOLS.
  • Исправления
    • Разбор конфигурации теперь строже обрабатывает ошибки. Раньше ошибка могла лишь записываться в журнал, после чего выполнение продолжалось; теперь такие ошибки препятствуют запуску. Это всегда было предполагаемым поведением, поэтому некоторые пользователи могут обнаружить давно существовавшие ошибки в своих конфигурациях.
    • Обработка запросов отмены была исправлена. В некоторых случаях запросы отмены могли казаться заблокированными на длительное время. Теперь это больше не должно происходить. В действительности, запросы отмены могут превышать размер пула в два раза, поэтому они действительно не должны застревать. (#542 , #543 )
    • Исправлено совместное использование md5 и scram через hba.conf.
    • Исправлена сборка с c-ares в Windows.
    • Ожидаемые сообщения “FIXME: query end, but query_start == 0” были исправлены. Теперь мы знаем, почему они возникают, и вы их больше не увидите. (#565 )
    • Исправлена перезагрузка параметров default_pool_size, min_pool_size и res_pool_size.
  • Внутренняя переработка
    • Cirrus CI теперь используется вместо Travis CI.
    • Как обычно, было добавлено множество тестов.
    • Уточнено сообщение журнала “unclean server”. Теперь выводится “client disconnect while server was not ready” или “client disconnect before everything was sent to the server”. Первое возникает, если клиентское соединение закрывается при открытом блоке транзакции на сервере.
    • Имя базы данных “pgbouncer” теперь явно запрещено: оно зарезервировано для административной консоли и никогда корректно не работало как обычная база.
    • Ошибки, отправляемые клиентам перед закрытием соединения, теперь имеют уровень FATAL, а не ERROR. (#564 )
    • Исправлены предупреждения компилятора GCC 11. (#623 )

PgBouncer 1.15.x

2020-11-19 - PgBouncer 1.15.0 - «У меня ещё остался чемодан в Берлине»

  • Возможности
    • Улучшена отчетность об ошибках аутентификации. Сообщения об ошибке аутентификации, отправляемые клиенту, теперь содержат только информацию о том, что аутентификация не прошла, и не предоставляют дополнительных деталей. Полные детали доступны в логах PgBouncer. Кроме того, даже если запрашиваемого пользователя не существует, аутентификация все равно обрабатывается до конца и приводит к тому же общему сообщению об ошибке. Это предотвращает попытки клиентов выявить пользователей и другие аутентификационные детали в PgBouncer. Это поведение аналогично тому, как это работает в PostgreSQL.
    • Немедленное отключение клиента больше не записывается в журнал. Это устраняет лишние сообщения от систем мониторинга, которые открывают TCP/IP-соединение и закрывают его, не отправив данных.
    • Если stderr направлен в журнал systemd, для ведения журнала используются собственные функции systemd. Это устраняет повторные отметку времени и PID и добавляет метаданные, например уровень важности, полезные при пересылке в syslog.
    • Часть тестового набора теперь может выполняться под Windows.
    • SHOW CONFIG теперь также показывает значения по умолчанию для параметров.
  • Исправления
    • Исправлен параметр so_reuseport во FreeBSD. Исходный код PgBouncer 1.12.0 там не работал. (#504 )
    • Исправлена компиляция со старыми версиями systemd, нарушенная в 1.14.0. (#505 )
    • Исправлена цель makefile для сборки двоичных ZIP-архивов Windows.
    • Длинные командные строки теперь также работают на Windows.
    • Исправлено поведение глобального auth_user. Раньше оно было неясным и ненадёжным из-за зависимости от порядка в файле конфигурации; теперь порядок не влияет. (#391 , #393 )
  • Внутренняя переработка
    • Улучшена стабильность и портативность тестов.
    • Обновлён код, связанный с Autoconf.
    • Отключены предупреждения компилятора об устаревших возможностях OpenSSL 3.0.0.

PgBouncer 1.14.x

2020-06-11 - PgBouncer 1.14.0 - «Вновь обретённая магия»

  • Возможности
    • Добавлена сквозная аутентификация SCRAM. Зашифрованные секреты SCRAM из userlist.txt или auth_query можно использовать для входа на серверы.
    • Добавлена активация сокетов systemd. Она особенно полезна, когда systemd должна создавать Unix-сокеты в системах с ограниченным доступом к /var/run/postgresql.
    • Добавлена поддержка Unix-сокетов в Windows.
  • Внутренняя переработка
    • Добавлен альтернативный более компактный образец конфигурационного файла pgbouncer-minimal.ini для тестирования или развертывания.

PgBouncer 1.13.x

2020-04-27 - PgBouncer 1.13.0 - «Моя любимая игра»

  • Возможности

    • Добавлен параметр конфигурации tcp_user_timeout, задающий соответствующий параметр сокета.
    • Значением client_tls_protocols и server_tls_protocols по умолчанию стало secure, то есть включены только TLS 1.2 и TLS 1.3. Старые версии по-прежнему поддерживаются, но не включены по умолчанию.
    • Добавлена поддержка уведомлений службы systemd. Сейчас она позволяет использовать службы с Type=notify. В будущих версиях планируется более тесная интеграция.
  • Исправления

    • Исправлены многострочные сообщения журнала. (libusual #24 )
    • Правильно обрабатываются пустые имена пользователей, возвращённые auth_query. (#340 )
  • Очистка

    • Файлы пакета Debian в каталоге debian удалены. Рекомендуется использовать пакеты из https://apt.postgresql.org/ .
    • В набор тестов внесены многочисленные исправления и улучшения.
    • По умолчанию тесты больше не пытаются использовать sudo. Теперь это можно явно включить переменной окружения USE_SUDO.
    • Использование API libevent обновлено до интерфейсов в стиле версии 2; устаревшие интерфейсы версии 1 больше не применяются.

PgBouncer 1.12.x

2019-10-17 - PgBouncer 1.12.0 - «Учимся и становимся лучше»

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

  • Возможности

    • Добавлен параметр для включения параметра сокета SO_REUSEPORT. В некоторых операционных системах это позволяет запускать на одном узле несколько экземпляров PgBouncer, прослушивающих один порт, а ядро автоматически распределяет соединения.
    • Добавлен параметр для использования файла resolv.conf, отдельного от системного. Он позволяет задавать пользовательские серверы DNS и, возможно, другие параметры DNS.
    • Вывод SHOW VERSION отправляется как обычная строка результата, а не сообщение NOTICE. Так его проще обрабатывать, и поведение соответствует другим командам SHOW.
  • Исправления

    • Столбцы статистики отправляются как numeric, а не bigint. Это устраняет сбои некоторых клиентских библиотек при значениях, выходящих за диапазон bigint. (#360 , #401 )
    • Исправлена потеря пароля пользователями PAM. (#285 )
    • Принимаются клиенты SCRAM с включённой привязкой канала. Ранее клиент с поддержкой привязки канала, то есть PostgreSQL 11+, в некоторых ситуациях получал ошибку соединения с PgBouncer. Сам PgBouncer не поддерживает привязку канала; изменение лишь исправляет поддержку предлагающих её клиентов.
    • Исправлена компиляция с новыми версиями musl-libc, используемой Alpine Linux.
  • Очистка

    • Добавлена цель make check, запускающая все тесты одной командой.
    • Удалены ссылки на вики PostgreSQL. Теперь вся информация находится в документации PgBouncer или на сайте.
    • Удалена поддержка Libevent версии 1.x. Теперь требуется Libevent 2.x, обнаруживаемый с помощью pkg-config.
    • Исправлены предупреждения компилятора в macOS и Windows. Теперь сборка на этих платформах не должна выдавать предупреждений.
    • Исправлены некоторые предупреждения LLVM scan-build.

PgBouncer 1.11.x

2019-08-27 - PgBouncer 1.11.0 - «Инстинкт величия»

  • Возможности
    • Добавлена поддержка аутентификации SCRAM для клиентов и серверов. Добавлен тип аутентификации scram-sha-256.
    • auth_type=password при хранимом пароле md5 обрабатывается так же, как сервером PostgreSQL. (#129 )
    • Добавлен параметр log_stats, отключающий вывод статистики в журнал. (#287 )
    • В отметки времени журнала добавлен часовой пояс.
    • PID в префиксе журнала заключён в квадратные скобки.
  • Исправления
    • Исправлен тест OpenSSL в configure при работе с новыми версиями OpenSSL и -Werror.
    • Исправлен расчёт времени ожидания с auth_user. Ошибка приводила к аварийному завершению или мусорным значениям времени ожидания. (#393 )
    • Обрабатывается пакет GSSENCRequest, добавленный в PostgreSQL 12. Сейчас он ничего не делает, но предотвращает непонятные сообщения об ошибке “bad packet header”.
  • Очистка
    • В набор тестов внесено множество улучшений и добавлено несколько тестов.
    • Исправлено несколько предупреждений компилятора в Windows.
    • Расширена документация секции [users], и она добавлена в пример файла конфигурации. (#330 )

PgBouncer 1.10.x

2019-07-01 - PgBouncer 1.10.0 - «Боится мира»

  • Возможности
    • Добавлено включение и отключение TLS 1.3. Поддержка TLS 1.3 уже зависела от библиотеки OpenSSL, но теперь эта версия поддерживается и параметрами выбора версий протокола TLS.
  • Исправления
    • Исправлена поддержка TLS 1.3, нарушенная с OpenSSL 1.1.1 и 1.1.1a, но не в более ранних или поздних версиях.
    • Исправлено редкое аварийное завершение в SHOW FDS. (#311 )
    • Исправлена проблема, способная приводить к длительному простою при поступлении множества запросов отмены. (#329 )
    • После перезагрузки Postgres больше не появляется сообщение “unexpected response from login query”. (#220 )
    • Исправлен расчёт idle_transaction_timeout. (#125 ) Ошибка приводила к преждевременным тайм-аутам в отдельных ситуациях.
  • Очистка
    • Различные сообщения журнала и ошибки сделаны точнее.
    • Исправлены проблемы, найденные Coverity; ни одна не оказывала существенного влияния на практике.
    • Все тестовые сценарии улучшены и документированы.
    • В документацию добавлены дополнительные команды SHOW.
    • Документация преобразована из rst в Markdown.
    • Все сценарии Python в дереве исходного кода теперь совместимы с Python 3.

PgBouncer 1.9.x

2018-08-13 - PgBouncer 1.9.0 - «Выживание в хаосе»

  • Возможности
    • Команда RECONNECT.
    • Команда WAIT_CLOSE.
    • Быстрое закрытие: немедленно отключать сервер в сеансовом режиме пула, если он находится в состоянии “close_needed” (reconnect).
    • В SHOW SERVERS добавлен столбец close_needed.
  • Исправления
    • Устранено двойное освобождение памяти в parse_filename.
    • Устранено разыменование указателя NULL в parse_line.
  • Очистка
    • mkauth.py перенесён на Python 3.
    • Улучшена документация сигналов.
    • Улучшена документация быстрого запуска.
    • Документирована команда SET.
    • Исправлен список необходимого ПО.
    • Исправлены предупреждения -Wimplicit-fallthrough.
    • Добавлена отсутствовавшая документация различных полей SHOW.
    • Документировано поведение переподключения при перезагрузке и изменении DNS.
    • Документировано, что после KILL требуется RESUME.
    • Уточнена документация server_lifetime.
    • Исправлены опечатки и регистр букв в сообщениях и документации.
    • Исправлен вызов psql в тестах.
    • Внесены прочие улучшения настройки тестов.

PgBouncer 1.8.x

2017-12-20 - PgBouncer 1.8.1 - «Тактика добивания в партере»

  • Исправления
    • Файл include/pam.h включён в архив дистрибутива. Из-за его отсутствия архив 1.8 вообще не собирался.

2017-12-19 - PgBouncer 1.8 - «Уверенно у штурвала»

  • Возможности
    • Поддерживается аутентификация PAM. (Включается через --with-pam.)
    • В вывод SHOW DATABASES добавлены поля paused и disabled.
    • В вывод SHOW POOLS добавлено поле maxwait_us.
    • В вывод команд SHOW добавлены поля wait и wait_us.
    • Добавлены команды SHOW STATS_TOTALS и SHOW STATS_AVERAGES.
    • Запросы и транзакции в SHOW STATS отслеживаются отдельно. Поля total_requests, avg_req и avg_query заменены новыми полями.
    • В SHOW STATS добавлено wait_time.
  • Исправления
    • Обновлённая libusual поддерживает OpenSSL 1.1.
    • Попытки использовать TLS в Unix-сокетах больше не выполняются.
    • При разборе pg_hba.conf ошибочные строки больше не приводят к отклонению всего файла; разбор продолжается. (#118 )
    • Исправлено несколько других ошибок разбора hba.
    • Исправлено состояние гонки при отмене запроса. (#141 )
  • Очистка
    • Параметр auth_user теперь разрешён и глобально, а не только для отдельных баз данных. (#142 )
    • Для клиента и сервера консоли задана кодировка UTF8.

PgBouncer 1.7.x

2016-02-26 - PgBouncer 1.7.2 - «Наконец в воздухе»

  • Исправления
    • Исправлено аварийное завершение при удалении устаревшего pidfile. Проблема появилась в 1.7.1.
    • Очистка отключена: она нарушает перехват и бесполезна для производственной нагрузки. Проблема появилась в 1.7.1.
    • После перехвата запуск ожидает исчезновения pidfile. Медленное завершение из-за очистки памяти выявило существующее состояние гонки. (#113 )
  • Очистка
    • Сборка стала воспроизводимой благодаря удалению обработки DBGVER. (#112 )
    • Antimake: список файлов из $(wildcard) сортируется, поскольку новые версии gmake больше этого не делают. (#111 )
    • Версия libssl выводится в журнал.
    • deb: включено полное усиление защиты.

2016-02-18 - PgBouncer 1.7.1 - «Перешли пяти друзьям, иначе…»

ПРЕДУПРЕЖДЕНИЕ: начиная с версии 1.7, server_reset_query не выполняется, когда база данных работает в транзакционном режиме пула. По-видимому, в объявлении 1.7 это было подчёркнуто недостаточно. Если приложения зависят от такого поведения, восстановите его через server_reset_query_always.

Основной работой этого выпуска был поиск утечки памяти, связанной с TLS, которой, как выяснилось, не существует. Вместо неё обнаружена сборка libssl в Debian/wheezy с накладными расходами 600k на соединение без утечки вместо ожидаемых 20-30k. При использовании TLS за этим следует следить.

  • Исправления
    • TLS: sslmode “disabled” переименован в “disable”, как в PostgreSQL.
    • TLS: client_tls_sslmode=verify-ca/-full теперь отклоняет соединения без клиентского сертификата. (#104 )
    • TLS: client_tls_sslmode=allow/require проверяет клиентский сертификат, если он отправлен. Ранее проверка сертификата оставалась ненастроенной, поэтому соединения с клиентским сертификатом завершались ошибкой. (#105 )
    • Исправлена утечка памяти при освобождении базы данных.
    • Исправлена потенциальная утечка памяти в tls_handshake().
    • Исправлена обработка EOF в tls_handshake().
    • Исправлен слишком маленький memset в совместимой реализации asn1_time_parse.
    • Исправлена сборка без TLS (--without-openssl). (#101 )
    • Исправлены различные проблемы сборки в Windows. (#100 )
  • Очистка
    • TLS: для снижения потребления памяти неактивными соединениями используется SSL_MODE_RELEASE_BUFFERS.
    • Выделенная память очищается при завершении. Это помогает запускать средства поиска утечек памяти.
    • Улучшена документация server_reset_query. (#110 )
    • Параметры TLS добавлены в пример конфигурации.

2015-12-18 - PgBouncer 1.7 - «Цвета меняются после воскрешения»

  • Возможности
    • Поддерживаются соединения TLS. В качестве реализации бэкенда используется OpenSSL/LibreSSL.
    • Поддерживается аутентификация с помощью клиентского сертификата TLS.
    • Поддерживается аутентификация “peer” в Unix-сокетах.
    • Поддерживается файл управления доступом по узлам, подобный pg_hba.conf в Postgres. Он позволяет настроить TLS для сетевых соединений и аутентификацию “peer” для локальных.
  • Очистка
    • Значение query_wait_timeout по умолчанию установлено в 120s. Текущее значение по умолчанию (0) приводит к бесконечному ожиданию в очереди, что бесполезно. Теперь, если у клиента есть ожидающий запрос, но ему не назначено серверное соединение, клиентское соединение будет закрыто.
    • server_reset_query_always по умолчанию отключён. Теперь запрос сброса используется только в пулах сеансового режима.
    • pkt_buf увеличен до 4096 bytes. Это повышает производительность с TLS. Поведение, вероятно, зависит от нагрузки, но изменение должно быть безопасным: начиная с v1.2, буферы пакетов отделены от соединений и лениво берутся из пула.
    • Поддерживается конвейерная обработка с подсчётом ожидаемых пакетов ReadyForQuery. Это предотвращает слишком раннее освобождение сервера и исправляет #52 .
    • Улучшена логика sbuf_loopcnt: сокет гарантированно обрабатывается повторно, даже если от него нет событий. Это необходимо для TLS с собственной буферизацией.
    • Системные тесты адаптированы к современным BSD и MacOS. (Eric Radman)
    • Удалена аутентификация crypt. Она устарела и не поддерживается PostgreSQL начиная с 8.4.
    • Исправлен обычный параметр configure “–with-cares”: без аргумента он не работал.

PgBouncer 1.6.x

2015-09-03 - PgBouncer 1.6.1 - «Студийная аудитория одобряет»

  • Возможности

    • Добавлен параметр server_reset_query_always. При его включении server_reset_query не используется в пулах, отличных от сеансового режима. PgBouncer вводит отдельный pool_mode для каждого пула, но сеансовый и транзакционный режимы не должны использовать одинаковый запрос сброса. Более того, транзакционный режим вообще не должен использовать запрос сброса.

      Параметр включён в 1.6.x, но будет отключён в 1.7.

  • Исправления

    • [SECURITY] Удалено недопустимое назначение auth_user. (#69) Когда задан auth_user, а клиент запрашивает несуществующее имя пользователя, клиент входил как auth_user. Это небезопасно.

      CVE-2015-6817

    • NoticeResponse пропускается в handle_auth_response. Иначе подробные уровни журнала сервера приводили к ошибкам входа.

    • Консоль: при auth_type=any заполняется auth_user, иначе ведение журнала могло завершиться аварийно (#67).

    • Исправлены различные проблемы переносимости (OpenBSD, Solaris, OSX).

2015-08-01 - PgBouncer 1.6 - «Зомби будущего»

  • Возможности

    • Хеш пароля пользователя загружается из базы данных Postgres. Новые параметры:

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

      auth_query Запрос SQL, выполняемый от auth_user. По умолчанию: “SELECT usename, passwd FROM pg_shadow WHERE usename=$1”

      (Cody Cutrer)

    • Режим пула можно настраивать и для отдельной базы данных, и для пользователя. (Cody Cutrer)

    • Добавлены ограничения соединений по базе данных и пользователю: max_db_connections и max_user_connections. (Cody Cutrer / Pavel Stehule)

    • Добавлены команды DISABLE/ENABLE для запрета новых соединений. (William Grant)

    • Добавлен новый бэкенд DNS: c-ares. Это единственный бэкенд DNS, поддерживающий все важные возможности: /etc/hosts с обновлением, поиск SOA, большие ответы через TCP/EDNS+UDP и IPv6. Теперь это предпочтительный бэкенд, и, вероятно, в будущем он станет единственным, поскольку поддерживать множество неполноценных библиотек бессмысленно.

      SNAFU: версии c-ares <= 1.10 содержат ошибку, нарушающую поддержку CNAME при включённом IPv6. Ошибка исправлена в исходном проекте. В качестве обхода c-ares <= 1.10 используется только с IPv4. Поэтому PgBouncer откажется от других бэкендов лишь после того, как c-ares >1.10, ещё не выпущенный на тот момент, будет доступен некоторое время…

    • remote_pid отображается в SHOW CLIENTS/SERVERS. Он доступен для клиентов, подключённых через Unix-сокеты, а также для серверов с TCP- и Unix-сокетами. Для TCP-сервера PID берётся из ключа отмены.

    • Добавлен отдельный параметр конфигурации dns_nxdomain_ttl для управления отрицательным кэшированием DNS. (Cody Cutrer)

    • IP-адрес и порт клиентского узла добавляются к application_name. Это включается параметром application_name_add_host со значением по умолчанию ‘off’. (Andrew Dunstan)

    • Файлы конфигурации поддерживают директиву ‘%include FILENAME’, позволяющую разделить конфигурацию на несколько файлов. (Andrew Dunstan)

  • Очистка

    • Журнал: адрес IPv6 заключён в [].
    • Журнал: при соединении с сервером показываются локальные IP и порт.
    • win32: для длинных аргументов используется стиль GNU: –foo.
    • В имени узла разрешены цифры; всегда выполняется попытка разбора через inet_pton.
    • Исправлен deallocate_all() в FAQ.
    • Исправлено неверное ключевое слово в примере файла конфигурации. (Magnus Hagander)
    • В файлах аутентификации разрешены комментарии с ‘;’. (Guillaume Aubert)
    • Исправлены орфографические ошибки в сообщениях журнала и комментариях. (Dmitriy Olshevskiy)
  • Исправления

    • Исправлен запуск новых соединений во время обслуживания. (Cody Cutrer)
    • Файл аутентификации больше не загружается дважды при запуске. (Cody Cutrer)
    • Реализована правильная инвалидация автоматически созданных баз данных.
    • IPv6: для прослушивающего сокета задан IPV6_V6ONLY.
    • win32: для прослушивающего сокета не задаётся SO_REUSEADDR.
    • Исправлен memcpy адреса IPv6.
    • Исправлена отмена ожидающих клиентов. (Mathieu Fenniak)
    • Небольшое исправление: результат calloc обязательно проверяется. (Heikki Linnakangas)
    • В конец файла PID добавлен перевод строки. (Peter Eisentraut)
    • Новые серверные соединения запрещены после команды PAUSE . (Petr Jelinek)
    • Исправлено сообщение “bad packet” при входе, когда заголовок задерживается. (Michal Trojnara, Marko Kreen)
    • Исправлены ошибки, обнаруженные Coverty. (Euler Taveira)
    • server_idle_timeout отключается, когда число серверов становится меньше min_pool (#60). (Marko Kreen)

PgBouncer 1.5.x

2015-04-09 - PgBouncer 1.5.5 - «Прикинься мёртвым, чтобы победить»

  • Исправления
    • Исправлено удалённое аварийное завершение: неверный порядок пакетов приводил к обращению по указателю NULL. Ошибка не эксплуатируется, это лишь DoS.

2012-11-28 - PgBouncer 1.5.4 - «Утечек нет, приучение к горшку прошло успешно»

  • Исправления
    • DNS: исправлена утечка памяти в бэкенде getaddrinfo_a().
    • DNS: исправлена утечка памяти в бэкенде udns.
    • DNS: исправлен расчёт статистики.
    • DNS: улучшена обработка сообщений об ошибках getaddrinfo_a().
    • Исправлена компиляция win32.
    • Исправлена проверка поддержки зависимостей компилятора в configure.
    • Исправлена документация.

2012-09-12 - PgBouncer 1.5.3 - «Квантовый тостер»

  • Критическое исправление

    • Слишком длинные имена баз данных могли приводить к удалённо вызываемому аварийному завершению при включённых автоматически создаваемых базах данных.

      Исходные проверки предполагали, что все имена поступают из файлов конфигурации, поэтому использование fatal() было допустимо, но при включении автоматически создаваемых баз

      • через ‘*’ в секции [databases] - имя базы может прийти из сети, что делает возможным удалённое завершение работы.

      CVE-2012-4575

  • Небольшие возможности

    • max_packet_size — параметр конфигурации максимального разрешённого размера пакета. Значение по умолчанию осталось прежним: (2G-1), но теперь его можно уменьшить.
    • Если заголовок пакета невозможно разобрать, он выводится в журнал и сообщение об ошибке в шестнадцатеричном виде.
  • Исправления

    • AntiMake использовал $(relpath) и $(abspath) для работы с путями, но при символических ссылках в пути дерева исходного кода сборка завершалась ошибкой. Теперь код работает только с обычными строками.
    • Консоль: SET теперь может задавать значения пустых строк.
    • config.txt: указано, что все тайм-ауты можно задавать дробными числами. Эта малозаметная возможность появилась в 1.4.

2012-05-29 - PgBouncer 1.5.2 - «Не жуй, просто глотай»

  • Исправления
    • Из-за ошибки reserve_pool_timeout воспринимался в микросекундах, а не в секундах, фактически немедленно активируя резервный пул при заполнении основного. Теперь, как и предполагалось, значение используется в секундах. (Обнаружил Keyur Govande)

2012-04-17 - PgBouncer 1.5.1 - «Прервать, повторить, игнорировать?»

  • Возможности
    • Добавлены параметры прав доступа к Unix-сокету: unix_socket_mode=0777, unix_socket_group=’’.
  • Исправления
    • Для серверной переменной разрешена пустая строка. Это необходимо для правильной работы “application_name”, поскольку только у этого параметра нет серверного значения по умолчанию.
    • При изменении строки соединения требуется обновить параметры сервера. Ранее PgBouncer продолжал использовать старые параметры, что нарушало работу при обновлении Postgres.
    • При изменении строки соединения автоматически созданной базы старые соединения удаляются.
    • cf_setint: для разбора целочисленных параметров конфигурации используется strtol() вместо atoi(). Это поддерживает шестнадцатеричную и восьмеричную запись и лучше обнаруживает ошибки.
    • Для обнаружения union sigval используется sigqueue(), что исправляет компиляцию в HPUX.
    • Команда ‘git’ удалена из Makefile: при сборке из обычного архива она выдавала случайные ошибки.
    • Документирован параметр stats_period, задающий период вывода статистики.
    • Требуется Asciidoc >= 8.4: документация, по-видимому, больше не совместима с более ранними версиями.
    • Прекращены повторные попытки при EINTR от close().

2012-01-05 - PgBouncer 1.5 - «Довольные клиенты с 2007 года»

Если за одним именем DNS находится более 8 IP-адресов, теперь для запросов необходимо использовать протокол EDNS0. Его поддерживают только бэкенды getaddrinfo_a()/getaddrinfo() и UDNS; libevent 1.x/2.x не поддерживает. Чтобы включить его для libc, добавьте ‘options edns0’ в /etc/resolv.conf.

Для сборки требуется GNU Make 3.81+.

  • Возможности
    • Изменения ответов DNS распознаются, а соединения с IP-адресами, отсутствующими в последнем ответе, признаются недействительными. (Petr Jelinek)
    • Инвалидация имён узлов по серийному номеру зоны DNS. Когда задан dns_zone_check_period, у всех зон DNS запрашивается SOA; после изменения серийного номера повторно запрашиваются все имена узлов. Это обеспечивает детерминированную инвалидацию соединений, поскольку инвалидация при поиске бесполезна, если поиск не выполняется. Работает только с новым бэкендом UDNS.
    • Добавлены команды SHOW DNS_HOSTS и SHOW DNS_ZONES для просмотра кэша DNS.
    • Добавлен параметр min_pool_size, предотвращающий закрытие всех соединений при отсутствии нагрузки. (Filip Rembialkowski)
    • idle_in_transaction_timeout закрывает слишком долго неактивную транзакцию. По умолчанию не задан.
    • Добавлен бэкенд libudns для поиска DNS. Он функциональнее evdns. Включается через –with-udns. IPv6 пока не поддерживается.
    • Команда KILL немедленно закрывает все соединения одной базы данных. (Michael Tharp)
    • Выполнен переход на систему сборки Antimake для более удобных Makefile. Теперь для сборки требуется GNU Make 3.81+.
  • Исправления
    • DNS теперь работает с именами узлов IPv6.
    • Состояние соединения не меняется при поступлении NOTIFY от сервера.
    • Внесены различные исправления документации. (Dan McGee)
    • Консоль: поддерживаются кавычки идентификаторов с “”. Изначально команд, принимающих имена баз данных, не было, поэтому кавычки не требовались.
    • Консоль: цифры разрешены в начале регулярного выражения слова. Строгий анализатор здесь чрезмерно усложняет работу.
    • Приостановленные автоматически созданные базы данных не удаляются по сроку. (Michael Tharp)
    • Автоматические базы создаются при необходимости во время PAUSE. (Michael Tharp)
    • Исправлено неверное сообщение журнала команды RESUME. (Peter Eisentraut)
    • Если строка соединения базы содержит user= без password=, пароль берётся из userlist.
    • ‘*’ правильно разбирается в коде перехвата.
    • autogen.sh работает со старыми autoconf/automake.
    • Исправлено аварийное завершение службы win32 из-за неверного basename() из среды выполнения mingw/msvc. Теперь всегда используется совместимая реализация basename().

PgBouncer 1.4.x

2011-06-16 - PgBouncer 1.4.2 - «Алгоритм первого удара»

Затронутые операционные системы: *BSD, Solaris, Win32.

  • Исправления переносимости
    • CFLAGS передаётся компоновщику. Это необходимо при использовании резервной реализации getaddrinfo_a() на основе pthread.
    • lib/find_modules.sh: split() заменён на index()+substr(). Это должно обеспечить работу со старыми версиями AWK.
    • <usual/endian.h>: системные определения htoX/Xtoh игнорируются, поскольку может быть определено лишь подмножество макросов.
    • <usual/signal.h>: совместимый sigval отделён от совместимого sigevent.
    • <usual/socket.h>: для получения iovec включён <sys/uio.h>.
    • <usual/time.h>: улучшено автоматическое обнаружение функций в win32.
    • <usual/base_win32.h>: удалено повторное объявление sigval/sigevent.

2011-04-01 - PgBouncer 1.4.1 - «Всё это было представлением»

  • Возможности

    • Поддерживается прослушивание и подключение по адресам IPv6. (Hannu Krosing)
    • В ’listen_addr’ поддерживается несколько адресов прослушивания. Для каждого вызывается getaddrinfo(), поэтому можно использовать и имена.
    • Консоль: версия PgBouncer отправляется клиенту как ‘server_version’.
  • Важные исправления

    • getaddrinfo_a() отключён в glibc < 2.9, поскольку в старых версиях он вызывает аварийное завершение.

      Среди затронутых систем: RHEL/CentOS 5.x (glibc 2.5), Ubuntu 8.04 (glibc 2.7), а также Debian/lenny (glibc 2.7), где getaddrinfo_a() не завершается аварийно, но надёжно обнаружить это невозможно.

      В таких системах используйте libevent 2.x: резервный getaddrinfo_a() не предназначен для производственной эксплуатации. Изучите новый раздел «Поддержка поиска DNS» в README, где описан выбор бэкенда DNS.

      (Hubert Depesz Lubaczewski, Dominique Hermsdorff, David Sommerseth)

    • При использовании libevent 2.x по умолчанию включается –enable-evdns.

    • tcp_keepalive включён по умолчанию, как и в Postgres. (Hubert Depesz Lubaczewski)

    • Значением server_reset_query по умолчанию стало DISCARD ALL для стандартной совместимости с Postgres.

    • win32: исправлены аварийные завершения при адресе Unix-сокета NULL. (Hiroshi Saito)

    • Исправлена очистка автоматически созданных баз данных: старый код путал базы и пулы. При обнаружении одного пустого пула база помечалась как ‘idle’, что позднее могло удалить базу с активными пользователями.

      Сообщил: Hubert Depesz Lubaczewski

  • Исправления

    • Совместимый getaddrinfo_a() сделан неблокирующим: для поиска используется один параллельный поток.
    • Компиляция с pthread включается при использовании совместимого getaddrinfo_a.
    • release_server не задавал ->last_lifetime_disconnect при отключении по сроку существования. (Emmanuel Courreges)
    • win32: исправлен файл аутентификации с окончаниями строк DOS — load_file() не учитывал уменьшение файла при загрузке. (Rich Schaaf)
    • <usual/endian.h>: добавлено обнаружение функций enc/dec через autoconf, чтобы избежать конфликтов в BSD. (James Pye)
    • Устранено аварийное завершение при отсутствии файла конфигурации. (Lou Picciano)
    • Устранено аварийное завершение при ошибке поиска DNS и ведении журнала на уровне noise (-v -v). (Hubert Depesz Lubaczewski, Dominique Hermsdorff)
    • В find_modules.sh используются обратные кавычки вместо $(cmd) для лучшей переносимости. (Lou Picciano)
    • В find_modules.sh используется ‘awk’ вместо ‘sed’ для лучшей переносимости. (Giorgio Valoti)
    • При запуске в журнал выводятся сведения об активном асинхронном бэкенде DNS.
    • Исправлен –disable-evdns: теперь он означает ’no’, а не ‘yes’.
    • В документации указано, что -R требует unix_socket_dir.
    • server_reset_query рассмотрен в faq.txt.
    • В slab-аллокатор восстановлен утраченный memset.
    • В libusual внесены различные небольшие исправления переносимости.

2011-01-11 - PgBouncer 1.4 - «Кровавый код»

  • Возможности

    • Асинхронный поиск DNS: имена разрешаются не при перезагрузке, а при установлении соединения, с настраиваемым кэшированием. (См. параметр dns_max_ttl.)

      По умолчанию в качестве бэкенда используется getaddrinfo_a() из glibc. При его отсутствии getaddrinfo_a() эмулируется через блокирующий(!) getaddrinfo().

      Если configure передан аргумент –enable-evdns, используется evdns из libevent. По умолчанию он не применяется, поскольку libevent 1.3/1.4 содержит ошибочную реализацию. Приемлемым выглядит только evdns из libevent 2.0.

    • Добавлена переменная конфигурации syslog_ident для настройки имени syslog.

    • Реализована полноценная поддержка параметра запуска application_name.

    • Добавлены длинные параметры командной строки (Guillaume Lelarge).

    • Исправлена переносимость в Solaris (Hubert Depesz Lubaczewski).

    • Добавлена переменная конфигурации disable_pqexec. В средах с повышенными требованиями можно отключить Simple Query Protocol. Тогда приложения должны использовать только Extended Query Protocol.

    • Совместимость с Postgres: если имя базы данных в пакете запуска пусто, используется имя пользователя.

  • Исправления

    • Параметры сервера DateStyle и TimeZone должны иметь точный регистр.
    • Консоль: клиенту отправляются параметры сервера datetime, timezone и stdstr.
  • Внутренняя очистка

    • Для низкоуровневых вспомогательных функций используется библиотека libusual.
    • Из параметров сервера удалено ограничение фиксированной длины.

PgBouncer 1.3.x

2010-09-09 - PgBouncer 1.3.4 - «Баунсер всегда прав»

  • Исправления
    • Логика быстрого отказа применяется при установлении соединения. Если сервер не работает, клиенты получают ошибку при подключении.
    • Автоматически созданные базы данных больше не помечаются для проверки при перезагрузке, иначе они удалялись, поскольку отсутствуют в конфигурации.
    • Параметр application_name по умолчанию игнорируется. Поэтому пользователям Postgres 9.0 не требуется самостоятельно добавлять его в ignore_startup_parameters=.
    • Исправлено заключение pg_auth в кавычки. Символ ‘' там не используется.
    • Улучшены сообщения об ошибках в консоли: пользователю показывается входящий запрос.
    • Поддерживаются операционные системы (OpenBSD), где tv_sec не имеет тип time_t.
    • Устранены излишне шумные предупреждения gcc 4.5.

2010-05-10 - PgBouncer 1.3.3 - «NSFW»

  • Улучшения
    • Аргумент listen(2) теперь настраивается через listen_backlog. Это полезно в операционных системах, где можно менять максимально допустимое системное значение.
    • Сообщения об отключении теперь показывают имя пользователя или базы данных, из-за которых вход завершился неудачно.
  • Исправления
    • Переработана логика повторного запуска после быстрого отказа. Прежняя логика мешала при постоянно неисправных базах данных или пользователях, выполняя повторные попытки даже без клиентов, желающих войти.
    • Функции ведения журнала сохраняют прежнее значение errno, иначе при высоких уровнях журналирования и проблемах записи PgBouncer мог вести себя непредсказуемо.
    • Увеличены различные буферы, относящиеся к запуску, для обработки более многословного запуска EDB.
    • Запрос запуска протокола V2 распознаётся и сопровождается понятной причиной отключения.

2010-03-15 - PgBouncer 1.3.2 - «Пуля-бумеранг»

  • Исправления

    • Добавлена переменная конфигурации ‘query_wait_timeout’. Если клиент не получает серверное соединение за указанное число секунд, он будет отключён.

    • Если в пуле нет серверного соединения, а последняя попытка подключения завершилась неудачно, клиентские соединения не переводятся в ожидание — ошибка отправляется сразу.

      Вместе с предыдущим исправлением это устраняет ненужные задержки при недоступности базы данных.

    • Состояние libevent отслеживается в sbuf.c, чтобы избежать двойного вызова event_del(). Хотя обычно это безопасно, такой вызов работает не в 100% случаев. Теперь всегда должно быть известно, был ли он уже выполнен.

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

    • client_login_timeout применяется к клиентам, ожидающим приветственного пакета — первого серверного соединения. Иначе они могли ждать бесконечно, если не задан query_timeout.

    • win32: к -regservice добавлены ключи -U/-P, позволяющие выбрать учётную запись для запуска службы. Прежний автоматический выбор между Local Service и Local System был недостаточно надёжен.

    • Консоль: из конца текстовых столбцов удалён \0. Проблему было трудно заметить, поскольку клиенты C корректно его обрабатывали.

    • Улучшена документация. (Greg Sabino Mullane)

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

    • Уровень журналирования ошибок, отправляемых пулом обычно при отключении, изменён с INFO на WARNING, поскольку они указывают на проблемы.

    • Сообщение журнала для query_timeout изменено на “query timeout”.

2009-07-06 - PgBouncer 1.3.1 - «Теперь полностью соответствует требованиям мониторинга NSA»

  • Исправления
    • Исправлена проблема sbuf_loopcnt, из-за которой соединения могли зависать. Если длина запроса или результата близка к кратному (pktlen*sbuf_loopcnt) [10k по умолчанию], соединение могло продолжать ждать данные, которые уже не появятся.
    • Изменение конфигурации базы данных применяется немедленно. Ранее старые соединения могли повторно использоваться после SIGHUP.
    • Исправлена команда SHOW DATABASES, нарушенная добавлением столбца.
    • При “auth_type=any” доступ к консоли был отключён, поскольку PgBouncer отбрасывал имя пользователя. Исправление: при “auth_type=any” любой пользователь допускается в консоль как администратор.
    • Исправлен неверный макрос CUSTOM_ALIGN. К счастью, он не используется, если операционная система уже определяет ALIGN, поэтому ошибка, по-видимому, не проявлялась на практике.
    • win32: WSAStartup() всегда вызывается, а не только в режиме демона, поскольку при разборе конфигурации необходимо разрешать имена узлов.
    • win32: имя файла конфигурации в командной строке службы заключено в кавычки, чтобы пути могли содержать пробелы. Путь исполняемого файла, судя по всему, в этом не нуждается благодаря особенностям win32.
    • STATS добавлено в текст SHOW HELP.
    • doc/usage.txt: единицы времени в результатах консоли — микросекунды, а не миллисекунды.

2009-02-18 - PgBouncer 1.3 - «Новый завершающий приём Ki-Smash»

  • Возможности

    • IANA назначила порт 6432 официальным портом PgBouncer. Поэтому номер порта по умолчанию изменён на 6432. Отдельным существующим пользователям ничего менять не требуется, но распространителям пакетов PgBouncer следует изменить значение пакета по умолчанию на официальный порт.

    • Динамическое создание баз данных (David Galoyan)

      Теперь можно определить базу данных с именем “*”. Если она определена, её строка соединения используется для всех неопределённых баз. Это особенно полезно в тестовых средах и средах разработки.

    • Поддержка Windows (Hiroshi Saito)

      Теперь PgBouncer работает в Windows 2000+. Использование командной строки остаётся прежним, но запуск в режиме демона и перезапуск без остановки обслуживания недоступны. Для запуска как службы задайте в конфигурации параметр service_name. Затем выполните:

      > pgbouncer.exe config.ini -regservice
      > net start SERVICE_NAME
      

      Для остановки и отмены регистрации:

      > net stop SERVICE_NAME
      > pgbouncer.exe config.ini -unregservice
      

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

      > regsrv32 pgbevent.dll
      

      После этого в конфигурации можно задать “syslog = 1”.

  • Небольшие возможности

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

    • Добавлены параметры ‘reserve_pool_size’ и ‘reserve_pool_timeout’. Если клиенты пула ждут дольше ‘reserve_pool_timeout’ секунд, ‘reserve_pool_size’ задаёт число соединений, которые можно добавить в пул. Значение также можно задать для отдельного пула переменной соединения ‘reserve_pool’.

    • Добавлен параметр ‘sbuf_loopcnt’, ограничивающий время обработки одного сокета.

      В некоторых ситуациях — например на SMP-сервере с локальным Postgres и быстрой сетью — PgBouncer может многократно выполнять цикл recv()->send() без блокировки с обеих сторон. Тогда другие соединения надолго задерживаются. Для более справедливой обработки ограничивается число циклов recv()->send() на одном сокете. После достижения предела обрабатываются другие сокеты, а работа с прежним возобновляется в следующем цикле событий.

      Спасибо Alexander Schocke за сообщение и тестирование.

    • Аутентификация crypt() теперь необязательна, поскольку она удалена из Postgres. Если операционная система её не предоставляет, PgBouncer работает без неё.

    • В отметки времени журнала добавлены миллисекунды.

    • Прежняя реализация MD5 заменена более компактной.

    • Лицензия ISC обновлена разъяснением FSF.

  • Исправления

    • Если event_del() сообщает об ошибке, очистка всё равно продолжается. Ранее PgBouncer повторял вызов на случай ошибки из-за ENOMEM. Это приводило к переполнению журнала бесконечными повторами, поэтому, по-видимому, libevent такое поведение не поддерживает.

      Причина ошибки первого вызова event_del() по-прежнему неизвестна.

    • Теперь –enable-debug лишь определяет, удаляются ли отладочные сведения из двоичного файла. Параметр больше не меняет -fomit-frame-pointer, поскольку это опасно.

    • Исправлен порядок включения: иначе системные включаемые файлы могли предшествовать внутренним. Проблема затрагивала новый включаемый файл md5.h.

    • Файл COPYRIGHT включён в .tgz…


PgBouncer 1.2.x

2008-08-08 - PgBouncer 1.2.3 - «Тщательно отобранные байты»

  • Исправления
    • Код SO_ACCEPTFILTER отключён для BSD, где он не работал.
    • Пример etc/userlist.txt включён в tgz.
    • Для рекурсивного вызова используется ‘$(MAKE)’ вместо ‘make’ (Jorgen Austvik).
    • Определяется _GNU_SOURCE, без которого glibc бесполезна.
    • libevent 1.1 разрешено пройти тест компоновки, чтобы позднее можно было вывести сообщение “1.3b+ needed”.
    • Устаревший pidfile распознаётся и удаляется.

Спасибо Devrim GUNDUZ и Bjoern Metzdorf за сообщения о проблемах и тестирование.

2008-08-06 - PgBouncer 1.2.2 - «Гигиенический пакет в комплекте»

  • Исправления
    • Удалён ‘drop_on_error’: это была плохая идея. Параметр добавили как обходной путь для нарушенного поведения кэша планов Postgres, но он мог причинить вред в обычной ситуации, когда некоторые запросы всегда возвращают ошибку.

2008-08-04 - PgBouncer 1.2.1 - «Водонепроницаемый»

  • Возможности
    • Добавлен параметр ‘drop_on_error’: если сервер выдаёт ошибку, соединение не используется повторно, а закрывается после завершения работы клиента с ним. Это необходимо для обновления кэша планов. Автоматическое обновление не работает даже в 8.3. Значение по умолчанию — 1.
  • Исправления
    • SHOW SOCKETS/CLIENTS/SERVERS: устранено аварийное завершение, если у сокета нет буфера.
    • Исправлен бесконечный цикл SUSPEND при срабатывании suspend_timeout.
  • Небольшая очистка
    • Для ‘struct iovec’ используется <sys/uio.h>.
    • Завершение работы, начатое SIGINT, отменяется при RESUME/SIGUSR2, иначе оно сработало бы при следующем PAUSE.
    • Добавлено правильное сообщение журнала при отмене операции консоли.

2008-07-29 - PgBouncer 1.2 - «Обычная волшебная флейта»

PgBouncer 1.2 теперь требует libevent версии 1.3b или новее. Старые версии libevent аварийно завершаются с новым кодом перезапуска.

  • Возможности

    • Параметр командной строки (-u) и параметр конфигурации (user=) поддерживают переключение пользователя при запуске. Кроме того, PgBouncer теперь отказывается работать от root.

      (Jacob Coby)

    • Добавлен более подробный текст справки (-h). (Jacob Coby)

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

      (Teodor Sigaev)

    • Добавлена переменная конфигурации ‘ignore_startup_parameters’, разрешающая и игнорирующая дополнительные параметры пакета запуска. По умолчанию разрешены только ‘database’ и ‘user’, все остальные вызывают ошибку. Это необходимо для чрезмерно инициативного JDBC, безусловно задающего ’extra_float_digits=2’ в пакете запуска.

    • Ведение журнала в syslog: добавлены параметры syslog=0/1 и syslog_facility=daemon/user/local0.

    • Менее пугающий перезапуск без остановки обслуживания (-R)

      • Загрузка FD перенесена до fork, чтобы вывод шёл в консоль и операцию можно было отменить через ^C.

      • SHUTDOWN остаётся после fork, поэтому ^C будет безопасным.

      • Выполняется попытка connect() к Unix-сокету, чтобы определить наличие слушателя. Теперь -R можно использовать, даже если предыдущий процесс не работал. Если предыдущий процесс есть, но -R не указан, запуск завершается ошибкой.

    • Добавлены команды консоли:

      • SHOW TOTALS показывает сводную статистику, записываемую в журнал, и использование памяти.

      • SHOW ACTIVE_SOCKETS аналогична SHOW SOCKETS, но оставляет только активные сокеты.

  • Менее заметные возможности

    • suspend_timeout закрывает зависшие соединения и затянувшиеся входы, повышая безопасность перезапуска.

    • Когда удалённая база данных выдаёт ошибку при входе, клиенты получают уведомление.

    • Удаление базы данных из конфигурации с перезагрузкой работает: все соединения закрываются, а база удаляется.

    • Для большего сходства с Postgres подделываются некоторые параметры команд SHOW/SET в консоли. Это потребовалось, чтобы psycopg мог подключаться к консоли. (client_encoding/default_transaction_isolation/datestyle/timezone)

    • server_lifetime=0 теперь закрывает серверное соединение сразу после первого использования. Ранее “0” заставлял PgBouncer игнорировать возраст сервера. Поскольку это поведение не было документировано, зависеть от него никто не должен.

    • Внутренние улучшения:

      • Буферы пакетов выделяются лениво и используются повторно. Это должно значительно уменьшить потребление памяти и делает практичным большой pktbuf при множестве соединений.

      • Внесено множество улучшений обработки ошибок; теперь PgBouncer должен корректно переживать ситуации OOM.

      • Для управления памятью используется slab-аллокатор.

      • Выполнена значительная очистка кода.

  • Исправления

    • За один цикл событий выполнялся только один accept(), что могло создавать очередь соединений при большом числе попыток. Теперь прослушивающий сокет всегда опустошается полностью, что должно устранить проблему.
    • Обрабатывается EINTR от connect().
    • configure.ac совместим с autoconf 2.59.
    • Исправлена совместимость с Solaris (Magne Maehre).

PgBouncer 1.1.x

2007-12-10 - PgBouncer 1.1.2 - «Молот»

  • Возможности
    • Отключения из-за server_lifetime теперь разнесены на (server_lifetime / pool_size) секунд. Это не позволяет PgBouncer создавать всплески повторных подключений.
  • Исправления
    • Проблемы обновления без остановки обслуживания с 1.0 до 1.1:
      • 1.0 не отслеживает параметры сервера, поэтому они остаются NULL, но 1.1 этого не ожидала и аварийно завершалась.
      • Если параметры сервера неизвестны, а клиентские заданы, для них выполняется SET вместо сообщения об ошибке.
    • Удалены временные отладочные операторы, случайно оставленные в коде на уровне INFO и засорявшие журналы.
    • Исправлен debian/changelog.
  • Очистка
    • Поля структуры SBuf переставлены для лучшего выравнивания буфера.

2007-10-26 - PgBouncer 1.1.1 - «Пчела-брейкдансер»

  • Исправления
    • Кэш параметров сервера мог оставаться неинициализированным, вызывая ненужный SET. Это создавало проблему в 8.1, где нельзя изменять standard_conforming_strings. (Спасибо Dimitri Fontaine за сообщение и тестирование.)
    • Исправлена документация.
    • doc/fixman.py включён в .tgz.

2007-10-09 - PgBouncer 1.1 - «Набор инструментов Безумной Шляпы»

  • Возможности

    • Отслеживаются следующие параметры сервера:

      client_encoding  datestyle, timezone, standard_conforming_strings
      
    • Улучшения строки соединения базы данных:

      • В host= принимается имя узла.
      • В host= принимается пользовательское местоположение Unix-сокета.
      • Принимаются значения в кавычках: password=’ asd’‘foo’.
    • Добавлена переменная конфигурации server_reset_query, отправляемая сразу после освобождения.

    • Добавлена переменная конфигурации server_round_robin для переключения между LIFO и RR.

    • Пакет отмены для неактивного соединения больше не закрывает его.

    • Отмена через ^C из psql работает для SUSPEND / PAUSE.

    • При запуске выводятся ограничения FD.

    • При приостановке предпринимается попытка как можно скорее достичь границы пакета.

    • В параметры базы данных добавлен ’timezone’.

    • Используется долгоживущий fd файла журнала, повторно открываемый при SIGHUP / RELOAD.

    • Локальные сведения о конечных точках соединения добавлены в SHOW SERVERS/CLIENTS/SOCKETS.

  • Очистка кода

    • Больше отладочных сообщений журнала содержат сведения о сокете.
    • Удалены магические числа и очищены сообщения об ошибках. (David Fetter)
    • Добавлена структура-обёртка для текущих сведений о пакете, значительно уменьшающая сложность.
  • Исправления

    • Улучшено обнаружение недопустимых заголовков пакетов.
    • Проверка изменения auth_file была нарушена, из-за чего PgBouncer слишком часто перезагружал файл.

PgBouncer 1.0.x

2007-06-18 - PgBouncer 1.0.8 - «Дзюцу лопаты нежити»

  • Исправления
    • Исправлено аварийное завершение при обработке пакета отмены. (^C из psql)
  • Возможности
    • Теперь работают PAUSE ; RESUME ;.
    • Очищен разбор команд консоли.
    • Отключена дорогостоящая проверка assert для поиска в списке.

2007-04-19 - PgBouncer 1.0.7 - «С витаминами A-Z»

  • Исправления
    • Несколько пакетов ошибок/уведомлений с блокировкой send() между ними вызывали assert. Проблема исправлена полным удалением логики сброса. PgBouncer ничего активно не буферизует, поэтому она не нужна и оставалась со времён, когда буферизация передавалась ядру с MSG_MORE.
    • Кроме того, вызов логики recv() не выполняется при разблокировке отправки.
    • Код поиска в списке для admin_users и stats_users неверно обрабатывал частичные совпадения. Это исправлено.
    • Поиск UID однорангового узла Unix-сокета стандартизирован на getpeereid().

2007-04-12 - PgBouncer 1.0.6 - «Ежедневная доза»

  • Исправления
    • Исправление «Отключить обслуживание во время перехвата» могло полностью отключить обслуживание. Это исправлено.
    • Исправлена компиляция во FreeBSD, где <sys/ucred.h> требует <sys/param.h>. Спасибо Robert Gogolok за сообщение.

2007-04-11 - PgBouncer 1.0.5 - «На сегодня достаточно»

  • Исправления
    • Исправлены ошибки перезапуска без остановки обслуживания:
      • Для неактивных серверов задаётся ->ready.
      • Удалён устаревший код из use_client_socket().
      • Обслуживание отключается во время перехвата.

2007-04-11 - PgBouncer 1.0.4 - «Последняя “последняя” ошибка»

  • Исправления
    • Уведомление от неактивного сервера помечало сервер как загрязнённый. release_server() этого не ожидал. Теперь такие уведомления отбрасываются.

2007-04-11 - PgBouncer 1.0.3 - «Бесстрашный fork»

  • Исправления

    • В пути входа отсутствовала часть обработки ошибок, поэтому умирающее соединение могло вызывать assert.
    • Очищены assert в sbuf.c для более раннего обнаружения проблем.
    • При срабатывании Assert() создаётся core.
  • Новое

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

2007-03-28 - PgBouncer 1.0.2 - «Сверхзвуковая ложка»

  • Исправления
    • libevent может сообщить об удалённом событии в том же цикле. Повторное использование сокета откладывается на один цикл.
    • release_server() из disconnect_client() не проверял, был ли пакет действительно отправлен.

2007-03-15 - PgBouncer 1.0.1 - «Инопланетная технология»

  • Исправления

    • Смешанное использование кэшированного и некэшированного времени вместе с беззнаковым typedef usec_t создавало ложные ошибки query_timeout.
    • Исправлен редкий случай, когда сокет, разбуженный из ожидания отправки, продолжал зависать.
    • Реализована более справедливая очередь серверных соединений. Ранее новый запрос мог получить серверное соединение раньше старого.
    • Освобождение сервера откладывается, пока отправка всего содержимого не гарантирована.
  • Возможности

    • Команда SHOW SOCKETS предоставляет подробные сведения о состоянии.
    • Указатель PgSocket добавлен в журнал, чтобы отслеживать отдельное соединение.
    • В консоли разрешён SELECT вместо SHOW.
    • Выполнена различная очистка кода.

2007-03-13 - PgBouncer 1.0 - «Tuunitud bemm»

  • Первый публичный выпуск.

7 - Сообщество

Ресурсы сообщества PgBouncer, учебные материалы и поддержка

Учебные материалы


Поддержка

8 - Часто задаваемые вопросы

Часто задаваемые вопросы о PgBouncer

Как подключиться к PgBouncer?

PgBouncer работает как сервер Postgres, поэтому достаточно направить клиент на порт PgBouncer.


Как распределять запросы между несколькими серверами?

PgBouncer не имеет встроенной конфигурации для нескольких узлов. Распределение можно реализовать внешними средствами:

  1. Циклический перебор DNS. Укажите несколько IP-адресов для одного имени DNS. PgBouncer не выполняет поиск DNS при каждом новом соединении: он кэширует все IP-адреса и перебирает их циклически. Обратите внимание: если с одним именем связано более 8 IP-адресов, бэкенд DNS должен поддерживать протокол EDNS0. Подробности приведены в README.

  2. Используйте балансировщик соединений TCP, например LVS или HAProxy . На стороне PgBouncer может быть полезно уменьшить server_lifetime и включить server_round_robin: по умолчанию неактивные соединения повторно используются по алгоритму LIFO, который может плохо подходить для балансировки нагрузки.


Как выполнить переключение при отказе

PgBouncer не имеет встроенной конфигурации резервного узла и не обнаруживает отказы. Переключение можно реализовать внешними средствами:

  1. Перенастройка DNS: после изменения IP-адреса, связанного с именем DNS, PgBouncer подключится к новому серверу. Это поведение настраивается двумя параметрами: dns_max_ttl задаёт срок действия одного имени узла, а dns_zone_check_period — частоту проверки изменений SOA зоны. Если запись SOA зоны изменилась, PgBouncer повторно запросит все имена узлов в этой зоне.

  2. Запишите новый узел в конфигурацию и перезагрузите её в PgBouncer: отправьте SIGHUP или выполните в консоли команду RELOAD. PgBouncer обнаружит изменение конфигурации узла и подключится к новому серверу.

  3. Используйте команду RECONNECT. Она предназначена для ситуаций, когда два предыдущих способа неприменимы, например когда упомянутый HAProxy направляет исходящие из PgBouncer соединения. RECONNECT просто заново открывает все серверные соединения. Поэтому выполните эту команду после того, как другой компонент изменит сведения о маршрутизации соединений.


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

В сеансовом режиме пула запрос сброса должен удалять старые подготовленные операторы. Для этого можно задать server_reset_query = DISCARD ALL; или как минимум DEALLOCATE ALL;.


Как использовать подготовленные операторы в транзакционном режиме пула?

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

В зависимости от версии PHP/PDO может быть несовместим с поддержкой подготовленных операторов PgBouncer (#991 ). PHP/PDO совместим только при одновременном использовании PHP 8.4+ и libpq 17 . Поэтому для установок со старыми версиями рекомендуется обновление либо отключение подготовленных операторов на стороне клиента.

Отключение подготовленных операторов в JDBC

Для JDBC следует добавить параметр prepareThreshold=0 в строку соединения.

Отключение подготовленных операторов в PHP/PDO

Чтобы отключить подготовленные операторы на стороне сервера, атрибуту PDO PDO::ATTR_EMULATE_PREPARES обязательно нужно присвоить true при подключении:

$db = new PDO("dsn", "user", "pass", array(PDO::ATTR_EMULATE_PREPARES => true));

или позднее:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

Как обновить PgBouncer без разрыва соединений?

Можно выполнить поэтапный перезапуск по процедуре из раздела документации SHUTDOWN WAIT_FOR_CLIENTS .


Как определить соответствие клиентов серверным соединениям?

Выполните в консоли команды SHOW CLIENTS и SHOW SERVERS.

  1. Используйте ptr и link, чтобы сопоставить локальное клиентское соединение с серверным.

  2. Используйте addr и port клиентского соединения, чтобы определить соединение TCP от клиента.

  3. Используйте local_addr и local_port, чтобы определить соединение TCP с сервером.


Где устанавливать PgBouncer: на веб-сервере или сервере базы данных?

Это зависит от условий.

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

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

В конечном счёте необходимо проверить, какая модель лучше соответствует требованиям к производительности. Следует также учесть, как установка PgBouncer повлияет на переключение приложений при отказе веб-сервера или сервера базы данных.