Quero saber por que recebo uma mensagem de erro somente para leitura quando meu cluster de banco de dados compatível com MySQL do Amazon Aurora falha.
Breve descrição
Quando um cluster de banco de dados compatível com o Aurora MySQL passa por um failover Multi-AZ, os endpoints do cluster são atualizados automaticamente. O gravador antigo é reinicializado e colocado no modo somente leitura e, em seguida, o Aurora promove uma réplica existente para um gravador. Os endpoints refletem essa mudança e apontam para os novos perfis de escritor e leitor.
Você pode receber uma mensagem de erro somente para leitura ao usar o perfil de leitor para realizar uma das seguintes operações por meio de um nó existente:
- Operação de linguagem de definição de dados (DDL)
- Operação de linguagem de manipulação de dados (DML)
- Operação de linguagem de controle de dados (DCL)
Resolução
Determine se o perfil é somente para leitura
Para verificar se o perfil é somente para leitura, use a variável innodb_read_only.
Exemplo de saída:
mysql> show variables where variable_name='innodb_read_only';+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_read_only | ON |
+------------------+-------+
1 row in set (0.01 sec)
Utilize o endpoint do cluster writer
O perfil de uma instância de banco de dados em um cluster Aurora MySQL pode mudar. É uma prática recomendada usar o endpoint do gravador de cluster para garantir que você sempre aponte para o gravador mais recente. Se você usa um endpoint de instância de banco de dados ou um endereço IP direto, talvez não saiba que ocorre um failover. Ao se reconectar ao mesmo host, você recebe um erro somente de leitura e não pode realizar alterações de DDL ou DML.
Não sobrecarregue o cache DNS
Se você não estiver usando um smart driver, dependerá das atualizações e da propagação do registro DNS depois de ocorrer um evento de failover. As zonas DNS do Aurora MySQL usam um curto tempo de vida útil (TTL) de 5 segundos. Suas configurações de rede e cliente não podem aumentar o TTL. O cache DNS pode ocorrer em várias camadas de uma arquitetura, como o sistema operacional (SO), a camada de rede e o contêiner da aplicação. Se houver um cache de DNS não intencional por mais de 5 segundos, você poderá se reconectar ao gravador antigo após um failover.
As Máquinas Virtuais Java (JVM) podem sobrecarregar o cache DNS. Quando a JVM determina um nome de host em um endereço IP, ela armazena o endereço IP em cache por um período de tempo especificado. Em algumas configurações, o TTL padrão da JVM atualiza as entradas de DNS somente quando a JVM é reiniciada e pode causar erros de somente leitura após o failover. Para resolver esse problema, defina manualmente um pequeno TTL para que as entradas de DNS sejam atualizadas periodicamente.
Use o driver JDBC avançado da AWS
Os endpoints do cluster de banco de dados Aurora MySQL propagam automaticamente as atualizações de registros DNS. Quando ocorre um evento no banco de dados, você pode ter um atraso nas atualizações do registro DNS. Quando isso acontece, a aplicação manipula o evento.
O driver Wrapper AWS Advanced JDBC (Java Database Connectivity) usa a topografia do cluster de banco de dados por meio da tabela de metadados INFORMATION_SCHEMA.REPLICA_HOST_STATUS. Como a tabela está quase em tempo real, o driver Wrapper JDBC avançado da AWS direciona as conexões para o perfil apropriado. Ele também equilibra a carga nas réplicas existentes. Use o padrão de proxy em Java para implementar o Wrapper JDBC avançado da AWS. Você deve adicionar os drivers nativos do Aurora MySQL como dependências. Para obter mais informações, consulte Padrão de proxy em Java no site da Baeldung. É possível baixar o Wrapper JDBC avançado da AWS no site do GitHub.
Para obter mais informações, consulte Obtenha um segundo ou menos de tempo de inatividade com o driver Wrapper JDBC avançado ao atualizar clusters de banco de dados Multi-AZ do Amazon RDS.
Observação: o cache excessivo de DNS pode afetar o driver Wrapper JDBC avançado da AWS. Para obter mais informações, consulte Melhorar a disponibilidade de aplicações no Amazon Aurora.
Teste a instância à qual você está conectado
Se você não estiver usando um driver inteligente, teste a instância depois de estabelecer uma nova conexão. Para testar se você está conectado à instância do escritor, use a variável @@innodb_read_only. Se você receber um valor de 0, estará conectado ao gravador.
Exemplo de saída:
mysql> select @@innodb_read_only;+--------------------+
| @@innodb_read_only |
+--------------------+
| 0 |
+--------------------+
1 row in set (0.00 sec)
Informações relacionadas
Manual do administrador do banco de dados Amazon Aurora MySQL
Conexões de endpoints do Amazon Aurora