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.