@pgsql

Страница 644 из 1062
Mikhail
24.01.2018
12:49:59
Ну триггер на сторное бд, что вот создалася сессия, значит создавай временную таблицу

Petr
24.01.2018
12:50:33
А сверяли-то Вы его с чем? ;)
Когда то делал голые запросы через psql сегодня как доберусь посмотрю

Mikhail
24.01.2018
12:50:35
Можете тогда с приложения при установке соединения ещё и инит sql свой делать

Google
Sergey
24.01.2018
12:50:43
а можно как то без pgbouncer?
On LOGON TRIGGER? Или это я разбежался?

Mikhail
24.01.2018
12:51:09
On LOGON TRIGGER? Или это я разбежался?
On login тогда? Ну вариант, просто я не знал что такой есть :)

Mikhail
24.01.2018
12:51:14
Или эмулировать временные Таблицы на постоянных и использую txcurrent

Mikhail
24.01.2018
12:51:44
Жаль!

Mikhail
24.01.2018
12:52:59
txid_current()

Yaroslav
24.01.2018
12:53:13
Жаль!
Разве это не зависит от режима pgbouncer? Кажется, в session level pooling временные таблицы по умолчанию DROP-аются по завершении сессии.

Maksim
24.01.2018
12:54:17
Конечно
ссылкой не поделитесь, а то никак нагуглить не могу

Mikhail
24.01.2018
12:58:53
Ладно, в которой раз придеться юзать UNLOGGED вместо TEMP :)

Все никак не могу придумать, как TEMP таблицы заюзать :)

Google
Konstantin
24.01.2018
13:00:29
Но ведь временные таблицы можно использоватьс pgbouncer-ом только в режиме session level pooling! А толку от такого режима мало. Его можно использовать когда есть мало глупых клиентов, которые не держут коннектов, а на каждый чих устанавливают новое соединение. Но это по любому ошибка дизайна. А нужен pgbuncer в первую очередь когда есть много умных клиентов, но лишь некоторые из них одновеременно активны. В таком случае нужно использовать statement level pooling и временные таблицы использовать нельзя.

Maksim
24.01.2018
13:08:34
Спасибо!

Konstantin
24.01.2018
13:18:28
Для транзакции можнопри использовании transaction level pooling. То тогда и каллбак при старте session не нужен. Создаёшь таблицу в начале транзакции и кдаляешь в конце... И получаешь в результате catalog bloating.

Konstantin
24.01.2018
13:22:13
>А почему Вы считаете, что это ошибка дизайна? Ну потому что установление коннекта - это очень дорогая операция. Конечно бывают ситуации, когда без этого никак. Но в большинтсве случаев всё таки лучше открыть коннекшин один раз и держать пока он нужен.

Konstantin
24.01.2018
13:25:05
> не понятно как выставлять схему например и прочие сесионные параметры 1. Никак. Зачем их выставлять? Т.е. зачем клиенту могут потребоваться какие-то специфичные только для него установки? Разве что только роль задать... 2. Все установки (set xyz=XXX) конкатенировать в строчку и добавлять это строку в качестве префикса к каждому statement-у через ';'

Maksim
24.01.2018
13:25:34
ага, а pgbouncer обрубает коннекты по расписанию с базой
пересоздавать периодически по расписанию простаивающий коннекты - это норма, даже лучше чем просто всё время держать

Maksim
24.01.2018
13:26:10
а рабочие!
хм, странно

Mikhail
24.01.2018
13:27:08
хм, странно
вот и я о том же

Google
Mike Chuguniy
24.01.2018
13:27:10
а рабочие!
А вот это либо баг, либо надо разбираться.

Mikhail
24.01.2018
13:27:35
server_connect_timeout

Mike Chuguniy
24.01.2018
13:28:33
По моему это фича как раз
Я такого не помню на проектах с различным объемом данных, с различной нагрузкой и различным временем запросов.

Mikhail
24.01.2018
13:28:51
а не коммитный

при сессионном он держит соединение

