Evitar a fixação de um RDS Proxy
A multiplexação é mais eficiente quando as solicitações de banco de dados não dependem de informações de estado de solicitações anteriores. Nesse caso, o proxy do RDS pode reutilizar uma conexão na conclusão de cada transação. Exemplos de tais informações de estado incluem a maioria das variáveis e parâmetros de configuração que você pode alterar por meio de instruções SET
ou SELECT
. Por padrão, as transações SQL em uma conexão de cliente podem multiplexar entre conexões de banco de dados subjacentes.
Suas conexões com o proxy podem entrar em um estado conhecido como fixação. Quando uma conexão é fixada, cada transação posterior usa a mesma conexão de banco de dados subjacente até que a sessão termine. Outras conexões de cliente também não podem reutilizar essa conexão de banco de dados até que a sessão termine. A sessão termina quando a conexão do cliente é descartada.
O proxy do RDS automaticamente fixa uma conexão de cliente a uma conexão de banco de dados específica quando detecta uma alteração no estado de sessão que não é apropriada para outras sessões. A fixação reduz a eficácia da reutilização de conexões. Se todas ou quase todas as suas conexões forem fixadas, considere modificar o código da aplicação ou a workload para reduzir as condições que provocam a fixação.
Por exemplo, a aplicação altera uma variável de sessão ou um parâmetro de configuração. Nesse caso, as declarações posteriores poderão contar que a nova variável ou parâmetro estará em vigor. Assim, quando o proxy do RDS processa solicitações para alterar variáveis ou definições da configuração da sessão, ele fixa essa sessão para a conexão com o banco de dados. Dessa forma, o estado da sessão permanece em vigor para todas as transações posteriores na mesma sessão.
Em alguns mecanismos de banco de dados, essa regra não se aplica a todos os parâmetros que você pode definir. O proxy do RDS monitora determinadas instruções e variáveis. Portanto, o RDS Proxy não fixa a sessão quando você as modifica. Nesse caso, o proxy do RDS apenas reutiliza a conexão para outras sessões que tenham os mesmos valores para essas configurações. Para obter detalhes sobre o que o RDS Proxy monitora para um mecanismo de banco de dados, consulte o seguinte:
O que o RDS Proxy monitora para bancos de dados do RDS para SQL Server
Veja a seguir as declarações do SQL Server que o RDS Proxy monitora:
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
O que o RDS Proxy monitora para bancos de dados do RDS para MariaDB e o RDS para MySQL
Veja a seguir as declarações do MySQL e do MariaDB que o RDS Proxy monitora:
DROP DATABASE
DROP SCHEMA
USE
Veja a seguir as variáveis do MySQL e MariaDB que o RDS Proxy monitora:
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
Reduzir a fixação
O ajuste de performance do proxy do RDS envolve a tentativa de maximizar a reutilização de conexões em nível de transação (multiplexação) minimizando a fixação.
É possível reduzir a fixação da seguinte maneira:
-
Evite solicitações de banco de dados desnecessárias que podem causar fixação.
-
Defina variáveis e definições de configuração de forma consistente em todas as conexões. Dessa forma, as sessões posteriores têm mais probabilidade de reutilizar conexões que têm essas configurações específicas.
No entanto, para a configuração do PostgreSQL, uma variável leva à fixação da sessão.
-
Para um banco de dados da família de mecanismos do MySQL, aplique um filtro de fixação de sessão ao proxy. Você pode isentar certos tipos de operações de fixar a sessão se souber que isso não afeta o funcionamento correto da aplicação.
-
Veja com que frequência a fixação ocorre monitorando a métrica
DatabaseConnectionsCurrentlySessionPinned
do Amazon CloudWatch. Para obter informações sobre essa e outras métricas do CloudWatch, consulte Monitorar métricas do proxy do RDS com o Amazon CloudWatch. -
Se você usar instruções
SET
para executar uma inicialização idêntica para cada conexão de cliente, poderá fazê-lo enquanto preserva a multiplexação no nível de transação. Nesse caso, você move as instruções que configuram o estado da sessão inicial para a consulta de inicialização usada por um proxy. Esta propriedade é uma string que contém uma ou mais instruções SQL, separadas por ponto e vírgula.Por exemplo, você pode definir uma consulta de inicialização para um proxy que define determinados parâmetros de configuração. O proxy do RDS aplica essas configurações sempre que configura uma nova conexão para esse proxy. Você pode remover as instruções
SET
correspondentes do código de sua aplicação, para que elas não interfiram na multiplexação em nível de transação.Para ver métricas sobre a frequência com que a fixação ocorre para um proxy, consulte Monitorar métricas do proxy do RDS com o Amazon CloudWatch.
Condições que causam fixação para todas as famílias de mecanismos
O proxy fixa a sessão à conexão atual nas seguintes situações em que a multiplexação pode causar um comportamento inesperado:
Qualquer instrução com um tamanho de texto maior do que 16 KB faz com que o proxy fixe a sessão.
Condições que podem causar fixação no RDS para Microsoft SQL Server
Para o RDS para SQL Server, as seguintes interações também geram fixação:
Utilizando vários conjuntos de resultados ativos (MARS). Para obter informações sobre MARS, consulte a documentação do SQL Server
. Utilizando a comunicação do coordenador de transações distribuídas (DTC).
Criando tabelas temporárias, transações, cursores ou declarações preparadas.
Usando as seguintes declarações
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
, eSHOWPLAN_XML
SET STATISTICS
SET XACT_ABORT
Condições que causam fixação no RDS para MariaDB e RDS para MySQL
Para o MySQL e o MariaDB, as seguintes interações também podem causar fixação:
-
As instruções explícitas de bloqueio de tabela
LOCK TABLE
,LOCK TABLES
ouFLUSH TABLES WITH READ LOCK
fazem com que o proxy fixe a sessão. -
A criação de bloqueios nomeados usando
GET_LOCK
faz com que o proxy fixe a sessão. -
A definição de uma variável de usuário ou definir uma variável de sistema (com algumas exceções) faz com que o proxy fixe a sessão. Se essa situação reduzir muito a reutilização de conexões, determine que as operações
SET
não causem fixação. Para obter informações sobre como fazer isso definindo a propriedade de fixação de filtros, consulte Criar um RDS Proxy e Modificar o RDS Proxy. -
A criação de uma tabela temporária faz com que o proxy fixe a sessão. Dessa forma, o conteúdo da tabela temporária é preservado durante toda a sessão, independentemente dos limites de transação.
-
A chamada das funções
ROW_COUNT
,FOUND_ROWS
eLAST_INSERT_ID
às vezes causa fixação. -
As instruções preparadas fazem com que o proxy fixe a sessão. Essa regra se aplicará se a instrução preparada usar texto SQL ou o protocolo binário.
-
O RDS Proxy não fixa conexões quando você usa SET LOCAL.
-
A chamada de procedimentos armazenados e de funções armazenadas não causa fixação. O proxy do RDS não detecta nenhuma alteração de estado de sessão resultante dessas chamadas. Verifique se a aplicação não altera o estado da sessão dentro de rotinas armazenadas se você confia nesse estado de sessão para persistir entre transações. Por exemplo, no momento, o proxy do RDS não é compatível com um procedimento armazenado que cria uma tabela temporária que persiste em todas as transações.
Se você tiver conhecimento especializado sobre o comportamento da aplicação, poderá ignorar o comportamento de fixação de determinadas instruções da aplicação. Para fazer isso, escolha a opção Filtros de fixação de sessão ao criar o proxy. Atualmente, é possível cancelar a fixação de sessão para definir variáveis de sessão e configurações.
Condições que causam fixação no RDS para PostgreSQL
Para o PostgreSQL, as seguintes interações também geram a fixação:
-
Usar comandos
SET
. -
Usar comandos
PREPARE
,DISCARD
,DEALLOCATE
ouEXECUTE
para gerenciar instruções preparadas. -
Criar sequências, tabelas ou visualizações temporárias.
-
Declarar cursores.
-
Descartar o estado da sessão.
-
Escutar em um canal de notificação.
-
Carregar um módulo de biblioteca, como
auto_explain
. -
Manipular sequências usando funções como
nextval
esetval
. -
Interagir com bloqueios usando funções como
pg_advisory_lock
epg_try_advisory_lock
.nota
O RDS Proxy não fixa bloqueios consultivos em nível de transação, especificamente
pg_advisory_xact_lock
,pg_advisory_xact_lock_shared
,pg_try_advisory_xact_lock
epg_try_advisory_xact_lock_shared
. -
Definir ou redefinir um parâmetro como o padrão. Especificamente, usar comandos
SET
eset_config
para atribuir valores padrão às variáveis da sessão. -
A chamada de procedimentos armazenados e de funções armazenadas não causa fixação. O proxy do RDS não detecta nenhuma alteração de estado de sessão resultante dessas chamadas. Verifique se a aplicação não altera o estado da sessão dentro de rotinas armazenadas se você confia nesse estado de sessão para persistir entre transações. Por exemplo, no momento, o proxy do RDS não é compatível com um procedimento armazenado que cria uma tabela temporária que persiste em todas as transações.