Вопросы и ответы
Как подключиться к 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 повлияет на аварийное переключение приложений в случае сбоя веб-сервера или сервера баз данных.