web-dev-qa-db-fra.com

Heroku "psql: FATAL: les logements de connexion restants sont réservés aux connexions de superutilisateur sans réplication"

Je développe une application sur Heroku avec un backend Postgresql. Périodiquement, je reçois ce message d'erreur lorsque j'essaie d'accéder à la base de données, à 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 déjà vu cela auparavant ou peut me diriger dans la bonne direction?

83
nathancahill

Vous devez soit augmenter le paramètre de configuration max_connections, soit (probablement mieux) utiliser le regroupement de connexions pour acheminer un grand nombre de demandes d'utilisateurs via un pool de connexions plus petit.

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

40
kgrittn

Voir Heroku «psql: FATAL: les logements de connexion restants sont réservés aux connexions de superutilisateur sans réplication» :

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

André Laszlo, markshiz et moi-même avons tous signalé avoir traité cette question dans des commentaires sur la question.

Pour vous sauver l'appel de support, voici la réponse que j'ai obtenue de l'assistance Heroku pour un problème similaire:

Bonjour,

Une des limitations des bases de données de niveau hobby est la maintenance non annoncée. De nombreuses bases de données de loisirs s'exécutent sur un seul serveur partagé. Nous devrons parfois devoir redémarrer ce serveur à des fins de maintenance du matériel ou migrer des bases de données vers un autre serveur pour équilibrer la charge. Lorsque cela se produit, vous constaterez une erreur dans vos journaux ou rencontrez des problèmes de connexion. Si le serveur est en cours de redémarrage, le délai de remise en ligne de la base de données peut prendre 15 minutes ou plus.

La plupart des applications qui gèrent 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, heroku peut redémarrer votre application pour la remettre en ligne.

C'est l'une des raisons pour lesquelles nous recommandons de ne pas exécuter de bases de données de loisir pour des applications de production critiques. Les bases de données Standard et Premium incluent des notifications pour les temps d'arrêt. Elles 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 autre serveur) avec les add-on heroku: add, puis utilisez pg: copy pour déplacer les données. N'oubliez pas que les règles de niveau loisirs s'appliquent au plan de base à 9 $ ainsi qu'à la base de données gratuite.

Merci, Bradley

6
Aur Saraf

cette exception est arrivée quand j'ai oublié de fermer les connexions

4
Sanyifejű

En fait, j'ai essayé d'implémenter le pooling de connexion sur le terminal Django en utilisant:

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

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

Vous trouverez ici un article sur la migration de votre base de données postgresql vers le niveau gratuit/pas cher d’Amazon EC2. Cela vous permettrait de définir max_connections plus élevé. Cela vous permettra également de regrouper les connexions au niveau de la base de données à l'aide de PGBouncer.

http://www.askthepony.com/blog/2011/07/getting-Django-on-heroku-prancing-8-times-faster/

METTRE À JOUR:

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

3
markshiz

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

postgres -D /usr/local/var/postgres
0
Naveen Agarwal