Usar o encaminhamento de gravação local em um cluster de banco de dados do Amazon Aurora MySQL - Amazon Aurora

Usar o encaminhamento de gravação local em um cluster de banco de dados do Amazon Aurora MySQL

encaminhamento de gravação local (no cluster) permite que as aplicações emitam transações de leitura/gravação diretamente em uma réplica do Aurora. Essas transações são então encaminhadas para a instância de banco de dados do gravador para serem confirmadas. Você pode usar o encaminhamento de gravação local quando as aplicações exigirem consistência de leitura após gravação, que é a capacidade de ler a última gravação em uma transação.

As réplicas de leitura recebem atualizações de forma assíncrona do gravador. Sem o encaminhamento de gravação, você precisa realizar todas as leituras que exigem consistência de leitura após gravação na instância de banco de dados do gravador. Ou é necessário desenvolver uma lógica de aplicação personalizada complexa para aproveitar as vantagens de várias réplicas de leitura para escalabilidade. As aplicações devem dividir todo o tráfego de leitura e gravação, mantendo dois conjuntos de conexões de banco de dados para enviar o tráfego ao endpoint correto. Essas despesas indiretas de desenvolvimento complicam o design da aplicação quando as consultas fazem parte de uma única sessão lógica, ou transação, na aplicação. Além disso, como o atraso na replicação pode diferir entre as réplicas de leitura, é difícil obter consistência de leitura global em todas as instâncias do banco de dados.

O encaminhamento de gravação evita a necessidade de dividir essas transações ou de enviá-las exclusivamente ao gravador, o que simplifica o desenvolvimento de aplicações. Esse novo recurso facilita a obtenção de escala de leitura para workloads que precisam ler a última gravação em uma transação e não são sensíveis à latência de gravação.

O encaminhamento de gravação local é diferente do encaminhamento de gravação global, que encaminha gravações de um cluster de banco de dados secundário para o cluster de banco de dados primário em um banco de dados global do Aurora. Você pode usar o encaminhamento de gravação local em um cluster de banco de dados que faz parte de um banco de dados global do Aurora. Para ter mais informações, consulte Como usar o encaminhamento de gravação em um banco de dados global Amazon Aurora.

O encaminhamento de gravação local exige o Aurora MySQL versão 3.04 ou posterior.

Conferir se um cluster de banco de dados tem o encaminhamento de gravação habilitado

Para determinar se você pode usar o encaminhamento de gravação em um cluster de banco de dados, confirme se o cluster tem o atributo LocalWriteForwardingStatus definido como enabled.

No AWS Management Console, na guia Configuração da página de detalhes do cluster, você vê o status Habilitado para Encaminhamento de gravação de réplica de leitura local.

Para ver o status da configuração de encaminhamento de gravação para todos os clusters, execute o comando da AWS CLI a seguir.

aws rds describe-db-clusters \ --query '*[].{DBClusterIdentifier:DBClusterIdentifier,LocalWriteForwardingStatus:LocalWriteForwardingStatus}' [ { "LocalWriteForwardingStatus": "enabled", "DBClusterIdentifier": "write-forwarding-test-cluster-1" }, { "LocalWriteForwardingStatus": "disabled", "DBClusterIdentifier": "write-forwarding-test-cluster-2" }, { "LocalWriteForwardingStatus": "requested", "DBClusterIdentifier": "test-global-cluster-2" }, { "LocalWriteForwardingStatus": "null", "DBClusterIdentifier": "aurora-mysql-v2-cluster" } ]

Um cluster de banco de dados pode ter os seguintes valores para LocalWriteForwardingStatus:

  • disabled: o encaminhamento de gravação está desabilitado.

  • disabling: o encaminhamento de gravação está sendo desabilitado.

  • enabled: o encaminhamento de gravação está habilitado.

  • enabling: o encaminhamento de gravação está sendo habilitado.

  • null: o encaminhamento de gravação não está disponível para esse cluster de banco de dados.

  • requested: o encaminhamento de gravação foi solicitado mas ainda não está ativo.

Compatibilidade SQL e de aplicações com o encaminhamento de gravação

É possível usar os seguintes tipos de instruções SQL com o encaminhamento de gravação:

  • Instruções de linguagem de manipulação de dados (DML), como INSERT, DELETE e UPDATE. Existem algumas restrições com relação às propriedades dessas instruções que podem ser usadas com o encaminhamento de gravação, conforme descrito a seguir.

  • Instruções SELECT ... LOCK IN SHARE MODE e SELECT FOR UPDATE.

  • Instruções PREPARE e EXECUTE.

Certas declarações não são permitidas ou podem gerar resultados obsoletos ao serem usadas em um cluster de banco de dados com o encaminhamento de gravação. Além disso, funções definidas pelo usuário e procedimentos definidos pelo usuário não são compatíveis. Por isso, normalmente a configuração EnableLocalWriteForwarding está desabilitada para clusters de banco de dados. Antes de habilitá-la, confira se o código da aplicação não é afetado por nenhuma dessas restrições.

