Heroku “psql: FATAL: os slots de conexão restantes são reservados para conexões de superusuário sem replicação”

120

Estou desenvolvendo um aplicativo no Heroku com um back-end Postgresql. Periodicamente, recebo esta mensagem de erro ao tentar acessar o banco de dados, tanto da CLI quanto ao carregar uma página no servidor:

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

Alguém viu isso antes ou por favor me ajude a apontar na direção certa?

Nathancahill
fonte
1
Tendo o mesmo problema. Li em algum lugar que o suporte do Heroku "detectou alguns problemas" em alguns servidores e recomendou ao usuário em questão que provisionasse um novo banco de dados básico e migrasse para ele usando pgbackups. Meu problema agora é que o aplicativo é tão novo que ainda não criei um backup, e recebo o mesmo erro ao tentar criar um claro: D
André Laszlo
Só para constar, consegui usar o heroku pgbackupscomando para criar um backup, apesar desse erro.
markhiz
Para reproduzir este problema, você pode criar uma grande quantidade de terminais. .batscript no Windows para isso: for /l %%x in (1, 1, 100) do ( start psql )onde 100 é o número desejado de back-ends.
koxt
Eu tive o mesmo problema. Eu não era capaz de transferir os dados para um novo banco de dados usando pg:backups copy, pg:backups capture, conectando-se a ele a partir pgAdmindo meu próprio computador, ou qualquer outra maneira que eu poderia imaginar. Mesmo pg:killallnão ajudou. Uma hora depois, tentei novamente e as conexões estavam em 50-50, então, depois de algumas tentativas, obtive um sucesso pg:backups copye meu aplicativo voltou ao ar. Este não foi ... um dia divertido. Se você pesquisou isso, beba um copo d'água.
Aur Saraf de
1
Agora estou tendo isso de novo. Que sorte de ter documentado minha experiência anterior ... Edit: desta vez, reiniciar foi o suficiente.
Aur Saraf de

Respostas:

56

Você precisa aumentar a max_connectionsdefinição de configuração ou (provavelmente melhor) usar o pool de conexão para rotear um grande número de solicitações do usuário por meio de um pool de conexão menor.

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

kgrittn
fonte
14
Também um problema comum é algo como o aplicativo do lado do cliente travar e deixar conexões abertas e, em seguida, abrir novas quando for reiniciado. Se esse tipo de coisa acontecer com frequência, você ficará sem conexões. Ou o aplicativo está configurado incorretamente e abre muitas conexões.
Scott Marlowe
5
Não acho que posso alterar as configurações do Heroku. Existe uma maneira de fechar todas as conexões abertas?
nathancahill
1
Esperançosamente, o servidor está configurado para pacotes de manutenção de atividade em uma base bastante agressiva. Isso fará com que as sessões sejam encerradas em um tempo razoável se as conexões forem interrompidas abruptamente. Se isso não estiver configurado, se você puder fazer login como um superusuário do banco de dados, poderá identificar os pidvalores para as sessões e usar a pg_terminate_backend()função para eliminá-los. Para evitar o problema, certifique-se de fechar as conexões corretamente, em vez de encerrar abruptamente o lado do cliente.
kgrittn
@nathancahill Encerrar todas as conexões com o banco de dados:heroku pg:killall
Roko
9

Essa exceção aconteceu quando eu esqueci de fechar as conexões

Sanyifejű
fonte
7

Consulte Heroku “psql: FATAL: os slots de conexão restantes são reservados para conexões de superusuário sem replicação” :

O Heroku às vezes tem problemas com o balanceamento de carga do banco de dados.

André Laszlo, markshize todos nós relatamos lidar com isso em comentários sobre a questão.

Para evitar a chamada de suporte, aqui está a resposta que recebi do Suporte do Heroku para um problema semelhante:

Olá,

Uma das limitações dos bancos de dados da camada de passatempo é a manutenção sem aviso prévio. Muitos bancos de dados de hobby são executados em um único servidor compartilhado e, ocasionalmente, precisaremos reiniciar esse servidor para fins de manutenção de hardware ou migrar bancos de dados para outro servidor para balanceamento de carga. Quando isso acontecer, você verá um erro em seus registros ou terá problemas para se conectar. Se o servidor estiver reiniciando, pode levar 15 minutos ou mais para o banco de dados ficar online novamente.

A maioria dos aplicativos que mantêm um pool de conexão (como ActiveRecord no Rails) pode simplesmente abrir uma nova conexão com o banco de dados. No entanto, em alguns casos, um aplicativo não será capaz de se reconectar. Se isso acontecer, você pode reiniciar seu aplicativo para colocá-lo online novamente.

Esse é um dos motivos pelos quais não recomendamos a execução de bancos de dados de hobby para aplicativos de produção críticos. Os bancos de dados Standard e Premium incluem notificações para eventos de tempo de inatividade e são muito mais eficientes e estáveis ​​em geral. Você pode usar pg: copy para migrar para um plano padrão ou premium.

Se isso continuar, você pode tentar provisionar um novo banco de dados (em um servidor diferente) com addons heroku: add e, em seguida, use pg: copy para mover os dados. Lembre-se de que as regras da camada de hobby se aplicam ao plano básico de $ 9, bem como ao banco de dados gratuito.

Obrigado bradley

Aur Saraf
fonte
1
Eu me pergunto qual é a resposta automática quando você está em um plano de banco de dados de $ 50 / mês?
mpoisot
1
Apenas as camadas de hobby usam servidores de banco de dados compartilhados. Com o plano de $ 50 / mês, você tem seu próprio servidor, então se você estiver tendo esse problema, é seu próprio aplicativo criando-o. Você tem mais opções administrativas com o plano de $ 50 / mês, então é mais fácil de diagnosticar e corrigir.
Jessamyn Smith
Você pode explicar quais são as opções administrativas que você pode com a opção padrão? Também estou recebendo esta mensagem com apenas 200 conexões.
Pencilcheck
6

Na verdade, tentei implementar o pool de conexão na extremidade do Django usando:

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

mas ainda recebi esse erro, apesar de diminuir o número de conexões disponíveis abaixo da cota de banco de dados de desenvolvimento padrão de 20 conexões abertas.

Há um artigo aqui sobre como mover seu banco de dados postgresql para o nível gratuito / barato do Amazon RDS. Isso permitiria que você definisse max_connectionsmais alto. Isso também permitirá que você agrupe conexões no nível do banco de dados usando o PGBouncer.

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

ATUALIZAR:

Heroku respondeu ao meu tíquete aberto e afirmou que meu banco de dados estava com balanceamento de carga incorreto em sua rede. Eles disseram que as melhorias em seu sistema devem evitar problemas semelhantes no futuro. No entanto, o suporte realocou manualmente meu banco de dados e o desempenho melhorou visivelmente.

Markshiz
fonte
Acho que mover o banco de dados é a melhor solução para ter controle total sobre ele. Obrigado por esse artigo.
nathancahill
-3

Reinicie seu banco de dados postgres seguindo o comando:

postgres -D /usr/local/var/postgres
Naveen Agarwal
fonte
O Postgres DB é um serviço hospedado pelo Heroku, então não funcionará.
flurdy