As instâncias somente leitura do RDS utilizam a replicação assíncrona ou semissíncrona nativa do MySQL, baseada em logs, para manter a sincronia com a instância primária. Esse mecanismo pode introduzir atrasos, causar inconsistências temporárias de dados ou esgotar a capacidade de armazenamento da instância somente leitura devido ao acúmulo de logs binários.
Se a instância primária do RDS gerar um grande volume de logs, as instâncias somente leitura associadas poderão ser bloqueadas.
Use este documento para interpretar métricas de latência de replicação, identificar a causa raiz e resolver o problema.
Como medir a latência de replicação
O campo Seconds_Behind_Master na saída do comando SHOW SLAVE STATUS \G informa a latência de replicação em segundos.
Fórmula de latência: Latência = Hora atual − Momento em que a transação aplicada na instância somente leitura foi confirmada (committed) na instância primária do RDS
Execute o seguinte comando na instância somente leitura para verificar o status atual da replicação:
SHOW SLAVE STATUS \G
Principais campos a analisar:
|
Campo |
O que observar |
|
|
Deve exibir |
|
|
Deve exibir |
|
|
Latência de replicação em segundos. |
|
|
Se este valor permanecer inalterado enquanto |
|
|
Mensagens de erro da thread de I/O ou da thread SQL, se houver. |
Latência <= 1 segundo: quando ignorar
Uma latência reportada de 1 segundo ou menos geralmente não indica um problema real. Dois motivos comuns explicam esse comportamento:
Granularidade de monitoramento. Se o intervalo de tempo de monitoramento estiver definido para mais de 6 minutos, a granularidade padrão pode chegar a 30 segundos. O valor exibido representa uma média desse intervalo, não uma leitura instantânea. Para obter uma leitura com granularidade de 1 segundo, acesse a aba Performance Trends no console do ApsaraDB RDS e defina o intervalo de tempo de monitoramento para menos de 6 minutos.
Amostragem entre segundos. Os pontos de amostragem são sempre arredondados para baixo até o segundo mais próximo. Se uma transação começar em um segundo e terminar no seguinte, o cálculo de latência informará 1 segundo, independentemente de o atraso real ser inferior a um segundo. A tabela abaixo ilustra esse comportamento:
| Transação | Hora de confirmação na primária | Hora de confirmação na somente leitura | Hora atual | 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 |
Defina o limiar de alerta para latência de leitura como maior que 1 segundo para evitar alarmes falsos.
Latência > 1 segundo: identificação e correção da causa
Uma latência sustentada superior a 1 segundo exige investigação. As seções a seguir abordam as cinco causas mais comuns, como confirmar cada uma delas e como resolvê-las.
Antes de alterar configurações — como modificar especificações da instância ou dados — crie um snapshot ou ative o backup de logs para proteger seus dados. Caso tenha concedido permissões sobre informações sensíveis ou enviado tais informações no Console de Gerenciamento da Alibaba Cloud, recomendamos modificar esses dados o mais rápido possível. Informações sensíveis incluem nomes de usuário e senhas.
Causa 1: Especificações insuficientes da instância somente leitura
O que acontece. A replicação utiliza uma thread de I/O (para buscar logs binários na primária) e uma thread SQL (para aplicá-los localmente). Ambas competem por recursos de I/O, incluindo operações de entrada e saída por segundo (IOPS). Se a instância somente leitura não conseguir sustentar os IOPS necessários, ela ficará atrasada.
Como confirmar. No console do ApsaraDB RDS, acesse Monitoring and Alerts da instância somente leitura. Verifique se a utilização de CPU, uso de memória, largura de banda de I/O ou IOPS estão atingindo consistentemente seus limites. Você também pode visualizar o tipo da instância na seção Configuration Information da página Basic Information. Para mais informações, consulte Tipos de instância para instâncias somente leitura do ApsaraDB RDS for MySQL (x86) e Tipos de instância para instâncias somente leitura do ApsaraDB RDS for MySQL (ARM).
Como corrigir. Faça upgrade da instância somente leitura para especificações iguais ou superiores às da instância primária. Para mais informações, consulte Alterar as especificações de uma instância do ApsaraDB RDS for MySQL.
Causa 2: Alto volume de transações por segundo (TPS) na instância primária
O que acontece. Uma única thread SQL aplica todas as transações replicadas na instância somente leitura de forma serial. Se a instância primária processar um alto volume de escritas simultâneas, a instância somente leitura não conseguirá acompanhar.
Como confirmar. Acesse a página Dashboard da instância primária ou somente leitura e verifique a métrica de TPS. Para mais informações, consulte Usar o recurso de painel para uma instância do ApsaraDB RDS for MySQL.
Como corrigir. Otimize ou divida grandes transações na instância primária para reduzir o volume de escrita por transação e diminuir o tempo que cada transação ocupa a thread SQL.
Causa 3: Transações grandes na instância primária
O que acontece. Operações como UPDATE, DELETE, INSERT...SELECT e REPLACE...SELECT em grandes volumes de dados geram entradas extensas de log binário. A instância somente leitura precisa gastar o mesmo tempo aplicando a transação que a primária gastou para executá-la. Por exemplo, uma exclusão que leva 80 segundos na primária também levará 80 segundos para ser replicada.
Além disso, embora haja suporte a transações concorrentes em múltiplas tabelas, apenas uma thread replica transações em uma determinada tabela por vez, o que pode agravar o atraso.
Como confirmar. Execute SHOW SLAVE STATUS \G na instância somente leitura e observe se Seconds_Behind_Master aumenta continuamente enquanto Exec_Master_Log_Pos permanece inalterado. Em seguida, execute SHOW PROCESSLIST para identificar a thread SQL específica. Se o log binário estiver configurado para o formato ROW, verifique se algum arquivo de log binário excede o limiar de max_binlog_size:
SHOW BINARY LOGS;
Se File_size exceder max_binlog_size, é provável que transações grandes sejam a causa.
Verifique também se há contenção de bloqueio de metadados (MDL) examinando a saída de SHOW SLAVE STATUS \G em busca de estados de espera por bloqueio.
Como corrigir. Divida transações grandes em lotes menores. Por exemplo, adicione uma cláusula WHERE com limite de linhas às instruções DELETE para que cada lote processe uma quantidade gerenciável de linhas, permitindo que a instância somente leitura acompanhe o ritmo.
Causa 4: DDL de longa duração na instância primária
O que acontece. A replicação aplica instruções de Linguagem de Definição de Dados (DDL) de forma serial. Uma operação DDL em uma tabela grande — como CREATE INDEX, ALTER TABLE ADD COLUMN ou REPAIR TABLE — pode bloquear toda a replicação subsequente até sua conclusão. Consultas lentas que geram muitas tabelas temporárias agravam o problema ao consumir I/O de disco.
Separadamente, consultas em andamento ou transações abertas na instância somente leitura podem criar contenção de MDL que bloqueia instruções DDL vindas da primária.
Como confirmar.
Verifique se os arquivos de log binário estão se acumulando sem serem truncados, o que indica um backlog de DDL.
-
Execute o seguinte comando na instância somente leitura para verificar se há contenção de bloqueios:
SHOW ENGINE INNODB STATUS \G -
Execute o seguinte comando para identificar tabelas atualmente em uso:
SHOW OPEN TABLES;Tabelas com
in_use = 1estão bloqueadas e podem impedir a replicação. Revise os logs de consultas lentas em busca de operações relacionadas a DDL, como
OPTIMIZE,ALTER,REPAIReCREATE. Para mais informações, consulte Análise de log de consultas lentas.
Como corrigir.
Agende operações DDL para horários de baixa demanda.
Ative o recurso de expansão automática de armazenamento ou defina o limiar para expansão manual de armazenamento em 90%. Para mais informações, consulte Como dimensionar uma instância do ApsaraDB RDS?
Ative o SQL Explorer para monitorar regularmente o desempenho do SQL. Para mais informações, consulte Usar o recurso SQL Explorer e Audit em uma instância do ApsaraDB RDS for MySQL.
Configure alertas de uso de disco ou faça upgrade das especificações da instância. Para mais informações, consulte Alterar as especificações de uma instância do ApsaraDB RDS for MySQL.
Se uma instrução DDL da primária estiver bloqueada por um bloqueio de metadados na instância somente leitura:
Execute
SHOW PROCESSLIST;na instância somente leitura para encontrar a thread SQL aguardando um bloqueio de metadados.Encerre a sessão que detém o bloqueio para retomar a replicação. Para mais informações, consulte Usar o DMS para liberar bloqueios de metadados.
Causa 5: Tabela com índice único, mas sem chave primária
O que acontece. Quando uma tabela não possui chave primária e tem apenas um índice único contendo valores NULL, a thread SQL de replicação usa o plano de execução do índice único em vez do plano preferido pelo otimizador — mesmo que uma cláusula WHERE permita uma busca mais eficiente. Isso força varreduras completas na tabela durante a replicação, aumenta significativamente as leituras lógicas e desacelera a thread SQL.
Como confirmar. Execute a seguinte consulta na instância primária para identificar tabelas sem chave primária:
SELECT tab.table_schema AS database_name, tab.table_name
FROM information_schema.tables tab
LEFT JOIN information_schema.table_constraints tco
ON tab.table_schema = tco.table_schema
AND tab.table_name = tco.table_name
AND tco.constraint_type = 'PRIMARY KEY'
WHERE tco.constraint_type IS NULL
AND tab.table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
AND tab.table_type = 'BASE TABLE'
ORDER BY tab.table_schema, tab.table_name;
Para as tabelas retornadas pela consulta, use a view sys.schema_index_statistics para confirmar se o índice único contém valores NULL.
Como corrigir. Adicione uma chave primária explícita a qualquer tabela que não possua uma.
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 inicia seus procedimentos de coleta em momentos ligeiramente diferentes. Se um ponto de amostragem coincidir com a virada de um segundo, o sistema reportará uma latência de 1 segundo; caso contrário, a latência será informada como 0 segundos. Trata-se de um artefato de medição, não de uma diferença real no desempenho da replicação. Para detalhes, consulte Latência <= 1 segundo: quando ignorar.
Uma latência de 1 segundo significa que minha instância está afetada?
Não. Uma latência reportada de 1 segundo não significa que ocorreu um atraso real. O valor reflete o arredondamento do cálculo, e não um atraso genuíno de sincronização. Defina o limiar de latência de leitura do seu proxy ou alerta como maior que 1 segundo para filtrar esses falsos positivos.
O que fazer quando o erro ReplicationInterrupted é exibido ou quando um alerta Slave_SQL_Running ou Slave_IO_Running é acionado?
Verifique os itens a seguir nesta ordem:
Capacidade de armazenamento. Se a instância somente leitura ficar sem espaço de armazenamento, ela não conseguirá gravar os logs binários recebidos. 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 continuamente 5 segundos dentro de uma janela de 5 minutos, um alerta será acionado. Alto volume de escrita ou transações grandes na primária são as causas mais prováveis. Para visualizar a latência atual, acesse Monitoring and Alerts > Standard Monitoring e verifique a métrica Replication Latency of Secondary Instances(second).
Logs de consultas lentas. Consultas lentas na instância somente leitura degradam o desempenho da thread SQL e podem amplificar o atraso de replicação. Verifique os logs em Logs > Slow Query Logs ou acesse Autonomy Services > Slow Query Logs.
Se nenhuma das opções acima se aplicar, o sistema detectará e resolverá automaticamente a interrupção da replicação.