¿Cómo puedo aumentar las conexiones máximas de mi instancia de Amazon RDS para MySQL o Amazon RDS para PostgreSQL?

10 minutos de lectura
0

Quiero aumentar el número máximo de conexiones para mi instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para MySQL o Amazon RDS para PostgreSQL.

Resolución

Ver el valor actual de max_connections

En Amazon RDS para MySQL, la métrica max_connections supervisa la cantidad máxima establecida de conexiones de cliente simultáneas (permitidas).

El parámetro max_connections se basa, de forma predeterminada, en la siguiente fórmula de Amazon RDS para MySQL (que se calcula a partir del valor de DBInstanceClassMemory):

max_connections = DBInstanceClassMemory/12582880

Para verificar el valor actual de max_connections, ejecute el siguiente comando después de conectarse a la instancia de Amazon RDS para MySQL:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

En Amazon RDS para PostgreSQL, la métrica max_connections supervisa la cantidad máxima establecida de conexiones de cliente simultáneas. El parámetro max_connections se basa, de forma predeterminada, en la siguiente fórmula de Amazon RDS para PostgreSQL (que se calcula a partir del valor de DBInstanceClassMemory):

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

Para verificar el valor actual de max_connections, ejecute el siguiente comando después de conectarse a la instancia de Amazon RDS para PostgreSQL:

postgres=> show max_connections;

El valor predeterminado de max_connections para RDS para MySQL y RDS para PostgreSQL depende de la clase de instancia que utilice la instancia de Amazon RDS. Una clase de instancia de base de datos con más memoria disponible también admite una mayor cantidad de conexiones de base de datos.

Tenga en cuenta que el número predeterminado de max_connections calculado con la fórmula puede variar ligeramente respecto al número de conexiones predeterminadas devueltas por el comando anterior. Esto se debe a que parte de la memoria del total de DBInstanceClassMemory está reservada para las operaciones del sistema operativo subyacente. El comando anterior considera solo la memoria que está reservada para el motor de PostgreSQL y no para el sistema operativo host subyacente.

Revisar los motivos de un exceso de conexiones

Cuando el número de conexiones de clientes supera el valor de max_connections, se producen errores similares a los siguientes:

Los siguientes factores podrían ocasionar que las conexiones de base de datos superen el valor de max_connections:

Aumento de la cantidad de conexiones cliente/aplicación a la instancia de base de datos: esto se debe a un incremento de la carga de trabajo o al bloqueo a niveles de tabla/fila.

Cerrar incorrectamente una conexión de cliente o aplicación tras finalizar una operación: cuando una conexión al servidor no se cierra correctamente, la aplicación cliente abre una nueva conexión. Con el tiempo, estas nuevas conexiones del servidor pueden hacer que la instancia supere el valor de max_connections. Para enumerar todas las conexiones activas de la instancia de base de datos de RDS para MySQL, ejecute el siguiente comando:

SHOW FULL PROCESSLIST

Para ver las conexiones de cada base de datos de la instancia de RDS para PostgreSQL, ejecute el siguiente comando:

SELECT datname, numbackends FROM pg_stat_database;

Conexiones suspendidas: las conexiones suspendidas, también conocidas como conexiones abiertas inactivas, surgen debido a valores más altos para los parámetros de tiempo de espera de conexión, como wait_timeout o interactive_timeout en MySQL. Si configura un límite de conexión muy alto, es posible que se haga un uso de memoria más elevado aunque no se utilicen esas conexiones. Como resultado, cuando el servidor de aplicaciones intente abrir todas las conexiones de cliente a la base de datos, es posible que estas conexiones se rechacen. Para terminar una conexión en reposo en una instancia de base de datos de RDS para MySQL, ejecute el siguiente comando:

CALL mysql.rds_kill(example-pid);

Conexiones inactivas: puede ver las conexiones inactivas en una instancia de RDS para PostgreSQL si ejecuta la siguiente consulta. Esta consulta muestra información sobre los procesos de backend que tienen uno de los siguientes estados durante más de 15 minutos: “idle” (inactivo), “idle in transaction” (inactivo en la transacción), “idle in transaction (aborted)” (inactivo en la transacción [abortado]) y “disabled” (desactivado).

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

Para terminar una conexión inactiva en una instancia de RDS para PostgreSQL, ejecute el siguiente comando:

SELECT pg_terminate_backend(example-pid)

Sugerencia: Se recomienda configurar únicamente las conexiones activas necesarias para el rendimiento de la aplicación. También podría considerar la posibilidad de actualizar a una clase de instancia de base de datos de Amazon RDS de mayor tamaño.

Aumentar el valor de max_connections

