Gerenciando Conexões
As conexões com a implantação Databases for PostgreSQL usam recursos, portanto, é importante considerar quantas conexões são necessárias para ajustar o desempenho da 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 exceder 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
. Se você encontrar conexões que precisem ser redefinidas ou fechadas, o usuário Admin poderá usar tanto o ' pg_cancel_backend
quanto pg_terminate_backend
. O pid
de um processo é localizado na tabela pg_stat_activity
.
-
pg_cancel_backend
cancela 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_backend
para 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 a sua implantação atingir o limite de conexões ou se você estiver tendo problemas para se conectar à implantação e suspeitar que um número elevado de conexões seja o problema, desconecte todas as conexões à implantação.
Na IU, na guia Configurações, há um botão para End connections
à sua implementação. Tome cuidado, pois ele interrompe qualquer coisa que esteja conectada à sua implementaçã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 tem classes para lidar com o pooling de conexões em seu aplicativo. O driver Java PostgreSQL JDBC tem métodos para pooling de conexões no nível do aplicativo e do servidor de aplicativos.
Como alternativa, você pode usar uma ferramenta de terceiros, como o PgBouncer, para gerenciar as conexões do seu aplicativo.
Aumentando o limite de conexão
PostgreSQL aloca uma certa quantidade de memória por conexão, normalmente em torno de 5 a 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çãoPostgreSQL,
você deve usar o cli-plugin ou a API Cloud
Databases 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_connections
com 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 conexão de rede ou failover, é possível que as conexões TCP/IP interrompidas permaneçam em um estado entreaberto/fechado até que os tempos limite do TCP keepalive 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 ' 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 meio abertas/fechadas ou explosões de tentativas de conexão sobrecarreguem sua implementação, defina o ' parâmetro max_connections
para ' Postgres para pelo menos o dobro da contagem de conexões esperada.
Se o seu limite de conexões for atingido, você poderá terminar todas as conexões imediatamente.