Konstantin
24.01.2018
13:29:34
>Можно в начала сессии создавать Какие сессии в режиме statement/transaction pooling? Я не спец по pgbouncer-у. Я с другой стороны в осонвном лазил:) temporary табличка живёт в бэкенде. pgbouncer в режиме отличном от session pooling разбрасывает запросы по разным бэкендам. Я не могу себе представить как бы можно было создать временную табличку в начале сессии и и потом использовать её на любом бэкенде. Даже если pgbouncer поддерживает некий каллбэк, который будет выполняться пере выполнением запроса или транзакции на каждом бэкенде, то всё равно данные временной таблички между бэкендами никто не передаст.

Mikhail
24.01.2018
13:29:39
И надо понимать, что обрывает он не соединение между клиентом и pgbouncer, а соединение между pgbouncer и postgres

Т.е. если у тебя нет сессионных параметров, то ты этого и не заметишь

Mikhail
24.01.2018
13:30:13
Но по факту он именно так и делает

Т.е. убивает наиболее загруженные коннекты, между pgbouncer и postgres

Mikhail
24.01.2018
13:32:05
Т.е. убивает наиболее загруженные коннекты, между pgbouncer и postgres
Вы смеётесь что ли?! пгбаунсер один из самых надёжных серверов что я видел . Он работает отлично на запредельных нагрузках

Mike Chuguniy
24.01.2018
13:32:09
значит был сессионный режим
Вот это вот я не помню, врать не буду.

Mikhail
24.01.2018
13:32:29
Он обрывает по таймауту содениение между pgbouncer и postgres

и не важно, нагруженное оно или нет было

Maksim
24.01.2018
13:43:00
Он обрывает по таймауту содениение между pgbouncer и postgres
тут вопрос: коннект обрывается, когда он освобождён и находится в пуле, или когда он занят внешним клиентом? По-хорошему imho, даже если таймаут сработал в момент занятости коннекта, то он должен подождать пока освободиться и потом пересоздать свою сессию

Google
Mikhail
24.01.2018
13:44:27
даже при сессионном пуллинге?
Нет, при сессионном все ок

Речь о коммитном пуллинге

Maksim
24.01.2018
13:45:29
ну тогда всё норм, после транзакции коннект потенциально свободен

Mikhail
24.01.2018
13:45:51
ну тогда всё норм, после транзакции коннект потенциально свободен
да, но tcp соединение уже разогрето, на очереди следующие данные

а оно обрывается

Maksim
24.01.2018
13:46:48
Mikhail
24.01.2018
13:46:53
нет

между bouncer и postgres

что еще хуже

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

Konstantin
24.01.2018
13:48:34
Если соединение ненужное, то и держать его не нужно:) Что значит "не нужное"? Это значит в течение нескольких секунд к базе никто не полезет. Тогда его ес-но можно дропнуть. Но тогда и pgbouncer не особо нужен. Если же клиент сразу же захочет отправить ещё один запрос, то рвать и переустанавливать соединение очень глупо. Ес-но мы (приложение) часто не знаем намерения клиента. Может он пошлёт запрос сейчас же. А может ушёл обедать. В таком случае лучше всего наверное рвать коннекшин по таймауту. Я только хочу сказать, что session level pooling в pgbouncer-е не спасёт о того, что вернушись с обеда несколько тысяч клиентов олдновременно захотят обратится к базе, что потребует запуска Посгресом нескольких тысяч процессов-бэкендов (если в pgbouncer-а не ограничено максимальное число коннектов). А если ограничено - то тогда некторые клиенты просто не смогут достучаться до базы.

Maksim
24.01.2018
13:49:07
между bouncer и postgres
ну тут диллема, что выгоднее: удержать разогретый tcp или убить разбухший бекэнд сессии

Mikhail
24.01.2018
13:49:39
Если соединение ненужное, то и держать его не нужно:) Что значит "не нужное"? Это значит в течение нескольких секунд к базе никто не полезет. Тогда его ес-но можно дропнуть. Но тогда и pgbouncer не особо нужен. Если же клиент сразу же захочет отправить ещё один запрос, то рвать и переустанавливать соединение очень глупо. Ес-но мы (приложение) часто не знаем намерения клиента. Может он пошлёт запрос сейчас же. А может ушёл обедать. В таком случае лучше всего наверное рвать коннекшин по таймауту. Я только хочу сказать, что session level pooling в pgbouncer-е не спасёт о того, что вернушись с обеда несколько тысяч клиентов олдновременно захотят обратится к базе, что потребует запуска Посгресом нескольких тысяч процессов-бэкендов (если в pgbouncer-а не ограничено максимальное число коннектов). А если ограничено - то тогда некторые клиенты просто не смогут достучаться до базы.
опять вы меня не поняли. Соединение нагруженное, данные идут постоянно. Но по таймауту оно обрубается железно!

