Heroku "psql: FATAL: Die verbleibenden Verbindungssteckplätze sind für Superuser-Verbindungen ohne Replikation reserviert."

120

Ich entwickle eine App auf Heroku mit einem Postgresql-Backend. In regelmäßigen Abständen wird diese Fehlermeldung angezeigt, wenn ich versuche, auf die Datenbank zuzugreifen, sowohl über die CLI als auch beim Laden einer Seite auf den Server:

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

Hat jemand das schon einmal gesehen oder bitte helfen Sie mir, in die richtige Richtung zu weisen?

Nathancahill
quelle
1
Das gleiche Problem haben. Ich habe irgendwo gelesen, dass der Heroku-Support auf einigen Servern "einige Probleme festgestellt" hat, und sie haben dem betreffenden Benutzer empfohlen, eine neue Basisdatenbank bereitzustellen und mithilfe von pgbackups darauf zu migrieren. Mein Problem ist jetzt, dass die App so neu ist, dass ich noch kein Backup erstellt habe, und ich erhalte den gleichen Fehler beim Versuch, eines zu erstellen: D
André Laszlo
heroku pgbackupsTrotz dieses Fehlers konnte ich mit dem Befehl ein Backup erstellen.
Markshiz
Um dieses Problem zu reproduzieren, können Sie eine große Anzahl von Terminals erstellen. .batSkript in Windows dafür: for /l %%x in (1, 1, 100) do ( start psql )wobei 100 die gewünschte Anzahl von Backends ist.
Koxt
Ich hatte das gleiche Problem. Ich war nicht in der Lage , die Daten in eine neue Datenbank mit zu übertragen pg:backups copy, pg:backups capturedurch von ihm verbindet pgAdminauf meinem eigenen Computer oder irgendeine andere Art und Weise ich mir vorstellen konnte. Auch pg:killallhat nicht geholfen. Eine Stunde später versuchte ich es erneut und die Verbindungen waren 50-50. Nach einigen Versuchen hatte ich einen Erfolg pg:backups copyund meine App ist wieder in der Luft. Dies war ... kein lustiger Tag. Wenn Sie dies gegoogelt haben, trinken Sie eine Tasse Wasser.
Aur Saraf
1
Ich habe das jetzt wieder. Wie glücklich, meine bisherigen Erfahrungen dokumentiert zu haben ... Bearbeiten: Diesmal war ein Neustart ausreichend.
Aur Saraf

Antworten:

56

Sie müssen entweder die max_connectionsKonfigurationseinstellung erhöhen oder (wahrscheinlich besser) das Verbindungspooling verwenden , um eine große Anzahl von Benutzeranforderungen über einen kleineren Verbindungspool weiterzuleiten.

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

kgrittn
quelle
14
Ein häufiges Problem ist auch, dass die clientseitige App abstürzt und Verbindungen offen lässt und beim Neustart neue öffnet. Wenn so etwas häufig vorkommt, gehen Ihnen die Verbindungen aus. Oder die App ist einfach falsch konfiguriert und öffnet zu viele Verbindungen.
Scott Marlowe
5
Ich glaube nicht, dass ich die Konfigurationseinstellungen auf Heroku ändern kann. Gibt es eine Möglichkeit, alle offenen Verbindungen zu schließen?
Nathancahill
1
Hoffentlich ist der Server ziemlich aggressiv für Keepalive-Pakete konfiguriert. Dies führt dazu, dass Sitzungen in angemessener Zeit beendet werden, wenn die Verbindungen abrupt unterbrochen werden. Wenn dies nicht konfiguriert ist und Sie sich als Datenbank-Superuser anmelden können, können Sie die pidWerte für die Sitzungen identifizieren und die pg_terminate_backend()Funktion verwenden, um sie zu beenden. Um das Problem zu vermeiden, stellen Sie sicher, dass die Verbindungen ordnungsgemäß geschlossen werden, anstatt die Clientseite abrupt zu beenden.
kgrittn
@nathancahill Beenden Sie alle Verbindungen zur Datenbank:heroku pg:killall
Roko
9

Diese Ausnahme trat auf, als ich vergaß, die Verbindungen zu schließen

Sanyifejű
quelle
7

Siehe Heroku „psql: FATAL: Die verbleibenden Verbindungssteckplätze sind für Superuser-Verbindungen ohne Replikation reserviert“ :

Heroku hat manchmal ein Problem mit dem Lastausgleich der Datenbank.

