Это многостраничная версия текущего раздела для печати. .
Документация PgBouncer 1.25.2
- 1: Возможности
- 2: Конфигурация: pgbouncer.ini
- 3: Использование команды pgbouncer
- 4: Компиляция и установка PgBouncer
- 5: Загрузка исходных выпусков
- 6: Журнал изменений
- 7: Сообщество
- 8: Часто задаваемые вопросы
PgBouncer — менеджер пула соединений PostgreSQL. Любое клиентское приложение может подключаться к PgBouncer как к серверу PostgreSQL, а PgBouncer создаст соединение с настоящим сервером либо повторно использует одно из существующих соединений.
Цель PgBouncer — уменьшить влияние открытия новых соединений с PostgreSQL на производительность.
Чтобы объединение соединений в пул не нарушало семантику транзакций, PgBouncer поддерживает несколько режимов пула при перераспределении соединений:
- Сеансовый режим пула: наиболее щадящий метод. При подключении клиента ему назначается серверное соединение на всё время клиентского соединения. После отключения клиента серверное соединение возвращается в пул. Это режим по умолчанию.
- Транзакционный режим пула: серверное соединение назначается клиенту только на время транзакции. Когда PgBouncer определяет завершение транзакции, серверное соединение возвращается в пул.
- Режим пула на уровне операторов: наиболее строгий метод. Серверное соединение возвращается в пул сразу после завершения запроса. В этом режиме запрещены транзакции из нескольких операторов.
1 - Возможности
Несколько уровней строгости при перераспределении соединений:
- Сеансовый режим пула
- Наиболее щадящий метод. При подключении клиента ему назначается серверное соединение на всё время клиентского соединения. После отключения клиента серверное соединение возвращается в пул. Этот режим поддерживает все возможности 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 | Да | Никогда |
| Сеансовые рекомендательные блокировки | Да | Никогда |
Параметры запуска:
client_encoding,DateStyle,IntervalStyle,Timezone,standard_conforming_stringsиapplication_name. PgBouncer отслеживает их изменения и поэтому может гарантировать согласованные значения для клиента. Если PgBouncer должен поддерживать дополнительные параметры, см.track_extra_parametersиignore_startup_parameters. ↩︎Чтобы включить эту поддержку, параметру
max_prepared_statementsнеобходимо присвоить ненулевое значение. ↩︎
2 - Конфигурация: 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. Если каждый пользователь подключается
к серверу под собственным именем, теоретический максимум равен:
Если пользователь базы данных указан в строке соединения и все пользователи подключаются под одним именем, теоретический максимум равен:
Теоретический максимум не должен достигаться без намеренно созданной специальной нагрузки. Тем не менее число файловых дескрипторов следует задать с безопасным запасом.
Сведения о 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 требуется не более следующего объёма памяти для обработки подготовленных операторов:
Отслеживание подготовленных операторов увеличивает не только расход памяти, но
и загрузку CPU, поскольку PgBouncer анализирует и переписывает запросы. Чтобы
использовать для обработки несколько ядер, несколько экземпляров PgBouncer
могут прослушивать один порт; подробности приведены в
документации параметра so_reuseport
.
Подготовленные операторы также повышают производительность. Как и при прямом
подключении к PostgreSQL, подготовка многократно выполняемого запроса уменьшает
общий объём разбора и планирования. Способ отслеживания в PgBouncer особенно
полезен, когда несколько клиентов подготавливают одинаковые запросы: клиентские
соединения автоматически повторно используют оператор в серверном соединении,
даже если его подготовил другой клиент. Например, при pool_size 20 и 100
клиентах, подготавливающих один и тот же запрос, на сервере PostgreSQL запрос
будет подготовлен и разобран только 20 раз.
Повторное использование подготовленных операторов имеет недостаток. Если между выполнениями меняются типы возвращаемого значения или аргументов, PostgreSQL выдаёт ошибку вида:
Чтобы избежать таких ошибок, не допускайте использования несколькими клиентами
одной строки подготовленного запроса с разными ожидаемыми типами аргументов или
результата. Часто проблема возникает при миграции 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. Пример:
Параметры ведения журнала
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_SHA384TLS_CHACHA20_POLY1305_SHA256TLS_AES_128_GCM_SHA256TLS_AES_128_CCM_8_SHA256TLS_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_SHA384TLS_CHACHA20_POLY1305_SHA256TLS_AES_128_GCM_SHA256TLS_AES_128_CCM_8_SHA256TLS_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 вида:
Ключ считается именем базы данных, а значение — строкой соединения из описанных ниже пар key=value параметров соединения. Синтаксис похож на libpq, но сама libpq не используется, а набор доступных возможностей отличается. Пример:
Имя базы данных может без кавычек содержать символы _0-9A-Za-z. Имена с
другими символами необходимо заключать в стандартные кавычки идентификаторов
SQL: двойные кавычки, причём одна двойная кавычка записывается как "".
Имя базы данных pgbouncer зарезервировано для административной консоли и не
может использоваться здесь как ключ.
* служит резервным определением базы данных: если точное имя отсутствует, его
значение используется как строка соединения запрошенной базы. Например, при
наличии следующей записи и отсутствии переопределяющих записей:
соединение с PgBouncer, указавшее базу bar, будет фактически вести себя так,
как если бы существовала запись:
При этом используется значение dbname по умолчанию — имя базы данных на
стороне клиента; см. ниже.
Автоматически созданные записи баз данных удаляются, если остаются неактивными
дольше времени, заданного autodb_idle_timeout.
dbname
Имя целевой базы данных.
По умолчанию: совпадает с именем базы данных на стороне клиента
host
Имя узла или IP-адрес для подключения. Имена разрешаются при установлении
соединения, результат кэшируется согласно dns_max_ttl. При изменении разрешения
имени существующие серверные соединения автоматически закрываются после
освобождения согласно режиму пула, а новые сразу используют новый результат.
Если DNS возвращает несколько результатов, они перебираются циклически.
Если значение начинается с /, используется Unix-сокет в пространстве имён
файловой системы. Если оно начинается с @, используется Unix-сокет в
абстрактном пространстве имён.
Можно указать список имён узлов или адресов через запятую; соединения будут
устанавливаться циклически. Если имена из списка сами разрешаются DNS в несколько
адресов, две системы циклического перебора работают независимо. Это особенность
реализации, которая может измениться. Все узлы списка должны быть доступны
постоянно: механизмов пропуска недоступных узлов или выбора только доступных нет.
В этом поведение отличается от списка узлов libpq. Параметр влияет только на
выбор назначения новых соединений. Распределение клиентов по уже установленным
серверным соединениям описывает server_round_robin.
Примеры:
По умолчанию: не задан, то есть используется 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 вида:
Ключ считается именем пользователя, а значение — списком пар key=value параметров конфигурации этого пользователя. Пример:
Здесь доступно лишь несколько параметров.
Обратите внимание: если настроен 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, а значение — строкой соединения из описанных ниже пар
key=value параметров. Синтаксис похож на libpq, но сама libpq не используется,
а набор доступных возможностей отличается. Пример:
Примечание 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-сокет в
абстрактном пространстве имён.
Примеры:
port
По умолчанию: 6432
pool_size
Задаёт максимальное число запросов отмены, одновременно передаваемых
одноранговому узлу. Запросы отмены часто поступают всплесками, например когда
обслуживающий сервер Postgres работает медленно или недоступен. Поэтому
pool_size не должен быть настолько мал, чтобы не справляться со всплесками.
Если не задан, используется default_pool_size.
Директива включения
Файл конфигурации PgBouncer может содержать директивы включения, указывающие другой файл для чтения и обработки. Так конфигурацию можно разделить на физически отдельные части. Директива выглядит следующим образом:
Если имя файла не является абсолютным путём, оно считается относительно текущего рабочего каталога.
Формат файла аутентификации
В этом разделе описан формат файла, указанного параметром auth_file. Это
текстовый файл следующего формата:
Должно присутствовать не менее 2 полей в двойных кавычках. Первое поле — имя пользователя, второе — открытый пароль, хешированный MD5 пароль или секрет SCRAM. Остаток строки PgBouncer игнорирует. Двойную кавычку внутри значения поля можно экранировать двумя двойными кавычками.
Формат хешированного MD5 пароля PostgreSQL:
Таким образом, у пользователя admin с паролем 1234 хешированный MD5 пароль
будет равен md545f2603610af569b6155c45067268c6b.
Формат секрета SCRAM PostgreSQL:
Подробности приведены в документации 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 в консоль перед отправкой серверу.
Скопируйте секрет 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_typePgBouncer, а также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и регулярные выражения.
Примеры
Небольшой пример конфигурации:
Примеры баз данных:
Пример безопасной функции для auth_query:
Примеры конфигураций для 2 одноранговых процессов PgBouncer, создающих
многоядерную установку PgBouncer с помощью so_reuseport. Конфигурация первого процесса:
Конфигурация второго процесса:
См. также
pgbouncer(1) — страница man с общими сведениями об использовании и командах консоли.
3 - Использование команды 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.
Быстрый запуск
Базовая настройка и использование выполняются следующим образом.
Создайте файл 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Создайте файл
userlist.txtс пользователями, которым разрешён вход:"someuser" "same_password_as_in_server"Запустите PgBouncer:
$ pgbouncer -d pgbouncer.iniПодключите приложение или клиент psql к PgBouncer, а не напрямую к серверу PostgreSQL:
$ psql -p 6432 -U someuser template1Для управления PgBouncer подключитесь к специальной административной базе данных pgbouncer и сначала выполните
SHOW HELP;:$ psql -p 6432 -U someuser pgbouncer pgbouncer=# SHOW HELP; NOTICE: Console usage DETAIL: SHOW [HELP|CONFIG|DATABASES|FDS|POOLS|CLIENTS|SERVERS|SOCKETS|LISTS|VERSION|...] SET key = arg RELOAD PAUSE SUSPEND RESUME SHUTDOWN [...]После изменения файла pgbouncer.ini перезагрузите его командой:
pgbouncer=# RELOAD;
Ключи командной строки
-d,--daemon- Запустить в фоновом режиме. Без этого ключа процесс работает на переднем плане.
В режиме демона обязательно задать
pidfile, а такжеlogfileилиsyslog. После перехода в фоновый режим сообщения журнала не записываются в stderr.Примечание: в Windows этот ключ не работает; там PgBouncer должен быть запущен как служба.
-R,--reboot- УСТАРЕЛ: вместо этого параметра используйте поэтапный перезапуск нескольких процессов PgBouncer, прослушивающих один порт с помощью so_reuseport.
Выполнить перезапуск без остановки обслуживания: подключиться к работающему
процессу, получить от него открытые сокеты и использовать их. Если активного
процесса нет, выполняется обычный запуск.
Примечание: работает только при поддержке Unix-сокетов операционной системой
и включённом в конфигурации
unix_socket_dir. Не работает в Windows и с соединениями TLS — они разрываются. -uUSERNAME,--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 без простоя по следующей процедуре:
- Запустите два или более процессов PgBouncer на одном порту с использованием
so_reuseport(настройка одноранговых узлов рекомендуется, но не обязательна). Для перезапуска без простоя процессы перезапускаются по одному: остальные продолжают принимать соединения, пока один процесс перезапускается. - Выберите первый процесс для перезапуска и назовите его A.
- Выполните для процесса A
SHUTDOWN WAIT_FOR_CLIENTSили отправьтеSIGTERM. - Заставьте всех клиентов переподключиться. Можно дождаться, пока клиентский
пул инициирует переподключение из-за
server_idle_timeoutили аналогичного параметра. Если клиентский пул не используется, можно перезапустить клиентов. После переподключения всех клиентов процесс A завершится автоматически, поскольку к нему больше никто не подключён. - Снова запустите процесс A.
- Повторите шаги 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 с описанием параметров конфигурации.
4 - Компиляция и установка 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 |
- EDNS0 необходим, если с одним именем узла связано более 8 адресов.
- Поиск SOA необходим для повторной проверки имён узлов при изменении серийного номера зоны.
- Чтобы включить 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 1.25
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.25.2.tar.gz | 2026-05-08 | 865371 bytes | sha256 |
| pgbouncer-1.25.1.tar.gz | 2025-12-03 | 864801 bytes | sha256 |
| pgbouncer-1.25.0.tar.gz | 2025-11-09 | 863322 bytes | sha256 |
PgBouncer 1.24
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.24.1.tar.gz | 2025-04-16 | 717796 bytes | sha256 |
| pgbouncer-1.24.0.tar.gz | 2025-01-10 | 706573 bytes | sha256 |
PgBouncer 1.23
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.23.1.tar.gz | 2024-08-02 | 700025 bytes | sha256 |
| pgbouncer-1.23.0.tar.gz | 2024-07-03 | 694845 bytes | sha256 |
PgBouncer 1.22
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.22.1.tar.gz | 2024-03-04 | 677351 bytes | sha256 |
| pgbouncer-1.22.0.tar.gz | 2024-01-31 | 670589 bytes | sha256 |
PgBouncer 1.21
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.21.0.tar.gz | 2023-10-16 | 668211 bytes | sha256 |
PgBouncer 1.20
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.20.1.tar.gz | 2023-08-09 | 638844 bytes | sha256 |
| pgbouncer-1.20.0.tar.gz | 2023-07-20 | 638020 bytes | sha256 |
PgBouncer 1.19
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.19.1.tar.gz | 2023-05-31 | 623569 bytes | sha256 |
| pgbouncer-1.19.0.tar.gz | 2023-05-04 | 616947 bytes | sha256 |
PgBouncer 1.18
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.18.0.tar.gz | 2022-12-12 | 600825 bytes | sha256 |
PgBouncer 1.17
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.17.0.tar.gz | 2022-03-23 | 598294 bytes | sha256 |
PgBouncer 1.16
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.16.1.tar.gz | 2021-11-11 | 591450 bytes | sha256 |
| pgbouncer-1.16.0.tar.gz | 2021-08-09 | 592136 bytes | sha256 |
PgBouncer 1.15
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.15.0.tar.gz | 2020-11-19 | 588042 bytes | sha256 |
PgBouncer 1.14
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.14.0.tar.gz | 2020-06-11 | 578955 bytes | sha256 |
PgBouncer 1.13
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.13.0.tar.gz | 2020-04-27 | 574955 bytes | sha256 |
PgBouncer 1.12
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.12.0.tar.gz | 2019-10-17 | 567465 bytes | sha256 |
PgBouncer 1.11
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.11.0.tar.gz | 2019-08-27 | 571414 bytes | sha256 |
PgBouncer 1.10
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.10.0.tar.gz | 2019-07-01 | 480571 bytes | sha256 |
PgBouncer 1.9
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.9.0.tar.gz | 2018-08-13 | 469300 bytes | sha256 |
PgBouncer 1.8
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.8.1.tar.gz | 2017-12-20 | 465930 bytes | sha256 |
| pgbouncer-1.8.tar.gz | 2017-12-19 | 465612 bytes | sha256 |
PgBouncer 1.7
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.7.2.tar.gz | 2016-02-26 | 462374 bytes | sha256 |
| pgbouncer-1.7.1.tar.gz | 2016-02-18 | 461903 bytes | sha256 |
| pgbouncer-1.7.tar.gz | 2015-12-18 | 459080 bytes | sha256 |
PgBouncer 1.6
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.6.1.tar.gz | 2015-09-03 | 431076 bytes | sha256 |
| pgbouncer-1.6.tar.gz | 2015-08-01 | 412700 bytes | sha256 |
PgBouncer 1.5
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.5.5.tar.gz | 2015-04-09 | 336145 bytes | sha256 |
| pgbouncer-1.5.4.tar.gz | 2012-11-28 | 339610 bytes | sha256 |
| pgbouncer-1.5.3.tar.gz | 2012-09-12 | 339013 bytes | sha256 |
| pgbouncer-1.5.2.tar.gz | 2012-05-29 | 335338 bytes | sha256 |
| pgbouncer-1.5.1.tar.gz | 2012-04-17 | 334413 bytes | sha256 |
| pgbouncer-1.5.tar.gz | 2012-01-05 | 411488 bytes | sha256 |
PgBouncer 1.4
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.4.2.tgz | 2011-06-16 | 283204 bytes | sha256 |
| pgbouncer-1.4.1.tgz | 2011-04-01 | 282728 bytes | sha256 |
| pgbouncer-1.4.tgz | 2011-01-11 | 231691 bytes | sha256 |
PgBouncer 1.3
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.3.4.tgz | 2010-09-09 | 167957 bytes | sha256 |
| pgbouncer-1.3.3.tgz | 2010-05-10 | 167476 bytes | sha256 |
| pgbouncer-1.3.2.tgz | 2010-03-15 | 166756 bytes | sha256 |
| pgbouncer-1.3.1.tgz | 2009-07-06 | 161518 bytes | sha256 |
| pgbouncer-1.3.tgz | 2009-02-18 | 160154 bytes | sha256 |
PgBouncer 1.2
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.2.3.tgz | 2008-08-08 | 145372 bytes | sha256 |
| pgbouncer-1.2.2.tgz | 2008-08-06 | 145017 bytes | sha256 |
| pgbouncer-1.2.1.tgz | 2008-08-04 | 144903 bytes | sha256 |
| pgbouncer-1.2.tgz | 2008-07-29 | 143915 bytes | sha256 |
PgBouncer 1.1
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.1.2.tgz | 2007-12-10 | 122054 bytes | sha256 |
| pgbouncer-1.1.1.tgz | 2007-10-26 | 121042 bytes | sha256 |
| pgbouncer-1.1.tgz | 2007-10-09 | 120462 bytes | sha256 |
PgBouncer 1.0
| Файл | Дата | Размер | SHA256 |
|---|---|---|---|
| pgbouncer-1.0.8.tgz | 2007-06-18 | 93636 bytes | sha256 |
| pgbouncer-1.0.7.tgz | 2007-04-19 | 93086 bytes | sha256 |
| pgbouncer-1.0.6.tgz | 2007-04-12 | 92244 bytes | sha256 |
| pgbouncer-1.0.5.tgz | 2007-04-11 | 91934 bytes | sha256 |
| pgbouncer-1.0.4.tgz | 2007-04-11 | 91889 bytes | sha256 |
| pgbouncer-1.0.3.tgz | 2007-04-11 | 91489 bytes | sha256 |
| pgbouncer-1.0.2.tgz | 2007-03-28 | 90555 bytes | sha256 |
| pgbouncer-1.0.1.tgz | 2007-03-15 | 89609 bytes | sha256 |
| pgbouncer-1.0.tgz | 2007-03-13 | 88587 bytes | sha256 |
Двоичные пакеты
В различных дистрибутивах операционных систем имеются собственные пакеты или порты PgBouncer. Поэтому сначала следует проверить, доступен ли PgBouncer в вашей системе.
Специализированные сборки могут содержать более новые версии, чем репозитории дистрибутивов:
- RPM: yum.postgresql.org
- Deb: apt.postgresql.org
6 - Журнал изменений
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. Уязвимы системы, в которых одновременно выполнены ВСЕ следующие условия:
track_extra_parametersвключает search_path (нестандартная конфигурация, вероятно, применяемая только в установках с Citus или PostgreSQL 18)auth_userсодержит непустую строку (нестандартная конфигурация)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 )
- Добавлена аутентификация LDAP! Её можно настроить с помощью файла HBA или
- Изменения
- Значительно повышена производительность специальной аутентификации 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 )
- Исправлена поддержка PAM: поддержка аутентификации
Документация
- Пример
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_size0 означает неограниченный размер. (#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])
- Добавлена поддержка поэтапных перезапусков. SIGTERM больше не вызывает немедленное завершение процесса PgBouncer. Теперь выполняется «сверхбезопасное завершение»: процесс ждёт отключения всех клиентов. Новое поведение SIGTERM позволяет поэтапно перезапускать несколько процессов PgBouncer за балансировщиком нагрузки или на одном порту с
- Изменения
- Улучшен список соединений в выводе
SHOW USERS. ([#1040]) - Разрешена настройка
pool_sizeна уровне пользователя. ([#1049]) - Разрешена настройка
server_lifetimeна уровне базы данных. ([#1057]) - Добавлена поддержка вывода динамически созданных пользователей в выводе
SHOW USERS. ([#1052]) - Добавлена поддержка типа адреса
allв конфигурации HBA. ([#1078]) - Добавлена поддержка автоматического перезапуска при использовании systemd. ([#1080])
- Минимальная требуемая версия c-ares повышена до 1.9.0 ([#1076])
- Улучшен список соединений в выводе
- Исправления
- Исправлены проблемы с обработкой больших и частичных пакетов при старте. ([#1058])
- Добавлена поддержка формата
--config=valueв параметре startup-опции. ([#1064]) - Исправлен расчет метрики
avg_wait_time. ([#727]) - Добавлена поддержка переговоров о версии протокола PostgreSQL с клиентом. ([#1007])
- Добавлено отслеживание ожидающего запроса
auth_query. ([#1034]) - Улучшения документации и CI. [#996]: https://github.com/pgbouncer/pgbouncer/pull/996 [#1040]: https://github.com/pgbouncer/pgbouncer/pull/1040 [#1049]: https://github.com/pgbouncer/pgbouncer/pull/1049 [#1057]: https://github.com/pgbouncer/pgbouncer/pull/1057 [#1052]: https://github.com/pgbouncer/pgbouncer/pull/1052 [#1058]: https://github.com/pgbouncer/pgbouncer/pull/1058 [#1007]: https://github.com/pgbouncer/pgbouncer/pull/1007 [#876]: https://github.com/pgbouncer/pgbouncer/pull/876 [#902]: https://github.com/pgbouncer/pgbouncer/pull/902 [#1064]: https://github.com/pgbouncer/pgbouncer/pull/1064 [#1078]: https://github.com/pgbouncer/pgbouncer/pull/1078 [#1080]: https://github.com/pgbouncer/pgbouncer/pull/1080 [#727]: https://github.com/pgbouncer/pgbouncer/pull/727 [#1076]: https://github.com/pgbouncer/pgbouncer/pull/1076 [#1034]: https://github.com/pgbouncer/pgbouncer/pull/1034
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])
- Внесены многочисленные улучшения документации.
- Исправления
- Исправлена проблема в PG14+, из-за которой PgBouncer отправлял
SET DateStyle='ISO'для каждой транзакции. ([#879]) - Исправлена обработка пустого
application_name. ([#999]) - Исправлена сборка в Windows с OpenSSL 3.2.0. ([#1009]) [#972]: https://github.com/pgbouncer/pgbouncer/pull/972 [#979]: https://github.com/pgbouncer/pgbouncer/pull/979 [#983]: https://github.com/pgbouncer/pgbouncer/pull/983 [#998]: https://github.com/pgbouncer/pgbouncer/pull/998 [#879]: https://github.com/pgbouncer/pgbouncer/pull/879 [#999]: https://github.com/pgbouncer/pgbouncer/pull/999 [#1009]: https://github.com/pgbouncer/pgbouncer/pull/1009
- Исправлена проблема в PG14+, из-за которой PgBouncer отправлял
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])
- Добавлена поддержка именованных подготовленных операторов на уровне протокола! Вероятно,
это одна из самых востребованных возможностей PgBouncer. Использование подготовленных операторов
вместе с PgBouncer позволяет значительно снизить нагрузку на CPU системы — как со стороны
PgBouncer, так и со стороны PostgreSQL. В синтетических тестах эта возможность повышала
пропускную способность запросов от 15% до 250% в зависимости от нагрузки. Чтобы воспользоваться
ею, необходимо установить для нового параметра
- Изменения
- Повышена безопасность параметров 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])
- Внутренняя переработка
- Удалена поддержка библиотеки udns ([#938]) [#845]: https://github.com/pgbouncer/pgbouncer/pull/845 [#948]: https://github.com/pgbouncer/pgbouncer/pull/948 [#949]: https://github.com/pgbouncer/pgbouncer/pull/949 [#947]: https://github.com/pgbouncer/pgbouncer/pull/947 [#945]: https://github.com/pgbouncer/pgbouncer/pull/945 [#903]: https://github.com/pgbouncer/pgbouncer/pull/903 [#922]: https://github.com/pgbouncer/pgbouncer/pull/922 [#932]: https://github.com/pgbouncer/pgbouncer/pull/932 [#928]: https://github.com/pgbouncer/pgbouncer/pull/928 [#927]: https://github.com/pgbouncer/pgbouncer/pull/927 [#943]: https://github.com/pgbouncer/pgbouncer/pull/943 [#946]: https://github.com/pgbouncer/pgbouncer/pull/946 [#921]: https://github.com/pgbouncer/pgbouncer/pull/921 [#938]: https://github.com/pgbouncer/pgbouncer/pull/938 [libusual/#41]: https://github.com/libusual/libusual/pull/41
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как auth_dbname. Это по-прежнему не поддерживается, но теперь вместо сбоя выдаётся понятная ошибка. ([#817]) - Исправлено имя
peer_cacheвSHOW MEM: раньше оно ошибочно отображалось какdb_cache. ([#864]) - Исправлена путаница исходного и целевого IP в журнале: PgBouncer записывал адрес источника вместо назначения. ([#880])
- Административные соединения через Unix-сокеты записываются в журнал только при
log_connectionsсо значением1. ([#883]) [guc_report]: https://www.postgresql.org/docs/15/protocol-flow.html#PROTOCOL-ASYNC [pgoptions]: https://www.postgresql.org/docs/current/config-setting.html#id-1.6.7.4.5 [#867]: https://github.com/pgbouncer/pgbouncer/pull/867 [#814]: https://github.com/pgbouncer/pgbouncer/pull/814 [#866]: https://github.com/pgbouncer/pgbouncer/pull/866 [#878]: https://github.com/pgbouncer/pgbouncer/pull/878 [#817]: https://github.com/pgbouncer/pgbouncer/pull/817 [#864]: https://github.com/pgbouncer/pgbouncer/pull/864 [#880]: https://github.com/pgbouncer/pgbouncer/pull/880 [#883]: https://github.com/pgbouncer/pgbouncer/pull/883 [#894]: https://github.com/pgbouncer/pgbouncer/pull/894
- Устранено аварийное завершение при использовании административной базы
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])
- Внутренняя переработка
- Различные обновления CI для улучшения производительности
- Удалена AppVeyor [#528]: https://github.com/pgbouncer/pgbouncer/issues/528 [#620]: https://github.com/pgbouncer/pgbouncer/pull/620 [#666]: https://github.com/pgbouncer/pgbouncer/pull/666 [#764]: https://github.com/pgbouncer/pgbouncer/pull/764 [#792]: https://github.com/pgbouncer/pgbouncer/pull/792 [#796]: https://github.com/pgbouncer/pgbouncer/pull/796 [#815]: https://github.com/pgbouncer/pgbouncer/pull/815 [#830]: https://github.com/pgbouncer/pgbouncer/pull/830 [#833]: https://github.com/pgbouncer/pgbouncer/pull/833 [#834]: https://github.com/pgbouncer/pgbouncer/pull/834 [#837]: https://github.com/pgbouncer/pgbouncer/pull/837 [#838]: https://github.com/pgbouncer/pgbouncer/pull/838
PgBouncer 1.18.x
2022-12-12 - PgBouncer 1.18.0 - «Никакой настоящей тайны»
- Возможности
- Исправления
- Операция
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.
- Добавлена сквозная аутентификация SCRAM. Зашифрованные секреты SCRAM из
- Внутренняя переработка
- Добавлен альтернативный более компактный образец конфигурационного файла
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 больше не применяются.
- Файлы пакета Debian в каталоге
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 в префиксе журнала заключён в квадратные скобки.
- Добавлена поддержка аутентификации SCRAM для клиентов и серверов. Добавлен
тип аутентификации
- Исправления
- Исправлен тест OpenSSL в configure при работе с новыми версиями OpenSSL и
-Werror. - Исправлен расчёт времени ожидания с
auth_user. Ошибка приводила к аварийному завершению или мусорным значениям времени ожидания. (#393 ) - Обрабатывается пакет GSSENCRequest, добавленный в PostgreSQL 12. Сейчас он ничего не делает, но предотвращает непонятные сообщения об ошибке “bad packet header”.
- Исправлен тест OpenSSL в configure при работе с новыми версиями OpenSSL и
- Очистка
- В набор тестов внесено множество улучшений и добавлено несколько тестов.
- Исправлено несколько предупреждений компилятора в 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.
- Поддерживается аутентификация PAM. (Включается через
- Исправления
- Обновлённая 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 )
- Очистка
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. Это небезопасно.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] - имя базы может прийти из сети, что делает возможным удалённое завершение работы.
Небольшие возможности
- 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.
- Проблемы обновления без остановки обслуживания с 1.0 до 1.1:
- Очистка
- Поля структуры 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 для поиска в списке.
- Теперь работают PAUSE
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 для Postgres Plus Standard Server
Хороший обзор основных понятий PgBouncer.
Рассматривает различия между режимами пула.
Поддержка
Страница проекта на GitHub
Трекер задач на GitHub
Раздел PgBouncer на Stack Overflow
Обсуждения сообщества на GitHub
8 - Часто задаваемые вопросы
Как подключиться к PgBouncer?
PgBouncer работает как сервер Postgres, поэтому достаточно направить клиент на порт PgBouncer.
Как распределять запросы между несколькими серверами?
PgBouncer не имеет встроенной конфигурации для нескольких узлов. Распределение можно реализовать внешними средствами:
Циклический перебор DNS. Укажите несколько IP-адресов для одного имени DNS. PgBouncer не выполняет поиск DNS при каждом новом соединении: он кэширует все IP-адреса и перебирает их циклически. Обратите внимание: если с одним именем связано более 8 IP-адресов, бэкенд DNS должен поддерживать протокол EDNS0. Подробности приведены в README.
Используйте балансировщик соединений TCP, например LVS или HAProxy . На стороне PgBouncer может быть полезно уменьшить
server_lifetimeи включитьserver_round_robin: по умолчанию неактивные соединения повторно используются по алгоритму LIFO, который может плохо подходить для балансировки нагрузки.
Как выполнить переключение при отказе
PgBouncer не имеет встроенной конфигурации резервного узла и не обнаруживает отказы. Переключение можно реализовать внешними средствами:
Перенастройка DNS: после изменения IP-адреса, связанного с именем DNS, PgBouncer подключится к новому серверу. Это поведение настраивается двумя параметрами:
dns_max_ttlзадаёт срок действия одного имени узла, аdns_zone_check_period— частоту проверки изменений SOA зоны. Если запись SOA зоны изменилась, PgBouncer повторно запросит все имена узлов в этой зоне.Запишите новый узел в конфигурацию и перезагрузите её в PgBouncer: отправьте SIGHUP или выполните в консоли команду
RELOAD. PgBouncer обнаружит изменение конфигурации узла и подключится к новому серверу.Используйте команду
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.
Используйте
ptrиlink, чтобы сопоставить локальное клиентское соединение с серверным.Используйте
addrиportклиентского соединения, чтобы определить соединение TCP от клиента.Используйте
local_addrиlocal_port, чтобы определить соединение TCP с сервером.
Где устанавливать PgBouncer: на веб-сервере или сервере базы данных?
Это зависит от условий.
PgBouncer удобно устанавливать на веб-сервере при использовании короткоживущих соединений: так минимизируется задержка их установки. (Перед использованием соединения TCP требуется несколько циклов обмена пакетами.) Установка PgBouncer на сервере базы данных удобна, когда к нему подключается множество разных узлов, например веб-серверов: тогда их соединения можно оптимизировать вместе.
PgBouncer можно установить и на веб-сервере, и на сервере базы данных. Недостаток такой схемы в том, что каждый переход через PgBouncer добавляет небольшую задержку к каждому запросу.
В конечном счёте необходимо проверить, какая модель лучше соответствует требованиям к производительности. Следует также учесть, как установка PgBouncer повлияет на переключение приложений при отказе веб-сервера или сервера базы данных.