Heroku „psql: FATAL: pozostałe gniazda połączeń są zarezerwowane dla połączeń superużytkownika bez replikacji”

120

Tworzę aplikację na Heroku z zapleczem Postgresql. Okresowo otrzymuję ten komunikat o błędzie podczas próby dostępu do bazy danych, zarówno z CLI, jak i podczas ładowania strony na serwerze:

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

Czy ktoś widział to wcześniej lub proszę, pomóż mi wskazać właściwy kierunek?

nathancahill
źródło
1
Mając ten sam problem. Czytałem gdzieś, że wsparcie Heroku "wykryło pewne problemy" na niektórych serwerach i zaleciło danemu użytkownikowi udostępnienie nowej bazy danych Basic i migrację do niej przy użyciu pgbackups. Mój problem polega teraz na tym, że aplikacja jest tak nowa, że ​​nie utworzyłem jeszcze kopii zapasowej i oczywiście pojawia się ten sam błąd podczas próby utworzenia jednej: D
André Laszlo
Dla porządku, heroku pgbackupsmimo tego błędu udało mi się użyć polecenia, aby utworzyć kopię zapasową.
markshiz
Aby odtworzyć ten problem, możesz utworzyć dużą liczbę terminali. .batskrypt w systemie Windows do tego: for /l %%x in (1, 1, 100) do ( start psql )gdzie 100 jest pożądaną liczbą backendów.
następny
Miałem ten sam problem. Nie mogłem przenieść danych do nowej bazy danych pg:backups copy, pg:backups capturełącząc się z nią z pgAdminwłasnego komputera ani w żaden inny sposób, jaki mogłem sobie wyobrazić. Nawet pg:killallnie pomogło. Godzinę później spróbowałem ponownie i połączenia wynosiły 50-50, więc po kilku próbach udało pg:backups copymi się i moja aplikacja wróciła w powietrze. To nie był ... niezbyt przyjemny dzień. Jeśli to wygooglowałeś, wypij szklankę wody.
Aur Saraf,
1
Teraz znowu to mam. Jakie szczęście, że udało mi się udokumentować moje poprzednie doświadczenia… Edytuj: tym razem ponowne uruchomienie wystarczyło.
Aur Saraf

Odpowiedzi:

56

Musisz albo zwiększyć max_connectionsustawienie konfiguracji, albo (prawdopodobnie lepiej) użyć puli połączeń, aby skierować dużą liczbę żądań użytkowników przez mniejszą pulę połączeń.

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

kgrittn
źródło
14
Częstym problemem jest również awaria aplikacji po stronie klienta i pozostawienie otwartych połączeń, a następnie otwarcie nowych po ponownym uruchomieniu. Jeśli takie rzeczy zdarzają się często, zabraknie Ci połączeń. Lub aplikacja jest po prostu nieprawidłowo skonfigurowana i otwiera zbyt wiele połączeń.
Scott Marlowe
5
Nie sądzę, żebym mógł zmienić ustawienia konfiguracji w Heroku. Czy istnieje sposób na zamknięcie wszystkich otwartych połączeń?
nathancahill
1
Miejmy nadzieję, że serwer jest skonfigurowany do utrzymywania aktywności pakietów na dość agresywnych zasadach. Spowoduje to zakończenie sesji w rozsądnym czasie, jeśli połączenia zostaną nagle przerwane. Jeśli to nie jest skonfigurowane, jeśli możesz zalogować się jako superużytkownik bazy danych, możesz zidentyfikować pidwartości dla sesji i użyć pg_terminate_backend()funkcji, aby je zabić. Aby uniknąć problemu, pamiętaj o prawidłowym zamykaniu połączeń, a nie gwałtownym zabijaniu strony klienta.
kgrittn
@nathancahill Zakończ wszystkie połączenia z bazą danych:heroku pg:killall
Roko
9

Ten wyjątek zdarzył się, gdy zapomniałem zamknąć połączeń

Sanyifejű
źródło
7

Zobacz Heroku „psql: FATAL: pozostałe gniazda połączeń są zarezerwowane dla połączeń superużytkownika bez replikacji” :

Heroku czasami ma problem z równoważeniem obciążenia bazy danych.

