С чего начать расследование проблемы, вызывающей сбой базы данных: оставшиеся слоты соединений зарезервированы для соединений суперпользователя без репликации - PullRequest
0 голосов
/ 04 ноября 2019

Иногда наша база данных Postgres падает, и это можно решить только путем перезапуска сервера. Мы попытались увеличить максимальные соединения и Django CONN_MAX_AGE. Также я пытаюсь узнать, как настроить PgBouncer. Однако я убежден, что основной проблемой должно быть что-то еще, что можно исправить.

Я пытаюсь найти, что это за проблема. Проблема в том, что я не знаю, где или с чего начать смотреть. Вот некоторые сведения:

Ошибки всегда OperationalError: FATAL: remaining connection slots are reserved for non-replication superuser connections и OperationalError: could not write to hash-join temporary file: No space left on device. Я думаю, что это вызвано открытием слишком большого количества соединений с базой данных, но мне никогда не удавалось отследить это, когда я отключился, чтобы я мог проверить pg_stat_activity и посмотреть, какие фактические соединения были активными.

Просмотр журнала ошибок, тот же URL-адрес отображается по большей части. Я проверил журнал nginx, и он перечислен во многих разных строках, что означает, что запрос делается несколько раз за раз, а не Django регистрирует одну и ту же ошибку несколько раз. На все эти запросы отвечает 499 Закрытый клиентский запрос . В дополнение к этому тому же URL, есть, конечно, несколько запросов других пользователей, пытающихся получить доступ к нашему сайту.

Я должен упомянуть, что логика, которую сервер обрабатывает, когда запрашивается URL, довольно проста, и я вижу,ничего подозрительного, что могло бы вызвать сбой базы данных. Тем не менее, по какой-то причине страница загружается медленно в работе.

Я знаю, что это очень расплывчато и очень мало с чем работать, но я не привык работать сисадмином, я изучал подобные вещи только в колледже. и до сих пор я работал только разработчиком.

1 Ответ

1 голос
/ 04 ноября 2019

Эти две проблемы в основном независимы.

Недостаток слотов подключения не приведет к сбою базы данных. Это просто признак того, что вы либо не используете пул соединений, либо у вас утечка соединений , то есть вы забыли закрыть транзакции в своем коде.

Недостаточно свободного места приведет к сбоюв вашей базе данных, если условие сохраняется.

Я предполагаю, что в вашей системе происходит следующее:

  • Поскольку кто-то забыл пару условий соединения или по какой-то другой причине, некоторыеВаши запросы занимают очень много времени.

    Они также приводят к большому количеству (возможно, промежуточных) результатов, которые кэшируются во временных файлах, которые в конечном итоге заполняют диск. Это условие нехватки места сбрасывается при сбое запроса, но может привести к сбою базы данных.

  • Поскольку эти запросы занимают много времени и блокируют сеанс базы данных, ваше приложение продолжает запускать новые сеансыпока он не достигнет предела.

Решение:

  • Находите и исправляйте запросы на побег. В качестве временного интервала вы можете установить statement_timeout для завершения всех операторов, которые занимают слишком много времени.

  • Используйте пул соединений с верхним пределом, чтобы у вас не заканчивалисьсоединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...