IBM Cloud Docs
Gerenciando Conexões

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.

  1. Antes de ajustar max_connections, certifique-se de direcionar sua região preferida com um comando como:
ibmcloud target -r <REGION>
  1. 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
  1. 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.