André Laszlo, markshiza ja wszyscy informowaliśmy o tym w komentarzach do pytania.

Aby zaoszczędzić Ci połączenia z pomocą techniczną, oto odpowiedź, którą otrzymałem od pomocy technicznej Heroku na podobny problem:

Dzień dobry,

Jednym z ograniczeń baz danych poziomów hobbystów jest niezapowiedziana konserwacja. Wiele baz danych hobbystów działa na jednym serwerze współdzielonym i czasami będziemy musieli zrestartować ten serwer w celu konserwacji sprzętu lub przenieść bazy danych na inny serwer w celu równoważenia obciążenia. W takim przypadku zobaczysz błąd w swoich dziennikach lub będziesz mieć problemy z połączeniem. Jeśli serwer jest restartowany, powrót bazy danych do trybu online może zająć 15 lub więcej minut.

Większość aplikacji obsługujących pulę połączeń (np. ActiveRecord w Railsach) może po prostu otworzyć nowe połączenie z bazą danych. Jednak w niektórych przypadkach aplikacja nie będzie mogła się ponownie połączyć. Jeśli tak się stanie, możesz ponownie uruchomić aplikację heroku, aby przywrócić ją online.

Jest to jeden z powodów, dla których odradzamy uruchamianie hobbystycznych baz danych dla krytycznych aplikacji produkcyjnych. Bazy danych w wersji Standard i Premium zawierają powiadomienia o zdarzeniach związanych z przestojami i są ogólnie znacznie bardziej wydajne i stabilne. Możesz użyć pg: copy, aby przejść do planu standardowego lub premium.

Jeśli to się powtórzy, możesz spróbować udostępnić nową bazę danych (na innym serwerze) z dodatkami heroku: dodaj, a następnie użyj pg: copy, aby przenieść dane. Pamiętaj, że zasady dotyczące poziomów hobby dotyczą podstawowego planu za 9 USD, a także bezpłatnej bazy danych.

Dzięki, Bradley

Aur Saraf
źródło
1
Zastanawiam się, jaka jest odpowiedź w puszkach, gdy masz plan bazy danych o wartości 50 USD miesięcznie?
mpoisot
1
Tylko warstwy hobby używają wspólnych serwerów baz danych. Z planem 50 USD / miesiąc masz własny serwer, więc jeśli napotkasz ten problem, tworzy go Twoja własna aplikacja. Masz więcej opcji administracyjnych z planem 50 USD / miesiąc, więc łatwiej jest zdiagnozować i naprawić.
Jessamyn Smith
Czy możesz wyjaśnić, jakie opcje administracyjne są dostępne w przypadku opcji standardowej? Otrzymuję również tę wiadomość tylko z 200 połączeniami.
Pencilcheck
6

W rzeczywistości próbowałem zaimplementować buforowanie połączeń na końcu django, używając:

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

ale nadal otrzymuję ten błąd, pomimo obniżenia liczby dostępnych połączeń poniżej standardowego przydziału DB dla deweloperów wynoszącego 20 otwartych połączeń.

Jest tutaj artykuł o tym, jak przenieść bazę danych postgresql na darmową / tanią warstwę Amazon RDS. Umożliwiłoby to ustawienie max_connectionswyżej. Pozwoli to również na tworzenie pul połączeń na poziomie bazy danych za pomocą PGBouncer.

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

AKTUALIZACJA:

Heroku odpowiedział na moje otwarte zgłoszenie i stwierdził, że moja baza danych jest nieprawidłowo równoważona obciążeniem w ich sieci. Stwierdzili, że ulepszenia ich systemu powinny zapobiec podobnym problemom w przyszłości. Niemniej jednak, obsługa ręcznego przeniesienia mojej bazy danych i wydajność jest zauważalnie poprawiona.

markshiz
źródło
Myślę, że przeniesienie bazy danych jest najlepszym rozwiązaniem, aby mieć nad nią pełną kontrolę. Dzięki za ten artykuł.
nathancahill,
-3

Zrestartuj bazę danych postgres za pomocą następującego polecenia:

postgres -D /usr/local/var/postgres
Naveen Agarwal
źródło
Baza danych Postgres jest usługą hostowaną przez Heroku, więc to nie zadziała.
flurdy