Solucionar problemas de uma réplica de leitura do MySQL - Amazon Relational Database Service

Solucionar problemas de uma réplica de leitura do MySQL

Para instâncias de bancos de dados MySQL, em alguns casos as réplicas de leitura apresentam erros de replicação ou inconsistências de dados entre a réplica de leitura e sua fonte da instância de banco de dados. Esse problema ocorre quando alguns eventos de log binário (binlog) ou logs redo do InnoDB não são liberados durante uma falha da réplica de leitura ou da instância de banco de dados de origem. Nesses casos, exclua e recrie manualmente as réplicas de leitura. Você pode reduzir a chance disso acontecer definindo os seguintes valores de parâmetro: sync_binlog=1 e innodb_flush_log_at_trx_commit=1. Essas configurações podem reduzir a performance, portanto, teste o impacto delas antes de implantar as alterações em um ambiente de produção.

Atenção

No grupo de parâmetros associado à fonte da instância de banco de dados, recomendamos manter esses valores de parâmetros: sync_binlog=1 e innodb_flush_log_at_trx_commit=1. Esses parâmetros são dinâmicos. Se você não quiser usar essas configurações, recomendamos definir temporariamente esses valores antes de executar qualquer operação na fonte da instância de banco de dados que possa fazer com que ela seja reiniciada. Essas operações incluem, entre outras, a reinicialização, a reinicialização com failover, a atualização da versão do banco de dados e a alteração da classe de instância de banco de dados ou seu armazenamento. A mesma recomendação se aplica à criação de novas réplicas de leitura para a fonte da instância de banco de dados.

Não seguir essa orientação aumenta o risco de réplicas de leitura apresentarem erros de replicação ou inconsistências de dados (ou ambas) entre a réplica de leitura e sua fonte da instância de banco de dados.

As tecnologias de replicação do MySQL são assíncronas. Como são assíncronas, são esperados ocasionais aumentos de BinLogDiskUsage na instância de banco de dados de origem e ReplicaLag na réplica de leitura. Por exemplo, um volume elevado de operações de gravação para a instância de banco de dados de origem pode ocorrer em paralelo. Por outro lado, as operações de gravação na réplica de leitura são serializadas usando um único thread de E/S, o que pode ocasionar um atraso entre a instância de origem e a réplica de leitura. Para obter mais informações sobre réplicas somente leitura na documentação do MySQL, consulte Detalhes de implantação da replicação.

Você pode fazer várias coisas para reduzir o atraso entre as atualizações de uma instância de banco de dados de origem e as atualizações subsequentes da réplica de leitura, como o seguinte:

  • Dimensionar uma réplica de leitura para ter um tamanho de armazenamento e uma categoria de instância de banco de dados comparáveis à da instância de banco de dados de origem.

  • Assegurar-se de que as configurações de parâmetros nos grupos de parâmetros de banco de dados utilizados pela instância de banco de dados de origem e pela réplica de leitura são compatíveis. Para mais informações e um exemplo, consulte a discussão sobre o parâmetro max_allowed_packet posteriormente nesta seção.

O Amazon RDS monitora o status de replicação de suas réplicas de leitura e atualiza o campo Replication State da instância da réplica de leitura para Error caso a replicação seja interrompida por qualquer motivo. Um exemplo pode ser se as consultas DML forem executadas no seu conflito de réplica de leitura com as atualizações feitas na instância de banco de dados de origem.

Você pode analisar os detalhes do erro associado gerado pelo mecanismo do MySQL visualizando o campo Replication Error. Os eventos que indicam o status da réplica de leitura também são gerados, incluindo RDS-EVENT-0045, RDS-EVENT-0046 e RDS-EVENT-0047. Para mais informações sobre eventos e como se inscrever neles, consulte Trabalhar com a notificação de eventos do Amazon RDS. Se for retornada uma mensagem de erro do MySQL, analise o número de erro na documentação de mensagens de erro do MySQL.

Um problema comum que pode causar erros de replicação é quando o valor do parâmetro max_allowed_packet para uma réplica de leitura é menor que o do parâmetro max_allowed_packet para a instância de banco de dados de origem. O parâmetro max_allowed_packet é um parâmetro personalizado que você pode definir em um grupo de parâmetros de banco de dados. Use o max_allowed_packet para especificar o tamanho máximo do código DML que pode ser executado no banco de dados. Em alguns casos, o valor do max_allowed_packet no grupo de parâmetros de banco de dados associado a uma réplica de leitura é menor do que o valor de max_allowed_packet no grupo de parâmetros de banco de dados associado à instância de banco de dados de origem. Nesses casos, o processo de replicação pode lançar o erro Packet bigger than 'max_allowed_packet' bytes e interromper a replicação. Para corrigir o erro, faça com que a instância de banco de dados de origem e a réplica de leitura usem grupos de parâmetros de banco de dados com os mesmos valores de parâmetro max_allowed_packet

Outras situações comuns que podem causar erros de replicação incluem o seguinte:

  • A gravação em tabelas em uma réplica de leitura. Em alguns casos, é possível criar índices em uma réplica de leitura diferentes dos índices na instância de banco de dados da origem. Se você fizer isso, defina o parâmetro read_only como 0 para criar índices. Se você gravar em tabelas na réplica de leitura, isso poderá interromper a replicação se a réplica de leitura tornar-se incompatível com a instância de banco de dados de origem. Depois de realizar tarefas de manutenção na réplica de leitura, recomendamos que você defina o parâmetro read_only de volta para 1.

  • Uso de um mecanismo de armazenamento não transacional, como o MyISAM. As réplicas de leitura exigem um mecanismo de armazenamento transacional. A replicação só é compatível com o mecanismo de armazenamento InnoDB no MySQL.

  • Usando consultas não deterministas inseguras, como SYSDATE(). Para obter mais informações, consulte Determinação de instruções seguras e inseguras no registro de logs binários.

Se você acreditar que pode ignorar um erro com segurança, siga as etapas descritas na seção Ignorar o erro de replicação atual para o RDS para MySQL. Caso contrário, você pode excluir a réplica de leitura primeiro. Crie uma instância usando o mesmo identificador de instância de banco de dados para que o endpoint permaneça o mesmo que o da sua antiga réplica de leitura. Se um erro de replicação for corrigido, o Replication State mudará para replicating.