Vorwort Als DBA werden Sie bei Ihrer Arbeit häufig auf Verzögerungen bei der MySQL-Master-Slave-Synchronisierung stoßen. Diese langsamen Synchronisierungsprobleme haben tatsächlich viele Ursachen. Sie können durch Netzwerkprobleme zwischen Master und Slave, Probleme mit der Netzwerkbandbreite, große Transaktionen oder Verzögerungen durch Single-Thread-Replikation verursacht werden. Ich bin heute auf ein Problem gestoßen. Mysql meldete ständig Fehler und die Verzögerung bei der Master-Slave-Synchronisierung war zu groß oder falsch. In diesem Artikel erfahren Sie mehr über das Mechanismusprinzip der Master-Slave-Synchronisierung sowie Ideen zur Fehlerbehebung. Fehlermanifestation Die intuitivste Leistung ist: mysql> Slave-Status anzeigen\G; // Status 1 Seconds_Behind_Master: NULL // Status 2 Sekunden_Hinter_Master: 0 // Status 3 Sekunden_Hinter_Master: 79 Bei kontinuierlichen Abfragen ist der Attributwert meistens 0 und gelegentlich erscheint ein verzögerter Wert wie Null oder 79. Dies führt dazu, dass die Überwachung der Master-Slave-Synchronisierungsverzögerung weiterhin Alarm gibt. Ursachen und Lösungen Die Server-IDs mehrerer Backup-Server sind gleich, was dazu führt, dass der Host über längere Zeit keine Verbindung zu einem Backup-Server herstellen kann und somit nicht normal synchronisiert werden kann. Starten Sie die Datenbank nach der Änderung der Server-ID neu, um sie wiederherzustellen. Master-Slave-Synchronisationsmechanismus Die MySQL Master-Slave-Synchronisierung, auch Replikation genannt, ist eine integrierte Clusterlösung mit hoher Verfügbarkeit und Leistung mit den folgenden Hauptfunktionen:
Die Master-Slave-Synchronisation gliedert sich in 3 Schritte:
Bei der Master-Slave-Synchronisation handelt es sich um eine asynchrone Echtzeitsynchronisation, bei der zwar in Echtzeit übertragen wird, es jedoch zu einer Verzögerung bei der Ausführung kommt. Wenn der Master-Server stark ausgelastet ist, erhöht sich die Verzögerung entsprechend. Aus der obigen Abbildung können Sie erkennen, dass insgesamt 3 Threads erforderlich sind:
MySQL-Threads anzeigen Wir können Status des Hosts: Status der Standby-Maschine: Wie Sie sehen, besteht meine Clusterarchitektur aus 1 Host und 4 Standby-Maschinen, sodass es im Host 4 Synchronisierungsthreads gibt (alle Binlog-Daten wurden an die Standby-Maschine gesendet und warten auf Binlog-Protokollaktualisierungen) und 1 Anzeigebefehlsthread (vollständige Prozessliste anzeigen). Auf der Standby-Maschine gibt es 1 Anzeigebefehls-Thread, 1 E/A-Thread (der darauf wartet, dass der Master Synchronisierungsdatenereignisse sendet) und 1 SQL-Thread (der alle Relay-Protokolle gelesen hat und darauf wartet, dass der E/A-Thread ihn aktualisiert). Synchronisierungsstatus anzeigen Da die Master-Slave-Synchronisierung asynchron und in Echtzeit erfolgt, kommt es zu Verzögerungen. Wir können show slave status; verwenden, um die Synchronisierungsverzögerung auf dem Standby-Rechner anzuzeigen: Einige Eigenschaften, auf die wir bei der Master-Slave-Synchronisation achten müssen, haben wir rot markiert:
Sie können auch den Befehl „show master status;“ verwenden, um den Laufstatus des Masterservers anzuzeigen: Normaler Master-Slave-Synchronisierungsstatus:
Fehlerbehebung Nachdem wir den Master-Slave-Synchronisationsmechanismus verstanden haben, schauen wir uns das Problem an, auf das wir heute gestoßen sind. Indem wir den Status der Standby-Maschine überprüfen, beobachten wir mehrere Schlüsselattributwerte in drei Zuständen: mysql> Slave-Status anzeigen\G; #Zustand 1: Slave_IO_State: Wiederverbindung nach fehlgeschlagenem Lesen des Master-Ereignisses Slave_IO_Running: Nein Slave_SQL_Running: Ja Seconds_Behind_Master: NULL #Zustand 2: Slave_IO_State: Wartet darauf, dass der Master ein Ereignis sendet Slave_IO_Running: Ja Slave_SQL_Running: Ja Sekunden_Hinter_Master: 0 #Staat drei: Slave_IO_State: Master-Ereignis in die Relay-Log-Warteschlange einreihen Slave_IO_Running: Ja Slave_SQL_Running: Ja Sekunden_Hinter_Master: 636 Durch den Statusübergang des MySQL-Master-Slave-Replikationsthreads können wir die unterschiedlichen Bedeutungen der drei Status erkennen: # Status 1# Der Thread versucht, die Verbindung zum Masterserver wiederherzustellen. Wenn die Verbindung wiederhergestellt ist, ändert sich der Status in „Warten auf Senden des Ereignisses durch den Master“. Wiederherstellen der Verbindung nach einem fehlgeschlagenen Lesen des Master-Ereignisses # Status 2# Der Thread hat eine Verbindung zum primären Server hergestellt und wartet auf das Eintreffen binärer Protokollereignisse. Wenn der primäre Server im Leerlauf ist, kann es länger dauern. Wenn die Wartezeit länger als slave_read_timeout Sekunden ist, tritt ein Timeout auf. An diesem Punkt betrachtet der Thread die Verbindung als unterbrochen und versucht, die Verbindung wiederherzustellen. Warten auf das Senden des Ereignisses durch den Master # Zustand drei # Der Thread hat ein Ereignis gelesen und kopiert es in das Relay-Protokoll, damit es vom SQL-Thread verarbeitet werden kann. Einreihen des Master-Ereignisses in das Relay-Protokoll Hier können wir vermuten, dass der Slave-Server aus irgendeinem Grund immer wieder die Verbindung zum Master-Server trennt und versucht, die Verbindung wiederherzustellen, und die Verbindung dann nach erfolgreicher Wiederherstellung erneut trennt. Werfen wir einen Blick auf die Funktionsweise des Hosts: Wir haben festgestellt, dass das Problem auf zwei Rechnern auftrat, 10.144.63.* und 10.144.68.*. Wir haben das Fehlerprotokoll eines davon überprüft:
Nach einer Google-Suche nach dem Stichwort „Slave: received end packet from server, apparent master shutdown:“ erfährt man im Artikel „Confusing MySQL Replication Error Message“, dass die Ursache darin liegt, dass die Server-IDs der beiden Standby-Server dupliziert sind.
Fehlerbehebungen Nachdem wir das Problem lokalisiert hatten, überprüften wir, ob eine Duplizierung vorlag, und stellten fest, dass die Felder auf den beiden Sicherungsmaschinen tatsächlich identisch waren: vim meine.cnf #Replikation log-bin=mysql-bin # Diese Zufallszahl ist dieselbe wie Server-ID=177230069 sync_binlog=1 Ändern Sie eine andere Nummer, speichern Sie, starten Sie den MySQL-Prozess neu und der Alarm wird wiederhergestellt. Zusammenfassen Letztendlich ist die Lösung für dieses Problem sehr einfach, aber der Wechsel von anfänglicher Verwirrung zu klaren Ideen am Ende ist bei der Fehlerbehebung üblich. Der Hauptnutzen dieses Artikels besteht darin, dass er Ihnen den Mechanismus der Master-Slave-Synchronisierung und die Ideen zur Problemverfolgung näherbringt. Ich hoffe, dass wir die Probleme, die uns durch die Master-Slave-Synchronisierung entstehen, beim nächsten Mal schnell lösen können. Nun, das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Verweise
Das könnte Sie auch interessieren:
|
<<: Verwenden Sie nginx, um virtuelle Hosts auf Domänennamenbasis zu konfigurieren
>>: Easyswoole Ein-Klick-Installationsskript und Pagoden-Installationsfehler
Kommen wir ohne weitere Umschweife direkt zum Cod...
Vorwort Wenn der Code ausgeführt wird und ein Feh...
Logpoint-basierte Replikation 1. Erstellen Sie ei...
Inhaltsverzeichnis Vorwort Tatsächlicher Kampf 1....
Die -9999-Pixel-Bildersetzungstechnologie ist seit...
In Projekten kommt es häufig vor, dass eine Liste...
Dies ist ein Betrugsschema für Abstimmungswebsite...
Vor Kurzem habe ich gelernt, mit Nginx statische ...
Parallelitätsfunktionen Zeit für i in `grep serve...
1. dhtmlxBaum dHTMLxTree ist ein Tree-Menu-Steuer...
In diesem Artikel wird der spezifische Code von v...
1. Befehlseinführung Mit dem Datumsbefehl wird di...
HTML-Ereignisliste Allgemeine Ereignisse: onClick ...
Heute möchte ich mit Ihnen teilen, dass der Stand...
Übersetzen Sie diese URL: http://translateth.is G...