Ruby on Rails и Heroku — слишком много связей для роли

Я запускаю приложение rails на базовом плане Heroku для хобби, и по какой-то причине я продолжаю получать печально известную ошибку «Слишком много соединений для роли» всякий раз, когда я пытаюсь подключиться к производственной базе данных. Это означает, что автоматические резервные копии продолжают давать сбои, а задачи rake не будут выполняться, потому что им отказано в подключении.

Каждый раз, когда я запускаю heroku pg:info, он говорит 20/20 подключений. Если я запускаю heroku pg:killall, то все соединения уничтожаются, и он говорит 0/20, пока я не перезапущу все динамометры, и он сразу же вернется к 20/20.

Мне удалось запустить heroku pg:psql, уничтожив все соединения и перезапустив сервер, чтобы вызвать утечку соединения. Запуск SELECT * FROM pg_stat_activity показывает множество бездействующих запросов "SELECT 1", но не указывает, откуда они берутся. Вот типичная строка, ограниченная именем приложения, адресом_клиента, ожиданием, состоянием и запросом:

bin/rails | 10.14.19.163 | f | idle | SELECT 1

А теперь представьте, что x20, все началось миллисекунды между собой. Промежуточное приложение не проявляет этих симптомов и постоянно находится на уровне около 1/20 подключений.

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

Любая помощь в отладке этого беспорядка будет принята с благодарностью.

РЕДАКТИРОВАТЬ:

база данных.yml

default: &default adapter: postgresql encoding: unicode pool: 5 production: <<: *default url: <%= ENV['DATABASE_URL'] %>

heroku ps говорит следующее:

=== web (Hobby): bin/rails server -p $PORT -e $RAILS_ENV (1) web.1: up 2018/08/11 23:10:04 +0200 (~ 13h ago)


person Jonathan Skogeby    schedule 06.08.2018    source источник
comment
Что находится в вашем database.yml и что вы видите, когда запускаете heroku ps?   -  person Adam McCrea    schedule 12.08.2018
comment
Хм, ничего необычного. Я не слишком знаком с Тонким, поэтому я немного в недоумении. Я бы попробовал переключиться на Puma, как описано здесь .   -  person Adam McCrea    schedule 12.08.2018
comment
Я попытался переключиться на Puma, проблема не устранена.   -  person Jonathan Skogeby    schedule 12.08.2018
comment
Давайте посмотрим... heroku ps показывает, что вы используете один веб-дино и больше ничего. database.yml показывает пул соединений из 5. Все это означает, что я ожидаю увидеть МАКС. 5 подключений к Postgres, если только вы не настроили Puma для запуска нескольких рабочих (в чем я сомневаюсь, что вы это сделали). Мое единственное другое подозрение (хотя и маловероятное) - это другое приложение, подключающееся к той же БД. heroku pg:credentials:rotate стоит попробовать.   -  person Adam McCrea    schedule 12.08.2018
comment
Поменял учетные данные, тоже не помогло. Это должно означать, что само приложение генерирует эти SELECT 1 запросы? Что чертовски странно, поскольку SELECT 1 — это просто пинг.   -  person Jonathan Skogeby    schedule 12.08.2018
comment
Как насчет SELECT application_name from pg_stat_activity WHERE datname IS NOT NULL ORDER BY application_name. Это укажет, откуда берутся SELECT 1.   -  person Adam McCrea    schedule 12.08.2018
comment
К сожалению, это не дает больше информации, чем bin/rails.   -  person Jonathan Skogeby    schedule 12.08.2018


Ответы (1)


Это может быть вызвано несколькими вещами. Одним из них может быть то, что если вы используете параллельный веб-сервер, такой как Puma, он может получать столько подключений при развертывании в рабочей среде.

Способ отладки — запуск приложения в рабочем режиме:

rails server -e production

И в вашей базе проверьте количество подключений

select * from pg_stat_activity

И проверьте, какой процесс принимает соединения. Если проблема остается, рассмотрите возможность использования пула соединений PgBouncer

person Alex.U    schedule 07.08.2018
comment
Спасибо за ваш комментарий. Я попытался вытащить производственную базу данных локально и запустить сервер в производственном режиме, но мне не удалось воспроизвести проблему. Я читал о PgBouncer, но я чувствую, что это действительно последнее решение, поскольку, очевидно, есть какое-то соединение происходит утечка. - person Jonathan Skogeby; 07.08.2018
comment
Подключитесь к postgres heroku и запустите там тот же запрос select * from pg_stat_activity, который должен дать вам, по крайней мере, какой процесс потребляет соединения. - person Alex.U; 07.08.2018
comment
Я попробовал это, и все, что я нашел, было кучей бездействующих запросов SELECT 1 (см. мой вопрос). - person Jonathan Skogeby; 07.08.2018
comment
Вот хорошая статья, которую вы может уже сталкивался. Без подробностей о том, насколько активно ваше приложение работает с базой данных или какой веб-сервер вы используете, отлаживать его довольно сложно. Надеюсь, поможет - person Alex.U; 07.08.2018
comment
Приложение работает на тонком веб-сервере версии 1.7.2 и не очень требовательно к базе данных, максимум около дюжины одновременных пользователей. Как указано в исходном сообщении, ни один из этих симптомов не возникал до последнего развертывания. В первый раз я получил ошибку сразу после развертывания, когда попытался выполнить миграцию. Статья подняла много ценного, спасибо, что поделились. - person Jonathan Skogeby; 07.08.2018
comment
Я полагаю, вы ничего не меняли в своей production.rb или какой-либо переменной окружения Heroku? - person Alex.U; 07.08.2018
comment
Нет, ничего не изменилось ни в production.rb, ни в варах Heroku. - person Jonathan Skogeby; 08.08.2018