Как pgbouncer обрабатывает неактивные сеансы?

Как будет вести себя подключение pgbouncer->postgres в случае, если перед postgres в определенный момент времени приходит 1000 соединений с сервиса, большинство из которых находятся в состоянии idle и, таким образом, забивают max_connections в postgres? Каковы будут преимущества от использования такой схемы с pgbouncer в данном случае?
  • 13 марта 2024 г. 14:19
Ответы на вопрос 2
Pgbouncer обрабатывает неактивные сеансы путем их перемещения в пул соединений и повторного использования при необходимости. Если клиент отключается от базы данных, соединение остается открытым и переиспользуется другим клиентом.

В ситуации, когда перед postgres приходит 1000 соединений, большинство из которых находятся в состоянии idle, pgbouncer может управлять этими соединениями и решать, какие из них нужно держать открытыми и переиспользовать, а какие можно закрыть. Это позволяет эффективно использовать ресурсы postgres и избежать истощения max_connections.

Преимущества от использования pgbouncer в данном случае включают в себя:

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

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

3. Эффективное использование ресурсов: pgbouncer может помочь избежать истощения ресурсов postgres путем управления соединениями и предотвращения перегрузки базы данных.
pgbouncer начал поддерживать prepared statements совсем недавно и в ограниченном объёме. Если есть возможность - лучше от них избавиться. 

В целом в вашем случае пулер - то, что нужно. Если приложение не умеет само вовремя отключаться от базы, пусть лучше занимает слоты у pgbouncer.

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

Client connections idling longer than this many seconds are closed. This should be larger than the client-side connection lifetime settings, and only used for network problems.

Default: 0.0 (disabled)
Похожие вопросы