As restrições a seguir se aplicam às instruções SQL usadas com o encaminhamento de gravação. Em alguns casos, é possível usar as declarações em clusters de banco de dados com o encaminhamento de gravação habilitado. Essa abordagem funcionará se o encaminhamento de gravação não for habilitado na sessão pelo parâmetro de configuração aurora_replica_read_consistency. Se você tentar usar uma declaração quando ela não for permitida devido ao encaminhamento de gravação, será exibida uma mensagem de erro semelhante à seguinte:

ERROR 1235 (42000): This version of MySQL doesn't yet support 'operation with write forwarding'.
Linguagem de definição de dados (DDL)

Conecte-se à instância de banco de dados do gravador para executar declarações DDL. Não é possível executá-las em instâncias de banco de dados do leitor.

Atualizar uma tabela permanente usando dados de uma tabela temporária

Você pode usar tabelas temporárias em clusters de banco de dados com o encaminhamento de gravação habilitado. No entanto, não é possível usar uma instrução DML para modificar uma tabela permanente se a instrução se referir a uma tabela temporária. Por exemplo, não é possível usar uma instrução INSERT ... SELECT que usa os dados de uma tabela temporária.

Transações XA

Não é possível usar as declarações a seguir em um cluster de banco de dados quando o encaminhamento de gravação está habilitado na sessão. Essas declarações podem ser usadas em clusters de banco de dados que não tenham o encaminhamento de gravação habilitado ou em sessões em que a configuração aurora_replica_read_consistency está vazia. Antes de habilitar o encaminhamento de gravação em uma sessão, confira se o código usa essas declarações.

XA {START|BEGIN} xid [JOIN|RESUME] XA END xid [SUSPEND [FOR MIGRATE]] XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER [CONVERT XID]
Instruções LOAD para tabelas permanentes

Não é possível usar as declarações a seguir em um cluster de banco de dados com o encaminhamento de gravação habilitado.

LOAD DATA INFILE 'data.txt' INTO TABLE t1; LOAD XML LOCAL INFILE 'test.xml' INTO TABLE t1;
Instruções de plugin

Não é possível usar as declarações a seguir em um cluster de banco de dados com o encaminhamento de gravação habilitado.

INSTALL PLUGIN example SONAME 'ha_example.so'; UNINSTALL PLUGIN example;
Instruções SAVEPOINT

Não é possível usar as declarações a seguir em um cluster de banco de dados quando o encaminhamento de gravação está habilitado na sessão. Você pode usar essas declarações em clusters de banco de dados que não tenham o encaminhamento de gravação habilitado ou em sessões em que a configuração aurora_replica_read_consistency está em branco. Confira se o código usa essas declarações antes de habilitar o encaminhamento de gravação em uma sessão.

SAVEPOINT t1_save; ROLLBACK TO SAVEPOINT t1_save; RELEASE SAVEPOINT t1_save;

Níveis de isolamento para encaminhamento de gravação

Em sessões que usam o encaminhamento de gravação, só é possível usar o nível de isolamento REPEATABLE READ. Embora também seja possível usar o nível de isolamento READ COMMITTED com réplicas do Aurora, esse nível de isolamento não funciona com o encaminhamento de gravação. Para obter informações sobre os níveis de isolamento REPEATABLE READ e READ COMMITTED, consulte Níveis de isolamento do Aurora MySQL.

Executar instruções de várias partes com o encaminhamento de gravação

Uma declaração DML pode consistir em várias partes, como uma declaração INSERT ... SELECT ou DELETE ... WHERE. Nesse caso, a declaração inteira é encaminhada para a instância de banco de dados do gravador e é executada nela.

Transações com o encaminhamento de gravação

Se o modo de acesso à transação estiver definido como somente leitura, o encaminhamento de gravação não será usado. É possível especificar o modo de acesso da transação usando a instrução SET TRANSACTION ou a instrução START TRANSACTION. Você também pode especificar o modo de acesso da transação alterando o valor da sessão transaction_read_only. Você só pode alterar esse valor de sessão enquanto estiver conectado a um cluster de banco de dados que tenha o encaminhamento de gravação habilitado.

Se uma transação de longa duração não emitir nenhuma instrução por um período substancial, ela poderá exceder o tempo limite ocioso. Este período tem um padrão de um minuto. Você pode definir o parâmetro aurora_fwd_writer_idle_timeout para aumentá-lo em até um dia. Uma transação que excede o tempo limite ocioso é cancelada pela instância do gravador. A instrução subsequente enviada recebe um erro de tempo limite. Depois, o Aurora reverte a transação.

