Gestión de conexiones inactivas en PostgreSQL - Amazon Aurora

Gestión de conexiones inactivas en PostgreSQL

Las conexiones inactivas se producen cuando una sesión de base de datos permanece activa en el servidor a pesar de que la aplicación cliente se haya abandonado o terminado de forma anormal. Esta situación suele producirse cuando los procesos del cliente se bloquean o terminan de forma inesperada sin cerrar correctamente las conexiones de la base de datos ni cancelar las solicitudes en curso.

PostgreSQL identifica y limpia de manera eficiente las conexiones inactivas cuando los procesos del servidor están inactivos o intentan enviar datos a los clientes. Sin embargo, la detección es difícil en el caso de las sesiones que están inactivas, esperan la intervención del cliente o en las que se están ejecutando consultas de forma activa. Para gestionar estos escenarios, PostgreSQL proporciona los parámetros tcp_keepalives_*, tcp_user_timeout, y client_connection_check_interval.

Descripción de keepalive de TCP

Keepalive de TCP es un mecanismo en el nivel de protocolo que ayuda a mantener y verificar la integridad de la conexión. Cada conexión TCP mantiene configuraciones en el nivel del kernel que rigen el comportamiento de keepalive. Cuando el temporizador de keepalive expira, el sistema realiza lo siguiente:

  • Envía un paquete de sondeo sin datos y con el indicador ACK activado.

  • Espera una respuesta del punto de conexión remoto de acuerdo con las especificaciones de TCP/IP.

  • Administra el estado de la conexión en función de la respuesta o la falta de respuesta.

Parámetros clave keepalive de TCP en Aurora PostgreSQL

Parámetro Descripción Valores predeterminados
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 de la configuración de keepalive de TCP

Mantenimiento de las sesiones inactivas como activas

Para evitar que los firewalls o enrutadores terminen las conexiones inactivas debido a la inactividad:

  • Configure tcp_keepalives_idle para enviar paquetes de keepalive a intervalos regulares.

Detección de conexiones inactivas

Para detectar rápidamente las conexiones inactivas:

  • Ajuste tcp_keepalives_idle, tcp_keepalives_interval y tcp_keepalives_count. Por ejemplo, con los valores predeterminados de Aurora PostgreSQL, se tarda aproximadamente un minuto (2 sondas × 30 segundos) en detectar una conexión inactiva. Reducir estos valores puede acelerar la detección.

  • Utilice tcp_user_timeout para especificar el tiempo máximo de espera para una confirmación.

La configuración de keepalive de TCP ayuda al kernel a detectar conexiones inactivas, pero PostgreSQL puede no actuar hasta que se utilice el socket. Si una sesión está ejecutando una consulta larga, es posible que las conexiones inactivas solo se detecten una vez completada la consulta. En PostgreSQL 14 y versiones posteriores, client_connection_check_interval puede acelerar la detección de conexiones inactivas consultando periódicamente el socket durante la ejecución de la consulta.

Prácticas recomendadas

  • Establezca intervalos de keepalive razonables: ajuste tcp_user_timeout, tcp_keepalives_idle, tcp_keepalives_count y tcp_keepalives_interval para equilibrar la velocidad de detección y el uso de recursos.

  • Optimice para su entorno: alinee la configuración con el comportamiento de la red, las políticas de firewall y las necesidades de la sesión.

  • Aproveche las características de PostgreSQL: utilice client_connection_check_interval en PostgreSQL 14 y versiones posteriores para comprobar la conexión de forma eficaz.