Heroku «psql: FATAL: les emplacements de connexion restants sont réservés aux connexions de super-utilisateur sans réplication»

120

Je développe une application sur Heroku avec un backend Postgresql. Périodiquement, je reçois ce message d'erreur en essayant d'accéder à la base de données, à la fois à partir de la CLI et du chargement d'une page sur le serveur:

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

Quelqu'un a-t-il déjà vu cela ou aidez-moi s'il vous plaît à m'orienter dans la bonne direction?

nathancahill
la source
1
Avoir le même problème. J'ai lu quelque part que le support Heroku avait "détecté des problèmes" sur certains serveurs, et ils ont recommandé à l'utilisateur en question de provisionner une nouvelle base de données de base et d'y migrer en utilisant pgbackups. Mon problème maintenant est que l'application est si nouvelle que je n'ai pas encore créé de sauvegarde, et j'obtiens la même erreur en essayant d'en créer une bien sûr: D
André Laszlo
Pour mémoire, j'ai pu utiliser la heroku pgbackupscommande pour créer une sauvegarde malgré cette erreur.
markshiz
Pour reproduire ce problème, vous pouvez créer une grande quantité de terminaux. .batscript dans Windows pour cela: for /l %%x in (1, 1, 100) do ( start psql )100 est le nombre souhaité de backends.
koxt
J'ai eu le même problème. Je n'étais pas en mesure de transférer les données vers une nouvelle base de données en utilisant pg:backups copy, pg:backups captureen s'y connectant à partir pgAdminde mon ordinateur, ou de toute autre manière que je pouvais imaginer. Même pg:killalln'a pas aidé. Une heure plus tard, j'ai réessayé et les connexions étaient 50-50, donc après quelques tentatives, j'ai eu un succès pg:backups copyet mon application est de retour dans l'air. Ce n'était ... pas une journée amusante. Si vous avez recherché ceci sur Google, buvez une tasse d'eau.
Aur Saraf
1
Je l'ai encore une fois. Quelle chance d'avoir documenté mon expérience précédente ... Edit: cette fois, le redémarrage était suffisant.
Aur Saraf

Réponses:

56

Vous devez soit augmenter le max_connectionsparamètre de configuration, soit (probablement mieux) utiliser le pool de connexions pour acheminer un grand nombre de demandes utilisateur via un pool de connexions plus petit.

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

kgrittn
la source
14
Un problème courant est également le fait que l'application côté client se bloque et laisse les connexions ouvertes, puis en ouvre de nouvelles lorsqu'elle redémarre. Si ce genre de chose arrive souvent, vous serez à court de connexions. Ou l'application est simplement mal configurée et ouvre trop de connexions.
Scott Marlowe
5
Je ne pense pas pouvoir modifier les paramètres de configuration sur Heroku. Existe-t-il un moyen de fermer toutes les connexions ouvertes?
nathancahill
1
Espérons que le serveur est configuré pour les paquets keepalive sur une base assez agressive. Cela entraînera la fin des sessions dans un délai raisonnable si les connexions sont brusquement interrompues. Si ce n'est pas configuré, si vous pouvez vous connecter en tant que superutilisateur de la base de données, vous pouvez identifier les pidvaleurs des sessions et utiliser la pg_terminate_backend()fonction pour les supprimer. Pour éviter le problème, assurez-vous de fermer correctement les connexions plutôt que de tuer brusquement le côté client.
kgrittn
@nathancahill Mettre fin à toutes les connexions à la base de données:heroku pg:killall
Roko
9

Cette exception s'est produite lorsque j'ai oublié de fermer les connexions

Sanyifejű
la source
7

Voir Heroku «psql: FATAL: les emplacements de connexion restants sont réservés aux connexions de super-utilisateur sans réplication» :

Heroku a parfois un problème avec l'équilibrage de la charge de la base de données.

André Laszlo, markshizet moi avons tous déclaré avoir traité de cela dans les commentaires sur la question.

Pour vous éviter l'appel au support, voici la réponse que j'ai reçue du support Heroku pour un problème similaire:

Bonjour,

L'une des limites des bases de données de niveau hobby est la maintenance inopinée. De nombreuses bases de données de loisirs fonctionnent sur un seul serveur partagé, et nous devrons parfois redémarrer ce serveur à des fins de maintenance matérielle ou migrer les bases de données vers un autre serveur pour l'équilibrage de la charge. Lorsque cela se produit, vous verrez une erreur dans vos journaux ou des problèmes de connexion. Si le serveur redémarre, la remise en ligne de la base de données peut prendre 15 minutes ou plus.

La plupart des applications qui maintiennent un pool de connexions (comme ActiveRecord dans Rails) peuvent simplement ouvrir une nouvelle connexion à la base de données. Cependant, dans certains cas, une application ne pourra pas se reconnecter. Si cela se produit, vous pouvez redémarrer heroku votre application pour la remettre en ligne.

C'est l'une des raisons pour lesquelles nous vous déconseillons d'exécuter des bases de données de loisirs pour les applications de production critiques. Les bases de données Standard et Premium incluent des notifications pour les événements de temps d'arrêt et sont beaucoup plus performantes et stables en général. Vous pouvez utiliser pg: copy pour migrer vers un plan standard ou premium.

Si cela continue, vous pouvez essayer de provisionner une nouvelle base de données (sur un serveur différent) avec les addons heroku: add, puis utilisez pg: copy pour déplacer les données. Gardez à l'esprit que les règles du niveau hobby s'appliquent au plan de base à 9 $ ainsi qu'à la base de données gratuite.

Merci, Bradley

Aur Saraf
la source
1
Je me demande quelle est la réponse standardisée lorsque vous êtes sur un plan de base de données de 50 $ / mois?
mpoisot
1
Seuls les niveaux de loisirs utilisent des serveurs de base de données partagés. Avec le plan de 50 $ / mois, vous avez votre propre serveur, donc si vous rencontrez ce problème, c'est votre propre application qui le crée. Vous disposez de plus d'options administratives avec le plan de 50 $ / mois, ce qui facilite le diagnostic et la résolution.
Jessamyn Smith le
Pouvez-vous expliquer quelles sont les options administratives que vous pouvez utiliser avec l'option standard? Vous recevez également ce message avec seulement 200 connexions.
Pencilcheck
6

J'ai en fait essayé d'implémenter le regroupement de connexions à la fin de django en utilisant:

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

mais j'ai toujours reçu cette erreur, malgré la réduction du nombre de connexions disponibles en dessous du quota de base de données de développement standard de 20 connexions ouvertes.

Il y a un article ici sur la façon de déplacer votre base de données postgresql vers le niveau gratuit / bon marché d'Amazon RDS. Cela vous permettrait de définir max_connectionsplus haut. Cela vous permettra également de regrouper les connexions au niveau de la base de données en utilisant PGBouncer.

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

METTRE À JOUR:

Heroku a répondu à mon ticket ouvert et a déclaré que ma base de données était mal équilibrée dans leur réseau. Ils ont déclaré que les améliorations apportées à leur système devraient éviter des problèmes similaires à l'avenir. Néanmoins, le support a déplacé manuellement ma base de données et les performances sont sensiblement améliorées.

Markshiz
la source
Je pense que déplacer la base de données est la meilleure solution pour avoir un contrôle total dessus. Merci pour cet article.
nathancahill
-3

Redémarrez votre base de données postgres en suivant la commande:

postgres -D /usr/local/var/postgres
Naveen Agarwal
la source
Postgres DB est un service hébergé par Heroku, donc cela ne fonctionnera pas.
flurdy