Evitar a fixação de um RDS Proxy - Amazon Relational Database Service

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, e SHOWPLAN_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 ou FLUSH 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 e LAST_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 ou EXECUTE 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 e setval.

  • Interagir com bloqueios usando funções como pg_advisory_lock e pg_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 e pg_try_advisory_xact_lock_shared.

  • Definir ou redefinir um parâmetro como o padrão. Especificamente, usar comandos SET e set_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.