Estou usando o MySQL-5.1.50 com uma configuração de replicação mestre-escravo.
Na maioria das vezes, o escravo fica para trás do mestre.
Quando executo show processlist;
, não há nenhuma consulta demorando muito tempo. Eu ativei slow_log
também. No entanto, ele não encontra nenhuma consulta de execução lenta.
O escravo está continuamente dando alertas de que a replicação está segundos atrás do mestre. Às vezes, o tempo de latência aumenta.
Como diagnosticar a causa do problema?
Preciso de ajuda urgente, pois esse problema persistiu nos últimos 20 dias.
mysql
replication
adeela sahar
fonte
fonte
Respostas:
O Seconds_Behind_Master é realmente como ver o passado através da viagem no tempo.
Pense nisso desta maneira:
Da mesma maneira, parece que o Mestre está processando muitas consultas ao mesmo tempo.
Você olha para o Escravo, corre
SHOW SLAVE STATUS\G
e ele diz 200 paraSeconds_Behind_Master
. Como é calculado esse número? Hora do relógio do escravo (UNIX_TIMESTAMP (NOW ()) - TIMESTAMP da consulta quando ela foi concluída e registrada no log binário do mestre.Há outra métrica a considerar além disso
Seconds_Behind_Master
. Essa métrica é chamadaRelay_Log_Space
. Isso representa a soma de todos os bytes para todos os arquivos de retransmissão no escravo. Por padrão, o maior log de retransmissão única é limitado a 1 GB. SeRelay_Log_Space
for menor que 1 GB, isso indica que muitas consultas de longa execução são executadas no Master em paralelo. Infelizmente, devido ao encadeamento SQL da Replicação de natureza de thread único, as consultas são executadas uma atrás da outra.Por exemplo, suponha que você tenha o seguinte cenário no mestre:
Quando o Escravo lê essas consultas em seu log de retransmissão e as processa uma a uma
Seconds_Behind_Master
Em relação ao Log lento, o padrão para long_query_time é 10 segundos. Se todas as suas consultas nos logs de retransmissão forem inferiores a 10 segundos, você nunca detectará nada no Log de consultas lentas.
Tenho as seguintes recomendações para os servidores Mestre e Escravo
Apr 26, 2012
: O desempenho da CPU é relevante para um servidor de banco de dados?Sep 20, 2011
: Multi cores e desempenho do MySQLSep 12, 2011
: Possível fazer o MySQL usar mais de um núcleo?May 26, 2011
: Sobre o desempenho de bancos de dados de thread único versus multithreadSeconds_Behind_Master
.RESOLUÇÃO DE PROBLEMAS
Se você deseja ver as consultas que causam o atraso da replicação, faça o seguinte:
SHOW SLAVE STATUS\G
Relay_Log_File
STOP SLAVE;
START SLAVE;
cd /var/lib/mysql
ou onde quer que os logs de retransmissão sejam gravadosPor exemplo, vamos fazer
SHOW SLAVE STATUS\G
Se eu executar
STOP SLAVE; START SLAVE;
, o log de retransmissão será fechado e um novo será aberto. No entanto, você querrelay-bin.000030
.Despejar o conteúdo da seguinte maneira:
Agora você pode ver as consultas que o escravo está tentando processar no momento. Você pode usar essas consultas como ponto de partida para o ajuste.
fonte
Qual formato de log binário você está usando? Você está usando ROW ou STATEMENT?
"
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
"Se você estiver usando ROW como um formato de log de bin, verifique se todas as suas tabelas possuem Chave Primária ou Única:
SELECT t.table_schema,t.table_name,engine FROM information_schema.tables t INNER JOIN information_schema .columns c on t.table_schema=c.table_schema and t.table_name=c.table_name and t.table_schema not in ('performance_schema','information_schema','mysql') GROUP BY t.table_schema,t.table_name HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0;
Se você executar, por exemplo, uma instrução de exclusão no mestre para excluir 1 milhão de registros em uma tabela sem PK ou chave exclusiva, apenas uma verificação completa da tabela ocorrerá no lado do mestre, o que não é o caso do escravo.
Quando o ROW binlog_format está sendo usado, o MySQL grava as alterações das linhas nos logs binários (não como uma declaração como STATEMENT binlog_format) e essa alteração será aplicada no lado do escravo linha por linha, o que significa que uma verificação de tabela completa de 1 milhão ocorrerá no escravo para refletir apenas uma instrução de exclusão no mestre e isso está causando um problema de atraso no escravo.
fonte
O valor seconds_behind_master em SHOW SLAVE STATUS é a diferença entre a hora do sistema no mestre, que foi armazenada quando o evento foi originalmente executado e registrado no log binário ... e a hora do sistema no escravo quando o evento é executado lá.
Segundos atrás do mestre fornecerão valores incorretos se os relógios dos dois sistemas não estiverem sincronizados.
fonte