Puede aumentar el número máximo de conexiones a la instancia de base de datos de RDS para MySQL o RDS para PostgresSQL mediante los siguientes métodos:

  • Defina un valor mayor para el parámetro max_connections mediante un grupo de parámetros de nivel de instancia personalizado. El aumento del parámetro max_connections no ocasiona ninguna interrupción. A pesar de que puede aumentar el valor de max_connections más allá del valor predeterminado, no es una práctica recomendada. Esto se debe a que la instancia puede tener problemas cuando la carga de trabajo aumenta y se requiere más memoria. Un aumento en el número de conexiones puede aumentar el uso de la memoria. Las instancias que se quedan sin memoria podrían bloquearse. Esto es así especialmente para las instancias más pequeñas. Si aumenta el valor de max_connections, asegúrese de supervisar el uso de los recursos. Además, asegúrese de consultar con su administrador de base de datos (DBA) sobre el aumento. Se recomienda mantener el valor predeterminado o escalar verticalmente una clase de instancia más grande cuando se requieren más conexiones.
  • Si la instancia de base de datos utiliza un grupo de parámetros predeterminado, cambie el grupo de parámetros a un grupo de parámetros personalizado. Asegúrese de asociar el grupo de parámetros de base de datos personalizado a su instancia de Amazon RDS y reinicie la instancia. Una vez que haya asociado el nuevo grupo de parámetros personalizados a la instancia de base de datos, puede modificar el valor del parámetro max_connections. Para obtener más información, consulte ¿Cómo modifico los valores de un grupo de parámetros de base de datos de Amazon RDS?
    Nota: Cambiar el grupo de parámetros puede provocar una interrupción. Para obtener más información, consulte Trabajo con los grupos de parámetros de base de datos.
  • Amplíe su instancia de base de datos a una clase de instancia de base de datos con más memoria. Tenga en cuenta que la ampliación de las instancias de RDS afecta a la facturación de la cuenta. Para obtener más información, consulte Facturación de instancias de base de datos para Amazon RDS.
    Advertencia: El tiempo de inactividad se produce al modificar una instancia de base de datos de Amazon RDS.

Seguir las prácticas recomendadas para configurar el parámetro max_connections

Asegúrese de tener en cuenta las siguientes prácticas recomendadas cuando trabaje con el parámetro max_connections de la instancia de base de datos:

  • Los límites de conexión predeterminados se ajustan para los sistemas que utilizan los valores predeterminados para otros consumidores de memoria significativos como el grupo de búferes. Es una práctica recomendada escalar verticalmente la clase de instancia, en lugar de cambiar el valor de la clase de instancia. Sin embargo, si las instancias tienen mucha memoria libre, puede cambiar manualmente este parámetro. Antes de cambiar esta configuración de la instancia de base de datos, considere ajustar el límite de conexión para tener en cuenta el aumento o la disminución de la memoria disponible en las instancias de base de datos.
  • Establezca un valor de max_connections ligeramente superior a la cantidad máxima de conexiones que espera abrir en cada instancia de base de datos.
  • Para una instancia de RDS para MySQL, si activó el esquema de rendimiento, preste mucha atención a la configuración del parámetro max_connections. El tamaño de las estructuras de memoria del esquema de rendimiento se ajusta de forma automática en función de las variables de configuración del servidor. Cuanto más alta establezca la variable, más memoria utilizará el esquema de rendimiento. En casos extremos, esto puede ocasionar problemas de memoria insuficiente en tipos de instancias más pequeños, como T2 y T3. Si utiliza el esquema de rendimiento, se recomienda establecer la configuración de max_connections en el valor predeterminado. Si planea aumentar el valor de max_connections de forma significativa (a un valor superior al predeterminado), considere desactivar el esquema de rendimiento.
    Nota: Si se activa la Información sobre rendimiento para una instancia de base de datos de Amazon RDS para MySQL, el esquema de rendimiento también se activa de forma automática.
  • Para una instancia de RDS para MySQL, cuando ajuste el parámetro max_connections, asegúrese de revisar los siguientes parámetros relacionados con la conexión de MySQL: wait_timeout: número de segundos que el servidor espera para la actividad en una conexión de archivo Unix o TCP/IP no interactiva antes de cerrar la conexión
    interactive_timeout: cantidad de segundos que el servidor espera de actividad en una conexión interactiva antes de cerrar la conexión
    net_read_timeout: cantidad de segundos que se deben esperar para obtener más datos de una conexión TCP/IP antes de abandonar la actividad de lectura
    net_write_timeout: cantidad de segundos que se deben esperar en las conexiones TCP/IP para escribir un bloque antes de descartar la actividad de escritura
    max_execution_time: tiempo de espera de ejecución de instrucciones SELECT, en milisegundos
    max_connect_errors: un host se encuentra bloqueado para que no se produzcan más conexiones si se presentan más que esta cantidad de conexiones interrumpidas
    max_user_connections: cantidad máxima de conexiones simultáneas permitidas a cualquier cuenta MySQL determinada
  • Para una instancia de RDS para PostgreSQL, cuando ajuste el parámetro max_connections, asegúrese de revisar también los siguientes parámetros relacionados con la conexión de PostgreSQL:
    idle_in_transaction_session_timeout: termina cualquier sesión con una transacción abierta que haya estado inactiva durante más tiempo que el especificado en milisegundos. Esto permite liberar los bloqueos retenidos por esa sesión y reutilizar la ranura de conexión. Además, las tuplas visibles únicamente para esta transacción se limpian.
    tcp_keepalives_idle: Número de segundos de inactividad tras los cuales el sistema operativo envía un mensaje de mantenimiento de TCP al cliente
    tcp_keepalives_interval: Número de segundos tras los cuales se transmite de nuevo un mensaje de mantenimiento de TCP que el cliente no ha reconocido
    tcp_keepalives_count: número de señales de mantenimiento TCP que se pueden perder antes de que la conexión del servidor con el cliente se considere fallida.

Nota: En este artículo, no se incluyen los valores recomendados para los parámetros enumerados porque estos valores varían según el caso de uso.