Instâncias RDS somente leitura usam a replicação assíncrona ou semissíncrona nativa do MySQL, baseada em logs, para sincronizar dados da instância primária. Esse mecanismo pode introduzir latência de replicação, causar inconsistências de dados e, caso haja acúmulo de logs, esgotar o armazenamento na instância somente leitura.
Este tópico explica como determinar se uma latência é real, identificar a causa raiz e resolvê-la.
Entenda a latência de replicação
A latência aparece no campo Seconds_Behind_Master do comando SHOW SLAVE STATUS \G, medida em segundos.
Fórmula da latência: Latência = Hora atual − Horário de commit da transação em aplicação na instância somente leitura. "Hora atual" refere-se ao momento de execução do comando SHOW SLAVE STATUS \G.
A latência se enquadra em duas categorias:
|
Latência |
Significado |
Ação |
|
≤ 1 segundo |
Causada pela precisão da amostragem ou por transações que cruzam o limite de um segundo. Não há atraso real. |
Ignorar |
|
> 1 segundo |
Causada por restrições de recursos, alto volume de gravação, transações grandes ou operações DDL |
Diagnosticar e corrigir |
Por que uma latência de 1 segundo costuma ser uma leitura falsa
O ApsaraDB RDS arredonda todos os pontos de amostragem para baixo, até o segundo mais próximo. Quando uma transação atravessa o limite de um segundo, o cálculo da latência resulta em 1 segundo, mesmo que o atraso real seja apenas uma fração de segundo.
Exemplo:
| Transação | Commit na primária | Commit na somente leitura | Amostrado às | Latência reportada |
|---|---|---|---|---|
| Trx1 | 00:00:00,30 | 00:00:00,50 | 00:00:00,35 | 0(0,35) − 0(0,30) = 0 s |
| 00:00:00,45 | 0(0,45) − 0(0,30) = 0 s | |||
| Trx2 | 00:00:00,90 | 00:00:01,10 | 00:00:00,95 | 0(0,95) − 0(0,90) = 0 s |
| 00:00:01,05 | 1(1,05) − 0(0,90) = 1 s |
Se o intervalo de monitoramento estiver definido para 3 horas ou mais, a granularidade padrão pode chegar a 30 segundos. Para obter granularidade de 1 segundo, acesse a aba Performance Trends no console do ApsaraDB RDS e defina o intervalo de tempo para menos de 6 minutos. Para mais detalhes, consulte Usar o recurso de painel para uma instância do ApsaraDB RDS for MySQL.
Defina o limiar de latência de leitura do proxy ou da regra de alerta com valor superior a 1 segundo para evitar alarmes falsos.
Diagnosticar latência superior a 1 segundo
Execute SHOW SLAVE STATUS \G na instância somente leitura para coletar dados de diagnóstico. Compare a saída com os padrões abaixo para identificar a causa.
Padrão 1: Instância somente leitura sob pressão de recursos
A instância somente leitura usa uma thread de I/O e uma thread SQL para replicar dados. Ambas competem por recursos de I/O. Se as operações de entrada e saída por segundo (IOPS) da instância já estiverem altas devido a consultas de leitura, a replicação sofre atrasos.
Como confirmar: Na página Monitoring and Alerting da instância somente leitura no console do ApsaraDB RDS, verifique a utilização de CPU, o uso de memória, a largura de banda de I/O e a contagem de conexões para identificar gargalos de recursos. Compare o tipo da instância com a primária: se a instância somente leitura tiver especificações menores, essa é provavelmente a causa. Consulte Tipos de instância para instâncias somente leitura padrão do ApsaraDB RDS for MySQL e Tipos de instância para instâncias somente leitura YiTian do ApsaraDB RDS for MySQL.
Padrão 2: Alta taxa de gravação na instância primária
A instância somente leitura utiliza uma única thread para aplicar transações. Se a primária processar gravações multithread simultâneas com alta taxa de transações por segundo (TPS), o aplicador single-thread não consegue acompanhar.
Como confirmar: Visualize o TPS na página Dashboard da instância. Para mais detalhes, consulte Usar o recurso de painel para uma instância do ApsaraDB RDS for MySQL.
Padrão 3: Execução de transação grande
Quando Seconds_Behind_Master aumenta continuamente enquanto Exec_Master_Log_Pos permanece estagnado, a thread SQL aplica uma transação grande ou uma operação de linguagem de definição de dados (DDL). Operações como UPDATE, DELETE, INSERT...SELECT e REPLACE...SELECT em tabelas grandes geram volume substancial de dados de binary log. A instância somente leitura leva o mesmo tempo para concluir a transação que a primária. Por exemplo, uma exclusão de 80 segundos na primária resulta em uma exclusão de 80 segundos na instância somente leitura.
Apenas uma thread pode replicar transações para uma determinada tabela por vez, mesmo durante a replicação simultânea de várias tabelas.
Como confirmar:
Execute
SHOW SLAVE STATUS \Ge verifique seSeconds_Behind_Masteraumenta enquantoExec_Master_Log_Pospermanece inalterado.Execute
SHOW PROCESSLIST;para identificar a thread específica causadora do atraso.
Se o formato de binary logging for
ROW, executeSHOW BINARY LOGS;e verifiqueFile_size. SeFile_sizeexcedermax_binlog_size, há transações grandes presentes.
Padrão 4: Operação DDL bloqueando a replicação
Como confirmar:
Verifique se os arquivos de binary log crescem sem truncamento. Isso indica uma operação DDL em andamento.
Execute
SHOW PROCESSLIST;e verifique se o status da thread SQL mostrawaiting for table metadata lock. Em caso afirmativo, uma consulta ou transação aberta na instância somente leitura bloqueia a instrução DDL replicada da primária.Execute
SHOW ENGINE INNODB STATUS \GouSHOW OPEN TABLES;e procure tabelas comin_use = 1. Essas tabelas sofrem modificação sem chave primária, o que força a replicação linha a linha.Verifique nos logs de consultas lentas se há operações DDL como
OPTIMIZE,ALTER,REPAIReCREATE. Consulte Análise de log de consultas lentas.
Instruções DDL comuns que causam latência prolongada: CREATE INDEX, REPAIR TABLE, ALTER TABLE ADD COLUMN.
Padrão 5: Tabela sem chave primária
Tabelas com apenas um índice único contendo valor NULL e sem chave primária fazem a replicação usar o plano de execução do índice único em vez do plano do otimizador, mesmo com cláusula WHERE especificada.
Como confirmar: Use a view sys.schema_index_statistics para verificar se a tabela não tem chaves primárias e possui apenas um índice único. Verifique também se o índice único contém valor NULL.
Soluções
Antes de alterar configurações, verifique a configuração de recuperação de desastres e backup para proteger contra perda de dados. Para instâncias RDS, ative o backup de logs antes de prosseguir.
Aplique a correção correspondente à causa identificada.
Correção para o padrão 1: Atualizar o tipo da instância
Atualize a instância somente leitura para um tipo que corresponda ou supere a instância primária. Isso evita que a contenção de recursos cause atraso na replicação. Consulte Alterar as especificações de uma instância do ApsaraDB RDS for MySQL.
Correção para o padrão 2: Reduzir a pressão de gravação na primária
Se o TPS da primária permanecer consistentemente alto, divida grandes operações de gravação em lotes menores para reduzir a carga de replicação na instância somente leitura.
Correção para o padrão 3: Dividir transações grandes
Divida transações grandes em transações menores. Para operações DELETE, adicione uma cláusula WHERE para limitar o número de linhas excluídas por lote. Isso permite que a instância somente leitura processe cada transação menor rapidamente, sem acumular latência.
Correção para o padrão 4: Resolver latência relacionada a DDL
Se operações DDL causarem latência:
Agende operações DDL durante horários de baixa demanda.
Ative a expansão automática de armazenamento ou defina o limiar de expansão manual para 90% a fim de evitar esgotamento do armazenamento durante o DDL. Consulte Como dimensionar uma instância do ApsaraDB RDS?
Use o SQL Explorer para auditar regularmente instruções SQL de execução lenta. Consulte Usar o recurso SQL Explorer e Audit em uma instância do ApsaraDB RDS for MySQL.
Configure um alerta de uso de disco, configure a expansão automática de armazenamento ou atualize manualmente o tipo da instância.
Se um bloqueio de metadados impedir a replicação:
Execute
SHOW PROCESSLIST;na instância somente leitura e confirme se o status da thread SQL éwaiting for table metadata lock.Encerre a sessão bloqueante para retomar a replicação. Consulte Usar o DMS para liberar bloqueios de metadados.
Correção para o padrão 5: Adicionar uma chave primária
Adicione uma chave primária explícita a qualquer tabela que não possua uma. Isso permite que a replicação use buscas de índice eficientes em vez de varreduras completas de tabela.
Perguntas frequentes
Por que uma latência de 1 segundo aparece em algumas instâncias somente leitura, mas não em outras?
Cada instância somente leitura tem seu próprio cronograma de coleta e horário de inicialização. Se o ponto de amostragem em uma instância cruzar o limite de um segundo, ela reporta 1 segundo; caso contrário, reporta 0 segundos. Trata-se de um artefato de medição, não de uma diferença real de latência entre as instâncias.
Uma latência de 1 segundo afeta minhas cargas de trabalho?
Não. Uma latência reportada de 1 segundo não significa que a replicação esteja realmente atrasada em um segundo. Por exemplo, se a latência verdadeira for de 0,1 segundos, mas o ponto de amostragem cair em um limite de segundo, o valor reportado será de 1 segundo. Defina o limiar do proxy ou alerta acima de 1 segundo para evitar alertas desnecessários.
O que devo fazer se o erro ReplicationInterrupted aparecer ou se os alertas Slave_SQL_Running / Slave_IO_Running forem disparados?
Verifique os itens a seguir nesta ordem:
Capacidade de armazenamento: Se a instância somente leitura estiver sem armazenamento, ela não poderá gravar binary logs da primária. Verifique o uso de armazenamento na seção Usage Statistics da página Basic Information.
Latência de replicação: Se a latência exceder 5 segundos continuamente por 5 minutos, a instância dispara um alerta de interrupção de replicação. Gravações intensas ou transações grandes na primária são causas comuns. Para verificar a latência: acesse a página Basic Information da instância somente leitura, clique em Monitoring and Alerts no painel de navegação à esquerda, clique na aba Standard Monitoring e visualize a métrica Replication Latency of Secondary Instances(second).
-
Consultas lentas: Consultas lentas na instância somente leitura aumentam significativamente a latência de replicação. Verifique os logs de consultas lentas por meio de um destes caminhos:
Painel de navegação à esquerda → Logs → Aba Slow Query Logs
Painel de navegação à esquerda → Autonomy Services → Slow Query Logs
Se nenhuma dessas causas se aplicar, o sistema detectará e resolverá a interrupção automaticamente.