J'utilise MySQL-5.1.50 avec une configuration de réplication maître-esclave.
La plupart du temps, l'esclave est en retard sur le maître.
Lorsque je cours show processlist;
, aucune requête ne prend beaucoup de temps. J'ai également activé slow_log
. Cependant, il ne trouve aucune requête à exécution lente.
L'esclave avertit en permanence que la réplication est à quelques secondes du maître. Parfois, le temps de latence augmente.
Comment diagnostiquer la cause du problème?
J'ai besoin d'une aide urgente, car ce problème persiste depuis 20 jours.
mysql
replication
adeela sahar
la source
la source
Réponses:
Le Seconds_Behind_Master est vraiment comme regarder le passé via un voyage dans le temps.
Pense-y de cette façon:
De la même manière, il semble que le maître traite beaucoup de requêtes en même temps.
Vous regardez en arrière l'esclave, courez
SHOW SLAVE STATUS\G
et ça dit 200 pourSeconds_Behind_Master
. Comment ce nombre est-il calculé? Heure de l'horloge de l'esclave (UNIX_TIMESTAMP (NOW ()) - TIMESTAMP de la requête lorsqu'elle a été terminée et enregistrée dans le journal binaire du maître.Il y a une autre métrique à regarder en plus
Seconds_Behind_Master
. Cette métrique est appeléeRelay_Log_Space
. Cela représente la somme de tous les octets pour tous les fichiers relais sur l'esclave. Par défaut, le plus grand journal de relais unique est limité à 1 Go. SiRelay_Log_Space
est inférieur à 1 Go, cela indique que de nombreuses requêtes longues exécutées sur le maître en parallèle. Malheureusement, en raison du thread SQL de la réplication à un seul thread, les requêtes sont exécutées les unes derrière les autres.Par exemple, supposons que vous ayez le scénario suivant sur le maître:
Lorsque l'esclave lit ces requêtes dans son journal de relais et les traite une par une
Seconds_Behind_Master
Concernant le journal lent, la valeur par défaut pour long_query_time est de 10 secondes. Si toutes vos requêtes dans les journaux de relais sont inférieures à 10 secondes, vous n'attraperez jamais rien dans le journal des requêtes lentes.
J'ai les recommandations suivantes pour les serveurs maître et esclave
Apr 26, 2012
: Les performances du processeur sont-elles pertinentes pour un serveur de base de données?Sep 20, 2011
: Multi-cœurs et performances MySQLSep 12, 2011
: Possible de faire utiliser MySQL plus d'un core?May 26, 2011
: À propos des performances des bases de données monothread et multithreadSeconds_Behind_Master
.DÉPANNAGE SUPPLÉMENTAIRE
Si vous souhaitez voir les requêtes provoquant le retard de replciation, procédez comme suit:
SHOW SLAVE STATUS\G
Relay_Log_File
STOP SLAVE;
START SLAVE;
cd /var/lib/mysql
ou partout où les journaux de relais sont écritsPar exemple, faisons
SHOW SLAVE STATUS\G
Si je cours
STOP SLAVE; START SLAVE;
, le journal du relais se ferme et un nouveau est ouvert. Pourtant, tu veuxrelay-bin.000030
.Vider le contenu comme suit:
Vous pouvez maintenant voir les requêtes que l'esclave essaie actuellement de traiter. Vous pouvez utiliser ces requêtes comme point de départ pour l'optimisation.
la source
Quel format de journal binaire utilisez-vous? Utilisez-vous ROW ou STATEMENT?
"
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
"Si vous utilisez ROW comme format binlog, assurez-vous que toutes vos tables ont une clé primaire ou unique:
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;
Si vous exécutez par exemple une instruction de suppression sur le maître pour supprimer 1 million d'enregistrements sur une table sans PK ou clé unique, alors un seul balayage complet de la table aura lieu du côté du maître, ce qui n'est pas le cas de l'esclave.
Lorsque ROW binlog_format est utilisé, MySQL écrit les modifications de lignes dans les journaux binaires (pas sous la forme d'une instruction comme STATEMENT binlog_format) et cette modification sera appliquée ligne par ligne de l'esclave, ce qui signifie qu'un scan complet de 1 million de tables aura lieu sur l'esclave pour ne refléter qu'une seule instruction de suppression sur le maître et cela cause un problème de retard de l'esclave.
la source
La valeur seconds_behind_master dans SHOW SLAVE STATUS est la différence entre l'heure système sur le maître, qui a été stockée lorsque l'événement a été initialement exécuté et enregistré dans le journal binaire ... et l'heure système sur l'esclave lorsque l'événement y est exécuté.
Les secondes derrière master donneront des valeurs incorrectes si les horloges des deux systèmes ne sont pas synchronisées.
la source