Ich verwende MySQL-5.1.50 mit einem Master-Slave-Replikationssetup.
Meistens bleibt der Slave hinter dem Master zurück.
Wenn ich laufe show processlist;
, gibt es keine Abfrage, die lange dauert. Ich habe auch aktiviert slow_log
. Es wird jedoch keine langsam laufende Abfrage gefunden.
Der Slave gibt ständig Warnungen aus, dass die Replikation Sekunden hinter dem Master liegt. Manchmal erhöht sich die Verzögerungszeit.
Wie diagnostiziere ich die Ursache des Problems?
Ich brauche dringend Hilfe, da dieses Problem seit 20 Tagen besteht.
mysql
replication
Adeela Sahar
quelle
quelle
Antworten:
Der Seconds_Behind_Master ist wirklich so, als würde man die Vergangenheit über Zeitreisen betrachten.
Denk darüber so:
In ähnlicher Weise scheint es, dass der Master viele Anfragen gleichzeitig verarbeitet.
Du schaust zurück auf den Sklaven, rennst
SHOW SLAVE STATUS\G
und es steht 200 fürSeconds_Behind_Master
. Wie wird diese Zahl berechnet? Slave's Clock Time (UNIX_TIMESTAMP (NOW ()) - TIMESTAMP der Abfrage, als sie abgeschlossen und im Binärprotokoll des Masters aufgezeichnet wurde.Daneben gibt es noch eine andere Metrik
Seconds_Behind_Master
. Diese Metrik heißtRelay_Log_Space
. Dies ist die Summe aller Bytes für alle Relay-Dateien auf dem Slave. Standardmäßig ist das größte einzelne Relay-Protokoll auf 1 GB begrenzt. WennRelay_Log_Space
weniger als 1 GB vorhanden sind, bedeutet dies, dass viele lange laufende Abfragen parallel auf dem Master ausgeführt werden. Aufgrund des SQL-Threads der Replikation mit nur einem Thread werden Abfragen leider hintereinander ausgeführt.Angenommen, Sie haben das folgende Szenario auf dem Master:
Wenn der Slave diese Abfragen aus seinem Relay-Protokoll liest und einzeln verarbeitet
Seconds_Behind_Master
In Bezug auf das langsame Protokoll beträgt der Standardwert für long_query_time 10 Sekunden. Wenn alle Ihre Abfragen in den Relay-Protokollen weniger als 10 Sekunden dauern, werden Sie im Slow Query-Protokoll niemals etwas abfangen.
Ich habe die folgenden Empfehlungen für Master- und Slave-Server
Apr 26, 2012
: Ist die CPU-Leistung für einen Datenbankserver relevant?Sep 20, 2011
: Multi Cores und MySQL PerformanceSep 12, 2011
: Kann MySQL mehr als einen Kern verwenden?May 26, 2011
: Informationen zur Leistung von Single-Threaded- und Multithread-DatenbankenSeconds_Behind_Master
.WEITERE FEHLERSUCHE
Wenn Sie die Abfragen sehen möchten, die die Replikationsverzögerung verursachen, gehen Sie wie folgt vor:
SHOW SLAVE STATUS\G
Relay_Log_File
STOP SLAVE;
START SLAVE;
cd /var/lib/mysql
oder überall dort , wo die Relay-Protokolle geschrieben werdenZum Beispiel, lass es uns tun
SHOW SLAVE STATUS\G
Wenn ich laufe
STOP SLAVE; START SLAVE;
, wird das Relaisprotokoll geschlossen und ein neues ist geöffnet. Trotzdem willst durelay-bin.000030
.Entleeren Sie den Inhalt wie folgt:
Sie können jetzt die Abfragen sehen, die der Slave gerade zu verarbeiten versucht. Sie können diese Abfragen als Ausgangspunkt für die Optimierung verwenden.
quelle
Welches binäre Protokollformat verwenden Sie? Verwenden Sie ROW oder STATEMENT?
"
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
"Wenn Sie ROW als Binlog-Format verwenden, stellen Sie sicher, dass alle Ihre Tabellen über einen Primär- oder einen eindeutigen Schlüssel verfügen:
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;
Wenn Sie beispielsweise eine Löschanweisung auf dem Master ausführen, um 1 Million Datensätze in einer Tabelle ohne PK oder eindeutigen Schlüssel zu löschen, findet auf der Masterseite nur ein vollständiger Tabellenscan statt, was auf dem Slave nicht der Fall ist.
Wenn ROW binlog_format verwendet wird, schreibt MySQL die Zeilenänderungen in die Binärprotokolle (nicht als Anweisung wie STATEMENT binlog_format) und diese Änderung wird zeilenweise auf die Seite des Slaves angewendet, was bedeutet, dass ein 1-Millionen-vollständiger Tabellenscan durchgeführt wird Wenn der Slave nur eine Löschanweisung auf dem Master wiedergibt, führt dies zu einem Problem mit der Verzögerung des Slaves.
quelle
Der Wert von second_behind_master in SHOW SLAVE STATUS ist die Differenz zwischen der Systemzeit auf dem Master, die gespeichert wurde, als das Ereignis ursprünglich ausgeführt und im Binärprotokoll aufgezeichnet wurde ... und der Systemzeit auf dem Slave, wenn das Ereignis dort ausgeführt wird.
Sekunden hinter dem Master geben falsche Werte aus, wenn die Uhren der beiden Systeme nicht synchron sind.
quelle