Esse tipo de erro pode ocorrer em outros casos quando o encaminhamento de gravação fica indisponível. Por exemplo, o Aurora cancelará todas as transações que usam o encaminhamento de gravação se você reiniciar o cluster de banco de dados ou se desabilitar o encaminhamento de gravação.

Quando uma instância do gravador em um cluster que use o encaminhamento de gravação local é reiniciada, todas as transações e consultas ativas e encaminhadas nas instâncias do leitor que usam o encaminhamento de gravação local são fechadas automaticamente. Quando a instância do gravador estiver novamente disponível, você poderá repetir essas transações.

Parâmetros de configuração para o encaminhamento de gravação

Os grupos de parâmetros de banco de dados do Aurora incluem configurações para o atributo de encaminhamento de gravação. Detalhes sobre esses parâmetros são resumidos na tabela a seguir, com notas de uso após a tabela.

Parameter Escopo Type Valor padrão Valores válidos
aurora_fwd_writer_idle_timeout Cluster Inteiro não assinado 60 1–86.400
aurora_fwd_writer_max_connections_pct Cluster inteiro longo não assinado 10 0–90
aurora_replica_read_consistency Cluster ou instância Enum '' (null) EVENTUAL, SESSION, GLOBAL

Para controlar as solicitações de gravação recebidas, use estas configurações:

  • aurora_fwd_writer_idle_timeout: o número de segundos que a instância de banco de dados do gravador espera pela atividade em uma conexão que é encaminhada de uma instância do leitor antes de fechá-la. Se a sessão permanecer ociosa além desse período, o Aurora cancelará a sessão.

  • aurora_fwd_writer_max_connections_pct: o limite máximo em conexões de banco de dados que pode ser usado em uma instância de banco de dados do gravador para lidar com consultas encaminhadas de instâncias do leitor. Ele é expresso como uma porcentagem da configuração max_connections para o gravador. Por exemplo, se max_connections for 800 e aurora_fwd_master_max_connections_pct ou aurora_fwd_writer_max_connections_pct for 10, o gravador permitirá um máximo de 80 sessões encaminhadas simultâneas. Essas conexões vêm do mesmo grupo de conexões gerenciado pela configuração max_connections.

    Essa configuração se aplica somente ao gravador quando o encaminhamento de gravação está habilitado. Se você diminuir o valor, as conexões existentes não serão afetadas. O Aurora leva o novo valor da configuração em conta ao tentar criar uma conexão por meio de um cluster de banco de dados. O valor padrão é 10, representando 10% do valor max_connections.

nota

Como aurora_fwd_writer_idle_timeout e aurora_fwd_writer_max_connections_pct são parâmetros de cluster de banco de dados, todas as instâncias de banco de dados em cada cluster têm os mesmos valores para esses parâmetros.

Para obter mais informações sobre o aurora_replica_read_consistency, consulte Consistência de leitura para encaminhamento de gravação.

Para obter mais informações sobre grupos de parâmetros de banco de dados, consulte Grupos de parâmetros para Amazon Aurora.

Identificar transações e consultas encaminhadas

Você pode usar a tabela information_schema.aurora_forwarding_processlist para identificar transações e consultas encaminhadas. Para obter mais informações sobre essa tabela, consulte information_schema.aurora_forwarding_processlist.

O exemplo a seguir mostra todas as conexões encaminhadas em uma instância de banco de dados do gravador.

mysql> select * from information_schema.AURORA_FORWARDING_PROCESSLIST where IS_FORWARDED=1 order by REPLICA_SESSION_ID; +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | IS_FORWARDED | REPLICA_SESSION_ID | REPLICA_INSTANCE_IDENTIFIER | REPLICA_CLUSTER_NAME | REPLICA_REGION | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+---------------------------------------+ | 648 | myuser | IP_address:port1 | sysbench | Query | 0 | async commit | UPDATE sbtest58 SET k=k+1 WHERE id=4802579 | 1 | 637 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | | 650 | myuser | IP_address:port2 | sysbench | Query | 0 | async commit | UPDATE sbtest54 SET k=k+1 WHERE id=2503953 | 1 | 639 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+

Na instância de banco de dados do leitor de encaminhamento, você pode ver os segmentos associados a essas conexões de banco de dados do gravador executando SHOW PROCESSLIST. Os valores REPLICA_SESSION_ID no gravador, 637 e 639, são iguais aos valores Id no leitor.

mysql> select @@aurora_server_id; +---------------------------------+ | @@aurora_server_id | +---------------------------------+ | my-db-cluster-instance-2 | +---------------------------------+ 1 row in set (0.00 sec) mysql> show processlist; +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | 637 | myuser | IP_address:port1 | sysbench | Query | 0 | async commit | UPDATE sbtest12 SET k=k+1 WHERE id=4802579 | | 639 | myuser | IP_address:port2 | sysbench | Query | 0 | async commit | UPDATE sbtest61 SET k=k+1 WHERE id=2503953 | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ 12 rows in set (0.00 sec)