Gerenciando Conexões
As conexões com sua implantação do Databases for PostgreSQL utilizam recursos; portanto, é importante avaliar quantas conexões você precisa para otimizar o desempenho da sua implantação. O PostgreSQL usa uma configuração max_connections para limitar o número de conexões (e de recursos consumidos pelas conexões) para evitar que o comportamento de conexão fugitivo sobrecarregue os recursos de sua implementação.
É possível verificar o valor de max_connections com seu usuário administrativo e psql.
ibmclouddb=> SHOW max_connections;
max_connections
-----------------
115
(1 row)
limites de conexão
No fornecimento, o Databases for PostgreSQL configura o número máximo de conexões para o seu banco de dados PostgreSQL para 115. São reservadas 15 conexões para que o superusuário mantenha o estado e a integridade do seu banco de dados, sendo que 100 conexões estão disponíveis para você e seus aplicativos. Se o número de conexões com o banco de dados ultrapassar o limite de 100 conexões, as novas conexões falharão e retornarão um erro.
FATAL: remaining connection slots are reserved for
non-replication superuser connections
Exceder o limite de conexão para sua implementação pode fazer com que seu banco de dados fique inacessível por seus aplicativos.
É possível verificar o número de conexões com sua implementação com o usuário administrativo, o psql e o pg_stat_database.
SELECT count(distinct(numbackends)) FROM pg_stat_database;
Se for necessário descobrir para onde as conexões estão indo, será possível dividi-las por banco de dados.
SELECT datname, numbackends FROM pg_stat_database;
Para investigar ainda mais as conexões com um banco de dados específico, consulte pg_stat_activity.
SELECT * FROM pg_stat_activity WHERE datname='ibmclouddb';
finalizando conexões
Seu usuário administrativo tem a função pg_signal_backend. Caso encontre conexões que precisem ser reiniciadas ou encerradas, o usuário administrador pode utilizar tanto pg_cancel_backend quanto pg_terminate_backend. O pid de um processo é localizado na tabela pg_stat_activity.
-
pg_cancel_backendcancela a consulta atual de uma conexão sem finalizar a conexão e sem parar outras consultas que possam estar sendo executadas.SELECT pg_cancel_backend(pid); -
pg_terminate_backendpara o processo inteiro e fecha a conexão.SELECT pg_terminate_backend(pid);
O usuário administrativo tem o poder de reconfigurar ou fechar as conexões de qualquer usuário na implementação, exceto os superusuários. Tenha cuidado para não finalizar as conexões de replicação do usuário ibm-replication, pois
isso interfere na alta disponibilidade de sua implementação.
Conexões finais
Se sua implantação atingir o limite de conexões ou se você estiver tendo dificuldades para se conectar à sua implantação e suspeitar que um número elevado de conexões seja o problema, desconecte todas as conexões com sua implantação.
Na IU, na guia Configurações, há um botão para End connections à sua implementação. Tenha cuidado, pois isso interrompe tudo o que estiver conectado à sua implantação.
O comando da CLI para encerrar as conexões com a implantação é:
ibmcloud cdb deployment-kill-connections <DEPLOYMENT_NAME_OR_CRN>
Também é possível usar a API do Cloud Databases para executar a operação de encerramento de todas as conexões.
Conjunto de conexões
Uma maneira de evitar exceder o limite de conexão e assegurar que as conexões de seus aplicativos estejam sendo manipuladas de forma eficiente é por meio da definição do conjunto de conexões. Se você mesmo configurar o limite de conexões do IBM Cloud® Databases for PostgreSQL para mais de 500 conexões, será necessário considerar seriamente o uso da definição do conjunto de conexões ou reavaliar como usar e manter as conexões de maneira mais eficiente. A referência de desempenho na comunidade do PostgreSQL sugere 500 conexões ou menos para obter um desempenho ideal do banco de dados.
Muitas bibliotecas do driver do PostgreSQL têm classes e funções de definição do conjunto de conexões. É necessário consultar a documentação do seu driver para implementar a definição do conjunto de conexões ideal para seu caso de uso. Por exemplo, o driver Python Psycopg2 possui classes para gerenciar o pool de conexões em sua aplicação. O driver Java PostgreSQL JDBC possui métodos para gerenciamento de pool de conexões tanto no nível do aplicativo quanto no nível do servidor de aplicativos.
Como alternativa, você pode usar uma ferramenta de terceiros, como PgBouncer para gerenciar as conexões do seu aplicativo. As implantações do Databases for PostgreSQL incluem suporte
integrado para autenticação PgBouncer's auth_query, de modo que uma instância do PgBouncer que você executar pode validar usuários com base no banco de dados sem manter uma lista local de senhas, e as alterações de senha entram
em vigor sem a necessidade de reiniciar o PgBouncer. Para conhecer as etapas de configuração, consulte “Pool de conexões com PgBouncer ”.
Aumentando o limite de conexão
PostgreSQL aloca uma determinada quantidade de memória por conexão, normalmente entre 5 e 10 MB por conexão. É importante considerar a quantia total de memória que está disponível para sua implementação antes de aumentar o limite de conexão. Para aumentar o limite de conexão, talvez você queira, primeiro, escalar sua implementação para assegurar que tenha memória suficiente para acomodar mais conexões.
Em seguida, mude o valor de max_connections em sua implementação. Para fazer alterações permanentes na configuração do PostgreSQL,
você deve usar o plug-in de linha de comando Cloud Databases ou a API para gravar as alterações no arquivo de configuração da sua implantação.
Por exemplo, para elevar max_connections para 215, pode ser uma boa ideia escalar sua implementação para pelo menos 2 GB de RAM por membro de dados, de um total de 4 GB de RAM para sua implementação. Quando a operação de ajuste
de escala tiver sido concluída, configure o limite de conexão.
- Antes de ajustar
max_connections, certifique-se de direcionar sua região preferida com um comando como:
ibmcloud target -r <REGION>
- Em seguida, aumente a quantia de memória disponível para um grupo de implementação com um comando como:
ibmcloud cdb deployment-groups-set deployment-example member --memory 4096
- Por último, ajuste
max_connectionscom um comando como:
ibmcloud cdb deployment-configuration <DEPLOYMENT_NAME_OR_CRN> '{"configuration":{"max_connections":215}}'
Para fazer as alterações por meio da API, use o seguinte comando:
curl -X PATCH `https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/groups/member' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"memory": {
"allocation_mb": 4096
}
}'
curl -X PATCH 'https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/configuration' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"configuration":{
"max_connections":215
}
}'
Configurações de limites e keep-alives de TCP/IP para sua conexão
No caso de uma falha na conexão de rede ou de failover, é possível que conexões TCP/IP interrompidas permaneçam em um estado semiaberto/fechado até que os tempos limite de keepalive TCP sejam atingidos. Para evitar esse cenário, defina também
as configurações socket_timeout e connection_timeout em seus drivers de aplicativos específicos. As configurações corretas variam com base na carga de trabalho específica e é importante executar testes de carregamento antes de passar para a produção.
Um bom ponto de partida para o “ connection_timeout ” é de 2 a 5 segundos. Para o exercício “ socket_timeout ”, um bom ponto de partida é de 30 a 60 segundos.
Além disso, no lado do servidor, as configurações de keep-alive a seguir são usadas por padrão.
- O
tcp_keepalives_idleé configurado para 5 minutos - O intervalo de análise do
tcp_keepalives_intervalé configurado para 10 segundos - O
tcp_keepalives_counté configurado para 6
Para evitar que conexões semiabertas/semifechadas ou picos nas tentativas de conexão sobrecarreguem sua implantação, defina o parâmetro max_connections para Postgres com um valor pelo menos o dobro do número esperado de conexões.
Se o seu limite de conexões for atingido, você poderá terminar todas as conexões imediatamente.