Tratamento de conexões inativas no PostgreSQL - Amazon Aurora

Tratamento de conexões inativas no PostgreSQL

Conexões inativas ocorrem quando uma sessão de banco de dados permanece ativa no servidor mesmo que a aplicação cliente tenha sido abandonada ou encerrada de forma anormal. Essa situação geralmente ocorre quando os processos do cliente falham ou são encerrados inesperadamente sem fechar adequadamente as respectivas conexões de banco de dados ou cancelar solicitações em andamento.

O PostgreSQL identifica e limpa com eficiência as conexões inativas quando os processos do servidor estão ociosos ou tentam enviar dados aos clientes. No entanto, a detecção é um desafio para sessões que estão ociosas, aguardando a entrada do cliente ou executando consultas ativamente. Para lidar com esses cenários, o PostgreSQL oferece os parâmetros tcp_keepalives_*, tcp_user_timeout e client_connection_check_interval.

Conceitos básicos sobre keepalive de TCP

O keepalive de TCP é um mecanismo em nível de protocolo que ajuda a manter e verificar a integridade da conexão. Cada conexão TCP mantém configurações em nível de kernel que controlam o comportamento de keepalive. Quando o temporizador de keepalive expira, o sistema realiza o seguinte:

  • Envia um pacote de sondagem sem dados e com o sinalizador ACK definido.

  • Espera uma resposta do endpoint remoto de acordo com as especificações de TCP/IP.

  • Gerencia o estado da conexão com base na resposta ou na falta dela.

Principais parâmetros de keepalive de TCP no Aurora PostgreSQL

Parameter Descrição Valores padrão
tcp_keepalives_idle Specifies number of seconds of inactivity before sending keepalive message. 300
tcp_keepalives_interval Specifies number of seconds between retransmissions of unacknowledged keepalive messages. 30
tcp_keepalives_count Maximum lost keepalive messages before declaring connection dead 2
tcp_user_timeout Specifies how long (in Milliseconds) unacknowledged data can remain before forcibly closing the connection. 0
client_connection_check_interval Sets the interval (in Milliseconds) for checking client connection status during long-running queries. This ensures quicker detection of closed connections. 0

Casos de uso para configurações de keepalive de TCP

Manter as sessões ociosas ativas

Para evitar que conexões ociosas sejam encerradas por firewalls ou roteadores devido a inatividade:

  • Configure tcp_keepalives_idle para enviar pacotes de keepalive em intervalos regulares.

Detectar conexões inativas

Para detectar conexões inativas imediatamente:

  • Ajuste tcp_keepalives_idle, tcp_keepalives_interval e tcp_keepalives_count. Por exemplo, com os padrões do Aurora PostgreSQL, a detecção de uma conexão inativa leva cerca de 1 minuto (2 sondagens × 30 segundos). Reduzir esses valores pode acelerar a detecção.

  • Use tcp_user_timeout para especificar o tempo máximo de espera para uma confirmação.

As configurações de keepalive de TCP ajudam o kernel a detectar conexões inativas, mas talvez o PostgreSQL não aja enquanto o soquete não for usado. Se uma sessão estiver executando uma consulta longa, as conexões inativas só poderão ser detectadas após a conclusão da consulta. No PostgreSQL 14 e versões posteriores, client_connection_check_interval pode acelerar a detecção de conexões inativas pesquisando periodicamente o soquete durante a execução da consulta.

Práticas recomendadas

  • Defina intervalos razoáveis de keepalive: ajuste tcp_user_timeout, tcp_keepalives_idle, tcp_keepalives_count e tcp_keepalives_interval para contrabalançar a velocidade de detecção e o uso de recursos.

  • Otimize para melhorar seu ambiente: alinhe as configurações ao comportamento da rede, às políticas de firewall e às necessidades da sessão.

  • Aproveite os recursos do PostgreSQL: use client_connection_check_interval no PostgreSQL 14 e versões posteriores para realizar verificações de conexão eficientes.