Cómo evitar la fijación de RDS Proxy
La multiplexación es más eficiente cuando las solicitudes de base de datos no dependen de la información de estado de solicitudes anteriores. En ese caso, RDS Proxy puede reutilizar una conexión en la conclusión de cada transacción. Algunos ejemplos de dicha información de estado incluyen la mayoría de las variables y parámetros de configuración que puede cambiar a través de instrucciones SET
o SELECT
. Las transacciones SQL en una conexión de cliente pueden multiplexar entre conexiones de base de datos subyacentes de forma predeterminada.
Las conexiones al proxy pueden entrar en un estado conocido como fijación. Cuando se fija una conexión, cada transacción posterior utiliza la misma conexión de base de datos subyacente hasta que finaliza la sesión. Otras conexiones de cliente tampoco pueden reutilizar esa conexión de base de datos hasta que finaliza la sesión. La sesión finaliza cuando se interrumpe la conexión del cliente.
RDS Proxy fija automáticamente una conexión de cliente a una conexión de base de datos específica cuando detecta un cambio de estado de sesión que no es apropiado para otras sesiones. La fijación reduce la eficacia de la reutilización de la conexión. Si todas o casi todas las conexiones experimentan asignación, plantéese modificar el código de la aplicación o la carga de trabajo para reducir las condiciones que provocan la fijación.
Por ejemplo, su aplicación cambia una variable de sesión o un parámetro de configuración. En este caso, las instrucciones posteriores pueden depender de que la nueva variable o parámetro esté en vigor. Por lo tanto, cuando RDS Proxy procesa solicitudes para cambiar las variables de sesión o los parámetros de configuración, fija esa sesión a la conexión de base de datos. De esta forma, el estado de la sesión permanece en vigor para todas las transacciones posteriores en la misma sesión.
Para algunos motores de base de datos, esta regla no se aplica a todos los parámetros que se pueden establecer. RDS Proxy realiza un seguimiento de ciertas sentencias y variables. Por lo tanto, RDS Proxy no fija la sesión cuando las modifica. En ese caso, RDS Proxy solo reutiliza la conexión para otras sesiones que tengan los mismos valores para esa configuración. Para obtener más información sobre lo que RDS Proxy rastrea para un motor de base de datos, consulte lo siguiente:
Qué rastrea el proxy RDS para las bases de datos de RDS para SQL Server
A continuación se presentan las instrucciones SQL Server de las que RDS Proxy realiza un seguimiento:
USE
SET ANSI_NULLS
SET ANSI_PADDING
SET ANSI_WARNINGS
SET ARITHABORT
SET CONCAT_NULL_YIELDS_NULL
SET CURSOR_CLOSE_ON_COMMIT
SET DATEFIRST
SET DATEFORMAT
SET LANGUAGE
SET LOCK_TIMEOUT
SET NUMERIC_ROUNDABORT
SET QUOTED_IDENTIFIER
SET TEXTSIZE
SET TRANSACTION ISOLATION LEVEL
Qué seguimiento hace RDS Proxy para bases de datos de RDS para MariaDB y RDS para MySQL
Estas son las instrucciones de MariaDB y MySQL de las que RDS Proxy realiza un seguimiento:
DROP DATABASE
DROP SCHEMA
USE
A continuación se presentan las variables MySQL y MariaDB de las que RDS Proxy realiza un seguimiento:
AUTOCOMMIT
AUTO_INCREMENT_INCREMENT
CHARACTER SET (or CHAR SET)
CHARACTER_SET_CLIENT
CHARACTER_SET_DATABASE
CHARACTER_SET_FILESYSTEM
CHARACTER_SET_CONNECTION
CHARACTER_SET_RESULTS
CHARACTER_SET_SERVER
COLLATION_CONNECTION
COLLATION_DATABASE
COLLATION_SERVER
INTERACTIVE_TIMEOUT
NAMES
NET_WRITE_TIMEOUT
QUERY_CACHE_TYPE
SESSION_TRACK_SCHEMA
SQL_MODE
TIME_ZONE
TRANSACTION_ISOLATION (or TX_ISOLATION)
TRANSACTION_READ_ONLY (or TX_READ_ONLY)
WAIT_TIMEOUT
Minimizar la fijación
El ajuste del rendimiento para RDS Proxy implica intentar maximizar la reutilización de la conexión en el nivel de transacción (multiplexación) minimizando la fijación.
Puede minimizar la fijación, puede realizar lo siguiente:
-
Evite las solicitudes de base de datos innecesarias que puedan provocar la fijación.
-
Establezca variables y parámetros de configuración de forma coherente en todas las conexiones. De esta forma, es más probable que las sesiones posteriores reutilicen conexiones que tengan esa configuración particular.
Sin embargo, en el caso de PostgreSQL, el establecimiento de una variable conduce a la fijación de sesión.
-
Para una base de datos de familia de motores MySQL, aplique un filtro de sesión de fijación al proxy. Puede eximir a ciertos tipos de operaciones de asignar la sesión si sabe que hacerlo no afecta al correcto funcionamiento de la fijación.
-
Consulte la frecuencia con la que se produce la fijación mediante la supervisión de la métrica de Amazon CloudWatch
DatabaseConnectionsCurrentlySessionPinned
. Para obtener información sobre esta y otras métricas de CloudWatch, consulte Supervisión de las métricas de RDS Proxy con Amazon CloudWatch. -
Si utiliza instrucciones
SET
para realizar una inicialización idéntica para cada conexión de cliente, puede hacerlo sin dejar de mantener la multiplexación en el nivel de transacción. En este caso, mueva las instrucciones que configuran el estado de la sesión inicial a la consulta de inicialización utilizada por un proxy. Esta propiedad es una cadena que contiene una o varias instrucciones SQL, separadas por punto y coma.Por ejemplo, puede definir una consulta de inicialización para un proxy que establezca determinados parámetros de configuración. A continuación, RDS Proxy aplica esa configuración cada vez que configura una nueva conexión para ese proxy. Puede eliminar las instrucciones
SET
correspondientes de su código de aplicación, para que no interfieran con la multiplexación en el nivel de transacción.Para obtener métricas acerca de la frecuencia con la que se produce la fijación de un proxy, consulte Supervisión de las métricas de RDS Proxy con Amazon CloudWatch.
Condiciones que provocan la fijación de todas las familias de motores
El proxy fija la sesión a la conexión actual en las siguientes situaciones en las que la multiplexación podría provocar un comportamiento inesperado:
Cualquier instrucción con un tamaño de texto superior a 16 KB hace que el proxy fije la sesión.
Condiciones que provocan la fijación para RDS para Microsoft SQL Server
Para RDS para SQL Server, las siguientes interacciones también producen fijación:
Uso de varios conjuntos de resultados activos (MARS). Para obtener información sobre MARS, consulte la documentación de SQL Server
. Usar la comunicación del coordinador de transacciones distribuidas (DTC).
Crear tablas, transacciones, cursores o estados preparados temporales.
Utilizar las siguientes instrucciones:
SET
SET ANSI_DEFAULTS
SET ANSI_NULL_DFLT
SET ARITHIGNORE
SET DEADLOCK_PRIORITY
SET FIPS_FLAGGER
SET FMTONLY
SET FORCEPLAN
SET IDENTITY_INSERT
SET NOCOUNT
SET NOEXEC
SET OFFSETS
SET PARSEONLY
SET QUERY_GOVERNOR_COST_LIMIT
SET REMOTE_PROC_TRANSACTIONS
SET ROWCOUNT
SET SHOWPLAN_ALL
,SHOWPLAN_TEXT
, ySHOWPLAN_XML
SET STATISTICS
SET XACT_ABORT
Condiciones que provocan la fijación para RDS para MariaDB y RDS para MySQL
Para MariaDB y MySQL, las siguientes interacciones también producen una fijación:
-
Las instrucciones de bloqueo de tabla explícitas
LOCK TABLE
,LOCK TABLES
oFLUSH TABLES WITH READ LOCK
hacen que el proxy fije la sesión. -
Creación de bloqueos con nombre mediante
GET_LOCK
provoca que el proxy instale la sesión. -
El establecimiento de una variable de usuario o una variable de sistema (con algunas excepciones) hace que el proxy fije la sesión. Si esta situación reduce demasiado la reutilización de la conexión, puede elegir que las operaciones
SET
no provoquen la fijación. Para obtener información acerca de cómo hacerlo estableciendo la propiedad de los filtros de fijación de sesión, consulte Creación de un RDS Proxy y Modificación de RDS Proxy. -
La creación de una tabla temporal hace que el proxy fije la sesión. De esta forma, el contenido de la tabla temporal se conserva a lo largo de la sesión con independencia de los límites de la transacción.
-
La llamada a las funciones
ROW_COUNT
,FOUND_ROWS
yLAST_INSERT_ID
a veces provoca fijación. -
Las instrucciones preparadas hacen que el proxy fije la sesión. Esta regla se aplica si la instrucción preparada utiliza texto SQL o el protocolo binario.
-
El proxy de RDS no fija las conexiones cuando se utiliza SET LOCAL.
-
La llamada a procedimientos almacenados y funciones almacenadas no causa fijación. El proxy de RDS no detecta ningún cambio de estado de sesión resultante de dichas llamadas. Asegúrese de que su aplicación no cambie el estado de la sesión dentro de las rutinas almacenadas si confía en que ese estado de sesión vaya a persistir en las transacciones. Por ejemplo, RDS Proxy no es compatible actualmente con un procedimiento almacenado que crea una tabla temporal que persiste a través de todas las transacciones.
Si tiene conocimientos especializados sobre el comportamiento de la aplicación, puede omitir el comportamiento de fijación de determinadas instrucciones de aplicación. Para ello, elija la opción Session pinning filters (Filtro de fijación de sesión) al crear el proxy. Actualmente, puede desactivar la fijación de sesión para establecer variables de sesión y valores de configuración.
Condiciones que provocan la fijación para RDS para PostgreSQL
Para PostgreSQL, las siguientes interacciones también producen fijación:
-
Uso de comandos
SET
. -
Uso de los comandos
PREPARE
,DISCARD
,DEALLOCATE
oEXECUTE
para gestionar las instrucciones preparadas. -
Creación de secuencias, tablas o vistas temporales.
-
Declaración de cursores.
-
Descartar el estado de la sesión.
-
Escucha en un canal de notificación.
-
Carga de un módulo de biblioteca como
auto_explain
. -
Manipulación de secuencias mediante el uso de funciones como
nextval
ysetval
. -
Interacción con bloqueos mediante el uso de funciones como
pg_advisory_lock
ypg_try_advisory_lock
.nota
RDS Proxy no fija los bloqueos consultivos en la transacción, específicamente
pg_advisory_xact_lock
,pg_advisory_xact_lock_shared
,pg_try_advisory_xact_lock
ypg_try_advisory_xact_lock_shared
. -
Cómo configurar un parámetro o restablecerlo a su valor predeterminado. En concreto, el uso de comandos
SET
yset_config
para asignar valores predeterminados a las variables de sesión. -
La llamada a procedimientos almacenados y funciones almacenadas no causa fijación. El proxy de RDS no detecta ningún cambio de estado de sesión resultante de dichas llamadas. Asegúrese de que su aplicación no cambie el estado de la sesión dentro de las rutinas almacenadas si confía en que ese estado de sesión vaya a persistir en las transacciones. Por ejemplo, RDS Proxy no es compatible actualmente con un procedimiento almacenado que crea una tabla temporal que persiste a través de todas las transacciones.