André Laszlo, markshizUnd ich alle berichten in den Kommentaren zu der Frage mit dem Umgang.

Um Ihnen den Support-Anruf zu ersparen, habe ich vom Heroku-Support eine Antwort auf ein ähnliches Problem erhalten:

Hallo,

Eine der Einschränkungen der Hobby-Tier-Datenbanken ist die unangekündigte Wartung. Viele Hobby-Datenbanken werden auf einem einzelnen gemeinsam genutzten Server ausgeführt. Gelegentlich müssen wir diesen Server für Hardware-Wartungszwecke neu starten oder Datenbanken zum Lastenausgleich auf einen anderen Server migrieren. In diesem Fall wird in Ihren Protokollen ein Fehler angezeigt oder es treten Verbindungsprobleme auf. Wenn der Server neu gestartet wird, kann es 15 Minuten oder länger dauern, bis die Datenbank wieder online ist.

Die meisten Apps, die einen Verbindungspool verwalten (wie ActiveRecord in Rails), können einfach eine neue Verbindung zur Datenbank herstellen. In einigen Fällen kann eine App jedoch keine Verbindung mehr herstellen. In diesem Fall können Sie Ihre App neu starten, um sie wieder online zu schalten.

Dies ist einer der Gründe, warum wir davon abraten, Hobby-Datenbanken für kritische Produktionsanwendungen auszuführen. Standard- und Premium-Datenbanken enthalten Benachrichtigungen für Ausfallzeiten und sind im Allgemeinen viel leistungsfähiger und stabiler. Mit pg: copy können Sie zu einem Standard- oder Premium-Plan migrieren.

Wenn dies so weitergeht, können Sie versuchen, eine neue Datenbank (auf einem anderen Server) mit Heroku-Addons bereitzustellen: add, und verwenden Sie dann pg: copy, um die Daten zu verschieben. Beachten Sie, dass die Hobby-Tier-Regeln sowohl für den 9-Dollar-Basisplan als auch für die kostenlose Datenbank gelten.

Danke, Bradley

Aur Saraf
quelle
1
Ich frage mich, wie die Antwort lautet, wenn Sie einen Datenbankplan für 50 US-Dollar pro Monat haben.
Mpoisot
1
Nur die Hobbyebenen verwenden gemeinsam genutzte Datenbankserver. Mit dem $ 50 / Monat-Plan haben Sie Ihren eigenen Server. Wenn Sie also auf dieses Problem stoßen, ist es Ihre eigene App, die es erstellt. Mit dem 50-Dollar / Monat-Plan haben Sie mehr Verwaltungsoptionen, sodass die Diagnose und Behebung einfacher ist.
Jessamyn Smith
Können Sie erklären, welche administrativen Optionen Sie mit der Standardoption haben können? Diese Nachricht wird auch mit nur 200 Verbindungen angezeigt.
Pencilcheck
6

Ich habe tatsächlich versucht, das Verbindungspooling auf der Django-Seite zu implementieren, indem ich:

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

Ich habe diesen Fehler dennoch erhalten, obwohl die Anzahl der verfügbaren Verbindungen unter das Standard-Entwicklungs-DB-Kontingent von 20 offenen Verbindungen gesenkt wurde.

Hier finden Sie einen Artikel darüber, wie Sie Ihre Postgresql-Datenbank auf die kostenlose / günstige Stufe von Amazon RDS verschieben können. Dies würde es Ihnen ermöglichen, max_connectionshöher einzustellen . Auf diese Weise können Sie auch Verbindungen auf Datenbankebene mit PGBouncer bündeln.

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

AKTUALISIEREN:

Heroku antwortete auf mein offenes Ticket und gab an, dass meine Datenbank in ihrem Netzwerk nicht ordnungsgemäß ausgeglichen war. Sie sagten, dass Verbesserungen an ihrem System ähnliche Probleme in Zukunft verhindern sollten. Trotzdem hat der Support meine Datenbank manuell verschoben und die Leistung wird spürbar verbessert.

Markshiz
quelle
Ich denke, das Verschieben der Datenbank ist die beste Lösung, um die volle Kontrolle darüber zu haben. Danke für diesen Artikel.
Nathancahill
-3

Starten Sie Ihre Postgres-Datenbank mit dem folgenden Befehl neu:

postgres -D /usr/local/var/postgres
Naveen Agarwal
quelle
Die Postgres-Datenbank wird von Heroku gehostet, daher funktioniert dies nicht.
Unruhiger