Heroku "psql: FATAL: решта з’єднань, що залишилися, зарезервовані для підключень суперресурсів без реплікації"


120

Я розробляю додаток для Heroku з бекендом Postgresql. Періодично я отримую це повідомлення про помилку при спробі доступу до бази даних як від CLI, так і при завантаженні сторінки на сервер:

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

Хтось бачив це раніше чи, будь ласка, допоможіть мені направити мене в правильному напрямку?


1
З тією ж проблемою. Десь я читав, що підтримка Heroku "виявила деякі проблеми" на деяких серверах, і вони рекомендували зацікавленому користувачу створити нову базу даних Basic і перейти до неї за допомогою pgbackups. Моя проблема зараз полягає в тому, що додаток настільки новий, що я ще не створив резервну копію, і я отримую таку ж помилку, намагаючись створити один звичайно: D
Андре Ласло

Для запису я зміг використовувати heroku pgbackupsкоманду для створення резервної копії, незважаючи на цю помилку.
markhiz

Для відтворення цього питання ви можете створити велику кількість терміналів. .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і моя програма повернулася в ефір. Це був ... не веселий день. Якщо ви погуглили це, випийте склянку води.
Aur Saraf

1
Зараз у мене це знову. Як пощастило задокументувати мій попередній досвід ... Редагувати: цього разу перезапуску вистачило.
Aur Saraf

Відповіді:


56

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

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


14
Також поширеною проблемою є щось на зразок того, що програма клієнта збоїв і залишає відкритими з'єднання, а потім відкриває нові, коли він перезапускається. Якщо подібної речі трапляється багато, то у вас не вистачить зв’язків. Або додаток просто налаштовано неправильно і відкриває занадто багато з'єднань.
Скотт Марлоу

5
Я не думаю, що я можу змінити налаштування конфігурації на Heroku. Чи є спосіб закрити всі відкриті з'єднання?
nathancahill

1
Сподіваємось, сервер налаштований для збереження пакетів на досить агресивній основі. Це призведе до припинення сеансів у розумний час, якщо з’єднання різко перервано. Якщо це не налаштовано, якщо ви можете увійти як суперпользователь баз даних, ви можете визначити pidзначення для сеансів і скористатися pg_terminate_backend()функцією для їх знищення. Щоб уникнути проблеми, не забудьте належним чином закрити з'єднання, а не різко знищуючи клієнтську сторону.
kgrittn

@nathancahill Припиніть усі підключення до бази даних:heroku pg:killall
Roko


7

Побачити Heroku "psql: FATAL: решта з’єднань, що залишилися, зарезервовані для підключень суперресурсів без реплікації" :

У Heroku іноді виникають проблеми з балансуванням завантаження бази даних.

André Laszlo, markshiz і я всі повідомив, що маю справу з цим у коментарях до цього питання.

Щоб заощадити виклик підтримки, ось відповідь, яку я отримав від служби підтримки Heroku на подібну проблему:

Здравствуйте,

Одним із обмежень баз даних рівня хобі є непередбачене обслуговування. Багато баз даних хобі працюють на одному спільному сервері, і нам періодично потрібно буде перезапустити цей сервер для цілей технічного обслуговування або перенести бази даних на інший сервер для збалансування завантаження. Коли це станеться, ви побачите помилку у своїх журналах або виникнуть проблеми з підключенням. Якщо сервер перезавантажується, база даних може зайняти 15 хвилин або більше.

Більшість додатків, які підтримують пул з'єднань (наприклад, ActiveRecord в Rails), можуть просто відкрити нове підключення до бази даних. Однак у деяких випадках додаток не зможе знову підключитися. Якщо це трапиться, ви можете перезапустити додаток, щоб повернути його в Інтернет.

Це одна з причин, яку ми рекомендуємо не запускати бази даних хобі для критичних виробничих додатків. Стандартні та преміальні бази даних містять сповіщення про події простою і в цілому є більш ефективними та стабільними. Ви можете використовувати pg: copy для переходу на стандартний або преміальний план.

Якщо це продовжується, ви можете спробувати забезпечити нову базу даних (на іншому сервері) з heroku addons: add, а потім використовувати pg: copy для переміщення даних. Майте на увазі, що правила базового рівня хобі застосовуються до базового плану $ 9, а також до безкоштовної бази даних.

Спасибі, Бредлі


1
Цікаво, що це за відповідь, коли ти плануєш базу даних по 50 доларів на місяць?
mpoisot

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

ОНОВЛЕННЯ:

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


Я думаю, що переміщення бази даних є найкращим рішенням для повного контролю над нею. Дякую за цю статтю
nathancahill

-3

Перезавантажте вашу базу даних поштових повідомлень, виконавши наступну команду:

postgres -D /usr/local/var/postgres

DB Postgres - це сервіс, розміщений Heroku, тому це не працюватиме.
нахабний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.