Por que recebi um erro de somente leitura após uma falha em um cluster de banco de dados Amazon Aurora?

4 minuto de leitura
0

Estou usando um cluster de banco de dados Amazon Aurora e estou recebendo o seguinte erro após um failover: “O servidor MySQL está sendo executado com a opção --read-only, portanto não pode executar essa instrução” Como posso resolver esse erro?

Breve descrição

Quando um cluster de banco de dados Amazon Aurora sofre um failover Multi-AZ, os endpoints do cluster são atualizados automaticamente para refletir e apontar para os perfis recém-designados de Writer e Reader. O antigo Writer é reinicializado e, em seguida, colocado em um modo somente de leitura enquanto uma réplica existente é promovida para se tornar um Writer.

Se você receber uma mensagem de erro somente para leitura, isso significa que você está tentando realizar uma operação de linguagem de definição de dados (DDL), linguagem de manipulação de dados (DML) ou linguagem de controle de dados (DCL) por meio de um nó existente que tem o perfil de Reader. No Aurora MySQL, você pode confirmar isso verificando a variável innodb_read_only, conforme abaixo:

mysql> show variables where variable_name='innodb_read_only';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | ON    |
+------------------+-------+
1 row in set (0.01 sec)

Resolução

Utilize o endpoint do cluster Writer

Como o perfil de uma instância de banco de dados em um cluster do Aurora pode mudar, é uma prática recomendada usar o endpoint do cluster Writer para garantir que você esteja sempre apontando para o Writer mais recente. Se você usar o endpoint da instância de banco de dados ou um endereço IP direto, talvez não saiba que ocorreu um failover e receberá uma mensagem de somente leitura se você se reconectar ao mesmo host. Isso impedirá realizar qualquer alteração de DDL/DML, conforme pretendido.

Não sobrecarregue o cache DNS

Se você não estiver usando um smart driver, então você depende das atualizações e da propagação do registro DNS depois de ocorrer um evento de failover. As zonas DNS do Aurora usam um time-to-live (TTL) curto de 5 segundos, por isso é importante que suas configurações de rede e de cliente não aumentem ainda mais isso. O cache DNS pode ocorrer em várias camadas de uma arquitetura, como o sistema operacional (OS), a camada de rede e o contêiner do aplicativo. É importante que você entenda como cada uma dessas camadas é configurada. Se houver um cache de DNS não intencional além do TTL de 5 segundos, é possível que você se reconecte ao Writer antigo após um failover.

As Máquinas Virtuais Java (JVM) podem sobrecarregar o cache DNS sem limites. 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 (TTL). Em algumas configurações, o TTL padrão da JVM é definido para nunca atualizar as entradas de DNS até que a JVM seja reiniciada. Isso pode causar erros de somente leitura após um failover. Nesse caso, é importante definir manualmente um pequeno TTL para que ele seja atualizado periodicamente.

Usar um Smart Driver

Os endpoints do cluster de banco de dados do Amazon Aurora propagam atualizações de registros DNS automaticamente, mas o processo não acontece de forma instantânea. Isso pode causar atrasos na resposta a um evento que ocorreu no banco de dados e o evento pode ser tratado pelo aplicativo. Um Smart Driver usa a topografia do cluster de banco de dados por meio da tabela de metadados INFORMATION_SCHEMA.REPLICA_HOST_STATUS, quase em tempo real. Isso ajuda a direcionar conexões ao perfil adequado e a equilibrar a carga entre as réplicas existentes. MariaDB Connector/J é um exemplo de Smart Driver de terceiros que dispõe de suporte para o Aurora MySQL.

Observação: Smart Drivers também podem ser afetados por sobrecarga de cache DNS.

Testar a qual instância você está conectado

Conforme mencionado nas melhores práticas do Manual de gerenciamento de conexões do Aurora, se você não estiver usando um Smart Driver, teste e identifique a que instância você está conectado após estabelecer uma nova conexão. Isso mostra se você está conectado à instância correta. Você pode verificar se está conectado à instância do Writer ou ao Aurora Reader usando a variável @@innodb_read_only. Este exemplo mostra um valor de 0, o que significa que você está conectado ao Writer.

mysql> select @@innodb_read_only;
+--------------------+
| @@innodb_read_only |
+--------------------+
| 0                  |
+--------------------+
1 row in set (0.00 sec)

Informações relacionadas

Gerenciamento de conexões do Amazon Aurora

Configurar o TTL de JVM para pesquisas de nome de DNS

Manual de gerenciamento de conexões de DBAs

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos