Heroku "psql: FATAL: gli slot di connessione rimanenti sono riservati per le connessioni di superutente non di replica"


120

Sto sviluppando un'app su Heroku con un backend Postgresql. Periodicamente, ricevo questo messaggio di errore quando provo ad accedere al database, sia dalla CLI che dal caricamento di una pagina sul server:

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

Qualcuno l'ha visto prima o per favore aiutami a indicarmi la giusta direzione?


1
Avendo lo stesso problema. Ho letto da qualche parte che il supporto Heroku aveva "rilevato alcuni problemi" su alcuni server e hanno consigliato all'utente in questione di fornire un nuovo database di base e migrare ad esso utilizzando pgbackups. Il mio problema ora è che l'app è così nuova che non ho ancora creato un backup e ottengo lo stesso errore provando a crearne uno ovviamente: D
André Laszlo

Per la cronaca, sono stato in grado di utilizzare il heroku pgbackupscomando per creare un backup nonostante questo errore.
Markshiz

Per riprodurre questo problema puoi creare una grande quantità di terminali. .batscript in Windows per questo: for /l %%x in (1, 1, 100) do ( start psql )dove 100 è il numero di backend desiderato.
koxt

Ho avuto lo stesso problema. Non sono stato in grado di trasferire i dati a un nuovo database utilizzando pg:backups copy, pg:backups capturecollegandomi ad esso dal pgAdminmio computer o in qualsiasi altro modo che potessi immaginare. Anche pg:killallnon ha aiutato. Un'ora dopo, ho riprovato e le connessioni erano 50-50, quindi dopo alcuni tentativi ho avuto successo pg:backups copye la mia app è tornata in aria. Non è stata ... una giornata divertente. Se hai cercato su Google, bevi una tazza d'acqua.
Aur Saraf

1
Ora lo sto facendo di nuovo. Che fortuna aver documentato la mia precedente esperienza ... Modifica: questa volta è stato sufficiente il riavvio.
Aur Saraf

Risposte:


56

È necessario aumentare l' max_connectionsimpostazione di configurazione o (probabilmente meglio) utilizzare il pool di connessioni per instradare un numero elevato di richieste utente attraverso un pool di connessioni più piccolo.

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


14
Inoltre, un problema comune è qualcosa di simile all'arresto anomalo dell'app lato client che lascia le connessioni aperte e quindi ne apre di nuove al riavvio. Se questo genere di cose accade spesso, finirai le connessioni. Oppure l'app è configurata in modo errato e apre troppe connessioni.
Scott Marlowe

5
Non credo di poter modificare le impostazioni di configurazione su Heroku. C'è un modo per chiudere tutte le connessioni aperte?
nathancahill

1
Si spera che il server sia configurato per i pacchetti keepalive su una base piuttosto aggressiva. Ciò causerà la chiusura delle sessioni in un tempo ragionevole se le connessioni vengono interrotte improvvisamente. Se non è configurato, se puoi accedere come superutente del database puoi identificare i pidvalori per le sessioni e utilizzare la pg_terminate_backend()funzione per ucciderli. Per evitare il problema, assicurati di chiudere le connessioni correttamente piuttosto che uccidere bruscamente il lato client.
kgrittn

@nathancahill Termina tutte le connessioni al database:heroku pg:killall
Roko

9

Questa eccezione è avvenuta quando ho dimenticato di chiudere le connessioni


7

Vedi Heroku "psql: FATAL: gli slot di connessione rimanenti sono riservati per connessioni di superutente non di replica" :

Heroku a volte ha un problema con il bilanciamento del carico del database.

André Laszlo, markshize io tutti ho riferito di averlo affrontato nei commenti sulla domanda.

Per salvarti la chiamata di supporto, ecco la risposta che ho ricevuto dal supporto Heroku per un problema simile:

Ciao,

Uno dei limiti dei database di livello hobby è la manutenzione senza preavviso. Molti database per hobby vengono eseguiti su un singolo server condiviso e occasionalmente avremo bisogno di riavviare quel server per scopi di manutenzione dell'hardware o migrare i database su un altro server per il bilanciamento del carico. Quando ciò accade, vedrai un errore nei tuoi log o avrai problemi di connessione. Se il server viene riavviato, potrebbero essere necessari 15 minuti o più prima che il database torni in linea.

La maggior parte delle app che mantengono un pool di connessioni (come ActiveRecord in Rails) possono semplicemente aprire una nuova connessione al database. Tuttavia, in alcuni casi un'app non sarà in grado di riconnettersi. Se ciò accade, puoi heroku riavviare la tua app per riportarla online.

Questo è uno dei motivi per cui sconsigliamo di eseguire database per hobby per applicazioni di produzione critiche. I database Standard e Premium includono notifiche per eventi di inattività e sono molto più performanti e stabili in generale. Puoi utilizzare pg: copy per migrare a un piano standard o premium.

Se continua, puoi provare a eseguire il provisioning di un nuovo database (su un server diverso) con heroku addons: add, quindi usa pg: copy per spostare i dati. Tieni presente che le regole del livello hobby si applicano al piano di base da $ 9 e al database gratuito.

Grazie, Bradley


1
Mi chiedo quale sia la risposta predefinita quando hai un piano di database da $ 50 / mese?
mpoisot

1
Solo i livelli hobby utilizzano server di database condivisi. Con il piano da $ 50 / mese hai il tuo server, quindi se stai riscontrando questo problema, è la tua app a crearlo. Hai più opzioni amministrative con il piano da $ 50 / mese, quindi è più facile diagnosticare e correggere.
Jessamyn Smith

Puoi spiegare quali sono le opzioni amministrative possibili con l'opzione standard? Ricevo anche questo messaggio con solo 200 connessioni.
Pencilcheck

6

In realtà ho provato a implementare il pool di connessioni sul terminale django usando:

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

ma ho ancora ricevuto questo errore, nonostante l'abbassamento del numero di connessioni disponibili al di sotto della quota del DB di sviluppo standard di 20 connessioni aperte.

C'è un articolo qui su come spostare il database postgresql nel livello gratuito / economico di Amazon RDS. Questo ti consentirebbe di impostare un valore max_connectionspiù alto. Ciò consentirà anche di raggruppare le connessioni a livello di database utilizzando PGBouncer.

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

AGGIORNARE:

Heroku ha risposto al mio ticket aperto e ha affermato che il mio database era bilanciato in modo errato nel carico della loro rete. Hanno detto che i miglioramenti al loro sistema dovrebbero prevenire problemi simili in futuro. Tuttavia, il supporto ha riposizionato manualmente il mio database e le prestazioni sono notevolmente migliorate.


Penso che spostare il database sia la soluzione migliore per avere il pieno controllo su di esso. Grazie per l'articolo.
nathancahill

-3

Riavvia il tuo database postgres seguendo il comando:

postgres -D /usr/local/var/postgres

Il Postgres DB è un servizio ospitato da Heroku, quindi non funzionerà.
impetuoso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.