Heroku «psql: FATAL: оставшиеся слоты подключения зарезервированы для подключений суперпользователя без репликации»

120

Я разрабатываю приложение на Heroku с серверной частью Postgresql. Периодически я получаю это сообщение об ошибке при попытке доступа к базе данных как из интерфейса командной строки, так и при загрузке страницы на сервере:

psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

Кто-нибудь видел это раньше или, пожалуйста, помогите мне указать в правильном направлении?

nathancahill
источник
1
Такая же проблема. Я где-то читал, что служба поддержки Heroku «обнаружила некоторые проблемы» на некоторых серверах, и они рекомендовали данному пользователю подготовить новую базовую базу данных и перейти на нее с помощью pgbackups. Моя проблема сейчас в том, что приложение настолько новое, что я еще не создавал резервную копию, и, конечно же, я получаю ту же ошибку, пытаясь создать ее: D
Андре Ласло
Для записи, я смог использовать heroku pgbackupsкоманду для создания резервной копии, несмотря на эту ошибку.
markshiz
Чтобы воспроизвести эту проблему, вы можете создать большое количество терминалов. .batскрипт в Windows для этого: for /l %%x in (1, 1, 100) do ( start psql )где 100 - желаемое количество бэкэндов.
koxt
У меня такая же проблема. Мне не удалось перенести данные в новую базу данных pg:backups copy, pg:backups captureподключившись к ней со pgAdminсвоего компьютера или каким-либо другим способом, который я мог себе представить. Даже pg:killallне помогло. Через час я попытался снова, и количество подключений составило 50-50, поэтому после нескольких попыток у меня все получилось, pg:backups copyи мое приложение снова в воздухе. Это был ... не веселый день. Если вы искали это в Google, выпейте чашку воды.
Aur Saraf
1
Теперь у меня это снова. Как удачно задокументировал мой предыдущий опыт ... Изменить: на этот раз перезапуска было достаточно.
Aur Saraf

Ответы:

56

Вам нужно либо увеличить параметр max_connectionsконфигурации, либо (возможно, лучше) использовать пул соединений для маршрутизации большого количества пользовательских запросов через меньший пул соединений.

https://wiki.postgresql.org/wiki/Number_Of_Database_Connections

kgrittn
источник
14
Также распространенной проблемой является что-то вроде сбоя клиентского приложения, когда соединения остаются открытыми, а при перезапуске открываются новые. Если такое случается часто, у вас кончатся связи. Или приложение просто неправильно настроено и открывает слишком много подключений.
Скотт Марлоу,
5
Я не думаю, что могу изменить настройки конфигурации на Heroku. Есть ли способ закрыть все открытые соединения?
nathancahill 07
1
Будем надеяться, что сервер настроен для пакетов поддержки активности на довольно агрессивной основе. Это приведет к завершению сеанса в разумные сроки, если соединение будет внезапно прервано. Если это не настроено, если вы можете войти в систему как суперпользователь базы данных, вы можете определить pidзначения для сеансов и использовать pg_terminate_backend()функцию для их уничтожения. Чтобы избежать этой проблемы, убедитесь, что вы закрыли соединения должным образом, а не резко отключили клиентскую часть.
kgrittn 07
@nathancahill Прекратить все подключения к базе данных:heroku pg:killall
Роко,
9

Это исключение произошло, когда я забыл закрыть соединения

Sanyifejű
источник
7

См. Heroku «psql: FATAL: оставшиеся слоты подключения зарезервированы для подключений суперпользователя без репликации» :

У Heroku иногда возникают проблемы с балансировкой нагрузки базы данных.

André Laszlo, markshizи я все сообщил, что имел дело с этим в комментариях к вопросу.

Чтобы избавить вас от звонка в службу поддержки, вот ответ, который я получил от службы поддержки Heroku по аналогичной проблеме:

Привет,

Одним из ограничений баз данных уровня «хобби» является необъявленное обслуживание. Многие базы данных для хобби работают на одном общем сервере, и нам время от времени потребуется перезапускать этот сервер для обслуживания оборудования или перенести базы данных на другой сервер для балансировки нагрузки. Когда это произойдет, вы увидите ошибку в своих журналах или проблемы с подключением. Если сервер перезагружается, для возврата базы данных в оперативный режим может потребоваться 15 минут или больше.

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

Это одна из причин, по которой мы не рекомендуем запускать любительские базы данных для критически важных производственных приложений. Базы данных Standard и Premium включают уведомления о простоях и в целом намного более производительны и стабильны. Вы можете использовать pg: copy для перехода на стандартный или премиальный план.

Если это продолжается, вы можете попробовать подготовить новую базу данных (на другом сервере) с помощью дополнений heroku: add, а затем использовать pg: copy для перемещения данных. Имейте в виду, что правила уровня хобби применяются к базовому плану за 9 долларов, а также к бесплатной базе данных.

Спасибо, Брэдли

Аур Сараф
источник
1
Интересно, какой будет готовый ответ, когда вы используете план базы данных за 50 долларов в месяц?
mpoisot 02
1
Только хобби-уровни используют общие серверы баз данных. При тарифном плане на 50 долларов в месяц у вас есть собственный сервер, поэтому, если вы столкнетесь с этой проблемой, ваше собственное приложение создает ее. С тарифным планом 50 долларов в месяц у вас есть больше административных возможностей, поэтому его легче диагностировать и исправлять.
Джессамин Смит
Не могли бы вы объяснить, какие административные возможности доступны со стандартным вариантом? Также получаю это сообщение всего с 200 подключениями.
Pencilcheck
6

Я действительно пытался реализовать пул соединений на конце django, используя:

https://github.com/gmcguire/django-db-pool

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

Здесь есть статья о том, как переместить вашу базу данных postgresql на бесплатный / дешевый уровень Amazon RDS. Это позволит вам установить max_connectionsболее высокий уровень. Это также позволит вам объединять соединения на уровне базы данных с помощью PGBouncer.

https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

ОБНОВИТЬ:

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

markshiz
источник
Я думаю, что перемещение базы данных - лучшее решение для полного контроля над ней. Спасибо за статью.
nathancahill
-3

Перезагрузите базу данных postgres, выполнив следующую команду:

postgres -D /usr/local/var/postgres
Навин Агарвал
источник
База данных Postgres - это служба, размещенная на Heroku, поэтому это не сработает.
flurdy