ну тут диллема, что выгоднее: удержать разогретый tcp или убить разбухший бекэнд сессии
не вижу дилеммы. По мне дак вообще нельзя убивать коннекты между pgbouncer и postgresql

Maksim
24.01.2018
13:51:25
Konstantin
24.01.2018
13:51:49
> Соединение нагруженное, данные идут постоянно. Но по таймауту оно обрубается железно! А зачем тогда использовать pgbouncer?

Dmitry
24.01.2018
13:52:25
Google
Maksim
24.01.2018
13:52:44
он что, течёт чтоли? :=)
формально нет, но всё же

Dmitry
24.01.2018
13:53:22
тогда если бакэнд выделил память, то почему при реконнекте он снова от системы не потребует в таком же размере память?

а частое выделение памяти - тоже проблема.

Konstantin
24.01.2018
13:54:33
>тогда у бекэндов будет разбухать локальная память Память может разбухать либо если в Посгресе есть memory leak-и, либо у нас очень большой каталог изи-за чего локальные кэши могут раздуваться. Но это корее клинический случай. Опять таки если в базе сотни тысяч ьтаблиц, то покупайте под неё машинку с большим колличеством памяти, чтобы радувающиейся бэкенды в неё влезали. Потому как если каталог ен влезает в кэш, это по любому очень плохо будет сказываться на скорости.

Maksim
24.01.2018
13:54:42
он что, течёт чтоли? :=)
если памяти под завязку, то это становится проблемой

Dmitry
24.01.2018
13:55:11
если памяти под завязку, то это становится проблемой
проблема в том, что work_mem работает только на этапе планирования

Maksim
24.01.2018
13:55:14
Dmitry
24.01.2018
13:55:15
а так проблемы нет.

проблема в том, что work_mem работает только на этапе планирования
поэтому проблемы могут быть с oom если плохая статистика

Konstantin
24.01.2018
13:56:21
Не должны бэкенды дуться. Чаще вссего это свидетельствует о каких-то проблемах с приложением: слишком много вреенных таблиц, prepared statement-ов,...

Maksim
24.01.2018
13:57:28
проблема в том, что work_mem работает только на этапе планирования
work mem как я понимаю высвобождается, речь не о нём. В принципе, мажоритарно у бекэндов, которые долго живут, resident anonymous часть разрастается

Dmitry
24.01.2018
13:59:14
work mem как я понимаю высвобождается, речь не о нём. В принципе, мажоритарно у бекэндов, которые долго живут, resident anonymous часть разрастается
объясняю, если work_mem достаточен на этапе планирования, то операция производиться делается в памяти - тогда может произойти OOM, если планировщик неодооценил кол-во строк. это проблема. а то что бакэнд кушает память и вышел на "крейсерное значение" - это не проблема

Konstantin
24.01.2018
14:00:22
Есть ещё кончено франгментация памяти. С которой аллокаторы борются борются но никак не поборют. Но Посгресовые MemoryContext-ы всё таки должны сильно уменьшать фрагментацию.

Да, oom может случиться из-за прокола с планом. Но перезапуск бэкенда тут ен поможет. Это может случиться и на свеженьком бэкенде.

Yaroslav
24.01.2018
14:02:14
опять вы меня не поняли. Соединение нагруженное, данные идут постоянно. Но по таймауту оно обрубается железно!
Да я не совсем об этом... А почему бы не рассчитывать на то, что установление соединения "дешёвое" (т.е. рассчитывать на bouncer)? Т.е. сделал дело (транзакцию, например; или стало известно, что оно в ближайшее время не понадобится) —- закрыл соединение (в приложении)?

Mikhail
24.01.2018
14:02:31
Konstantin
24.01.2018
14:03:26
Потому что установление TCP-шного соединения (хотя с pgbouncer-ом, хоть с кем либо ещё) по любому не дешёвая операция.

Страница 644 из 1062