Heroku "psql: FATAL: las ranuras de conexión restantes están reservadas para conexiones de superusuario sin replicación"

120

Estoy desarrollando una aplicación en Heroku con un backend de Postgresql. Periódicamente, recibo este mensaje de error cuando intento acceder a la base de datos, tanto desde la CLI como al cargar una página en el servidor:

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

¿Alguien ha visto esto antes o, por favor, ayúdeme a indicarme la dirección correcta?

Nathancahill
fuente
1
Tener el mismo problema. Leí en alguna parte que el soporte de Heroku había "detectado algunos problemas" en algunos servidores, y recomendaron al usuario en cuestión que aprovisionara una nueva base de datos básica y migrara a ella usando pgbackups. Mi problema ahora es que la aplicación es tan nueva que todavía no he creado una copia de seguridad y, por supuesto, aparece el mismo error al intentar crear una: D
André Laszlo
Para que conste, pude usar el heroku pgbackupscomando para crear una copia de seguridad a pesar de este error.
markshiz
Para reproducir este problema puede crear una gran cantidad de terminales. .batscript en Windows para esto: for /l %%x in (1, 1, 100) do ( start psql )donde 100 es el número deseado de backends.
koxt
Yo tuve el mismo problema. No pude transferir los datos a una nueva base de datos usando pg:backups copy, pg:backups captureconectándome a ella desde pgAdminmi propia computadora, o de cualquier otra forma que pudiera imaginar. Incluso pg:killallno ayudó. Una hora más tarde, lo intenté de nuevo y las conexiones eran 50-50, así que después de algunos intentos tuve un éxito pg:backups copyy mi aplicación volvió a estar en el aire. Este ... no fue un día divertido. Si buscaste esto en Google, bebe una taza de agua.
Aur Saraf
1
Ahora estoy teniendo esto de nuevo. Qué suerte haber documentado mi experiencia anterior ... Editar: esta vez reiniciar fue suficiente.
Aur Saraf

Respuestas:

56

Necesita aumentar la max_connectionsconfiguración o (probablemente mejor) usar la agrupación de conexiones para enrutar una gran cantidad de solicitudes de usuario a través de una agrupación de conexiones más pequeña.

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

kgrittn
fuente
14
También un problema común es algo así como que la aplicación del lado del cliente se bloquea y deja las conexiones abiertas y luego abre nuevas cuando se reinicia. Si este tipo de cosas sucede mucho, se quedará sin conexiones. O la aplicación simplemente está configurada incorrectamente y abre demasiadas conexiones.
Scott Marlowe
5
No creo que pueda cambiar los ajustes de configuración en Heroku. ¿Hay alguna forma de cerrar todas las conexiones abiertas?
nathancahill
1
Es de esperar que el servidor esté configurado para paquetes keepalive de manera bastante agresiva. Esto hará que las sesiones terminen en un tiempo razonable si las conexiones se rompen abruptamente. Si no está configurado, si puede iniciar sesión como superusuario de la base de datos, puede identificar los pidvalores de las sesiones y usar la pg_terminate_backend()función para eliminarlas. Para evitar el problema, asegúrese de cerrar las conexiones correctamente en lugar de eliminar abruptamente el lado del cliente.
kgrittn
@nathancahill Termina todas las conexiones a la base de datos:heroku pg:killall
Roko
9

Esta excepción ocurrió cuando olvidé cerrar las conexiones.

Sanyifejű
fuente
7

Consulte Heroku “psql: FATAL: las ranuras de conexión restantes están reservadas para conexiones de superusuario sin replicación” :

Heroku a veces tiene problemas con el equilibrio de carga de la base de datos.

André Laszlo, markshizy yo todos informamos haber lidiado con eso en los comentarios sobre la pregunta.

Para ahorrarle la llamada de soporte, aquí está la respuesta que recibí del Soporte de Heroku para un problema similar:

Hola,

Una de las limitaciones de las bases de datos de nivel de afición es el mantenimiento sin previo aviso. Muchas bases de datos de pasatiempos se ejecutan en un solo servidor compartido y, ocasionalmente, necesitaremos reiniciar ese servidor para fines de mantenimiento de hardware o migrar las bases de datos a otro servidor para equilibrar la carga. Cuando eso suceda, verá un error en sus registros o tendrá problemas para conectarse. Si el servidor se está reiniciando, la base de datos puede tardar 15 minutos o más en volver a estar en línea.

La mayoría de las aplicaciones que mantienen un grupo de conexiones (como ActiveRecord en Rails) pueden simplemente abrir una nueva conexión a la base de datos. Sin embargo, en algunos casos, una aplicación no podrá volver a conectarse. Si eso sucede, puede reiniciar heroku su aplicación para volver a ponerla en línea.

Esta es una de las razones por las que recomendamos no ejecutar bases de datos de aficiones para aplicaciones críticas de producción. Las bases de datos estándar y premium incluyen notificaciones de eventos de tiempo de inactividad y son mucho más eficaces y estables en general. Puede usar pg: copy para migrar a un plan estándar o premium.

Si esto continúa, puede intentar aprovisionar una nueva base de datos (en un servidor diferente) con complementos heroku: agregar, luego usar pg: copy para mover los datos. Tenga en cuenta que las reglas del nivel de pasatiempo se aplican al plan básico de $ 9, así como a la base de datos gratuita.

Gracias Bradley

Aur Saraf
fuente
1
Me pregunto cuál es la respuesta predefinida cuando tiene un plan de base de datos de $ 50 al mes.
mpoisot
1
Solo los niveles de afición utilizan servidores de bases de datos compartidos. Con el plan de $ 50 / mes, tiene su propio servidor, por lo que si se encuentra con este problema, es su propia aplicación la que lo crea. Tiene más opciones administrativas con el plan de $ 50 / mes, por lo que es más fácil de diagnosticar y corregir.
Jessamyn Smith
¿Puede explicar cuáles son las opciones administrativas que puede tener con la opción estándar? También recibiendo este mensaje con solo 200 conexiones.
Pencilcheck
6

De hecho, intenté implementar la agrupación de conexiones en el extremo de django usando:

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

pero todavía recibí este error, a pesar de reducir el número de conexiones disponibles por debajo de la cuota de DB de desarrollo estándar de 20 conexiones abiertas.

Aquí hay un artículo sobre cómo mover su base de datos postgresql al nivel gratuito / barato de Amazon RDS. Esto le permitiría establecer max_connectionsun valor más alto. Esto también le permitirá agrupar conexiones a nivel de base de datos usando PGBouncer.

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

ACTUALIZAR:

Heroku respondió a mi ticket abierto y dijo que mi base de datos estaba mal balanceada en su red. Dijeron que las mejoras en su sistema deberían evitar problemas similares en el futuro. No obstante, el soporte reubicó manualmente mi base de datos y el rendimiento ha mejorado notablemente.

Markhiz
fuente
Creo que mover la base de datos es la mejor solución para tener un control total sobre ella. Gracias por ese articulo.
nathancahill
-3

Reinicie su base de datos de postgres con el siguiente comando:

postgres -D /usr/local/var/postgres
Naveen Agarwal
fuente
La base de datos de Postgres es un servicio alojado por Heroku, por lo que esto no funcionará.
Flurdy