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

Привет.
Вопрос возможно покажется некорректным, с pgbouncer я пока не работал.
Проблема - к postgres в определённый момент времени прилетает 1000 соединений с сервиса. Сервис похоже использует подготовленные запросы, большинство соединений большую часть времени находится в состоянии idle. Тем самым забивая max_connections в postgres.
Вопрос - а если спереди поставить pgbouncer то какое поведение по соединениям будет pgbouncer->postgres? Будет ли профит от такой схемы?
  • Вопрос задан
  • 504 просмотра
Решения вопроса 2
ky0
@ky0
Миллиардер, филантроп, патологический лгун
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)
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Зависит от pool_mode.

В режиме session баунсер прозрачен для приложения: не налагает каких-то явных ограничений на использование, но один клиент к баунсеру = один коннект к базе. Соединение с базой сможет быть передано другому клиенту только после того как предыдущий клиент отключится. Поэтому этот режим используется очень редко.

В режиме transaction пула коннект к базе выдаётся клиенту только на время транзакции. Самый распространённый режим работы, любим именно за то, что сколько бы тысяч коннектов не открыло приложение к баунсеру, на базе открыто небольшое число действительно потребовавшихся соединений.
Но этот режим пула налагает ограничения на работу приложения. Вы не сможете нормально использовать ничего, что меняет состояние коннекта, потому что следующий ваш запрос с высокой вероятностью попадёт в другой коннект. То есть курсоры, временные таблицы, set (кроме set local), prepared statements (где parse, bind и execute могут разойтись по 3 разным коннектам)

С prepared statements в transaction pool mode с недавних пор может помочь настройка max_prepared_statements, но только если prepare и deallocate выполняются именно командами протокола, но не SQL запросами. Тут многие широкоиспользуемые библиотеки оказались в пролёте.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@igortru Автор вопроса
Melkij а есть пуллеры котрые будут корректно работать с подготовленными запросами?
У нас используется php с библиотекой pdo а там судя по всему deallocate используется на уровне sql запроса.
Odissey, pgcat, pgpool...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы