VorwortAls ich nach Neujahr mein zweites Vorstellungsgespräch bei Tencent hatte, war die erste Frage, die mir nach dem Schreiben des Algorithmus gestellt wurde: „Was ist MySQL-Halbsynchronisation?“ Ich war damals völlig verwirrt. Ich dachte, es ginge um das Zwei-Phasen-Commit-Problem von MySQL? Nach der Bestätigung stellte sich heraus, dass es sich nicht um eine zweistufige Bewerbung handelte. Dann sah der Interviewer, dass ich nicht einmal wusste, worum es bei der Frage ging, also übersprang er diese Frage und ging direkt zur nächsten über. Daher werde ich dieses Mal den Wissensinhalt dieses Teils zusammenfassen. Es gibt viel Textinhalt, der vielleicht etwas langweilig ist, aber dennoch für diejenigen interessant ist, die sich für diesen Bereich interessieren. MySQL Master-Slave-ReplikationIn großen Projekten verwenden wir normalerweise die MySQL-Replikation, um einen MySQL-Master-Slave-Cluster zu erstellen. Die Datensynchronisierung kann hauptsächlich durch die Konfiguration einer oder mehrerer Sicherungsdatenbanken für den Server durchgeführt werden. Die Replikationsfunktion unterstützt nicht nur die Erstellung leistungsstarker Anwendungen, sondern bildet auch die Grundlage für hohe Verfügbarkeit, Skalierbarkeit, Notfallwiederherstellung, Sicherung und Data Warehouse. Einfach ausgedrückt wird die Master-Slave-Replikation von MySQL verwendet, um eine Lese- und Schreibtrennung zu erreichen. Im Vergleich zu einer Single-Point-Datenbank, die lesen und schreiben kann, verbessert sie die Leistung des Geschäftssystems und optimiert die Benutzererfahrung. Darüber hinaus wird die hohe Verfügbarkeit der Datenbank durch Master-Slave-Replikation erreicht. Wenn MySQL auf dem Masterknoten hängt, kann die Slave-Datenbank zur Übernahme verwendet werden. Von MySQL unterstützte ReplikationsmethodenMySQL unterstützt drei Replikationsmodi:
Master-Slave-ReplikationsprinzipDas MySQL-Replikationsprinzip lässt sich grob in drei Schritte unterteilen:
Der Hauptprozess ist wie folgt: Schauen wir uns die drei Schritte des Kopierens genauer an: Der erste Schritt besteht darin, Binärprotokolle in der Masterdatenbank aufzuzeichnen. Zunächst muss die Masterdatenbank die Binärprotokollierungsfunktion aktivieren und der Slavedatenbank den Zugriff darauf gestatten. Hierbei ist zu beachten, dass die Reihenfolge im Binärprotokoll in der Reihenfolge aufgezeichnet wird, in der die Transaktionen übermittelt wurden, und nicht in der Reihenfolge, in der die einzelnen Anweisungen ausgeführt wurden. Schritt 2: Kopieren Sie binLog aus der Bibliothek in das lokale RelayLog. Zuerst startet die Slave-Datenbank einen Arbeitsthread, einen sogenannten I/O-Thread. Der I/O-Thread stellt eine normale Client-Verbindung mit der Master-Datenbank her. Dann wird ein spezieller Binärdump-Thread (Binlog-Dump) auf der Master-Datenbank gestartet. Dieser Dump-Thread liest Ereignisse im Binlog. Nachdem es mit der Hauptdatenbank gleichgezogen hat, wird es in den Ruhezustand versetzt, bis die Hauptdatenbank es über eine neue Aktualisierungsanweisung benachrichtigt. Auf diese Weise werden die Binärprotokolldaten über den E/A-Thread in der Slave-Bibliothek und den Binärprotokoll-Dump-Thread in der Master-Bibliothek an das Relaylog in der Slave-Bibliothek übertragen. Schritt 3: Starten Sie einen SQL-Thread in der Slave-Datenbank, lesen Sie Ereignisse aus dem Relaylog und führen Sie sie in der Slave-Datenbank aus, um die Daten der Slave-Datenbank zu aktualisieren. ==Diese Replikationsarchitektur erreicht die Entkopplung von Ereigniserfassung und Ereigniswiedergabe, und der laufende E/A-Thread kann unabhängig vom SQL-Thread arbeiten. Diese Architektur schränkt jedoch auch den Replikationsprozess ein. Der wichtigste Punkt ist, dass Abfragen, die gleichzeitig auf der primären Datenbank ausgeführt werden, nur seriell auf der Standby-Datenbank ausgeführt werden können, da nur ein SQL-Thread vorhanden ist, um die Ereignisse im Relay-Protokoll wiederzugeben. ==
MySQL Master-Slave-ReplikationsmodusDie Master-Slave-Replikation von MySQL unterstützt tatsächlich mehrere Replikationsmodi, darunter asynchrone Replikation, halbsynchrone Replikation und GTID-Replikation. Asynchroner ModusDer Standardreplikationsmodus von MySQL ist der asynchrone Modus, der sich hauptsächlich auf den E / A-Thread auf dem MySQL-Masterserver bezieht. Nach dem Schreiben der Daten in Binlong gibt es die erfolgreiche Datenaktualisierung direkt an den Client zurück, unabhängig davon, ob die Daten an den Slave-Server übertragen und in das Relaylog geschrieben wurden. In diesem Modus ist das Kopieren von Daten tatsächlich riskant. Sobald die Daten nur in das Binlog der Master-Datenbank geschrieben und nicht rechtzeitig mit der Slave-Datenbank synchronisiert wurden, kommt es zu Datenverlust. Dieser Modus ist jedoch tatsächlich der effizienteste, da die Funktion zum Ändern von Daten nur in der Hauptdatenbank abgeschlossen werden muss und das Kopieren von Daten aus der Datenbank den Datenschreibvorgang der Hauptdatenbank nicht beeinträchtigt. Wie ich oben sagte, ist dieser asynchrone Replikationsmodus zwar hocheffizient, das Risiko eines Datenverlusts ist jedoch sehr hoch. Daher wird später ein halbsynchroner Replikationsmodus eingeführt. Halbsynchroner ModusMySQL unterstützt den halbsynchronen Master-Slave-Replikationsmodus seit Version 5.5 in Form eines Plug-Ins. Was ist der halbsynchrone Master-Slave-Replikationsmodus? Hier eine Erklärung zum Vergleich:
Im halbsynchronen Replikationsmodus ist es klar, dass nach dem erfolgreichen Commiten einer Transaktion die Transaktion an mindestens zwei Stellen vorhanden ist: in der Masterdatenbank und in einer der Slavedatenbanken. Das Hauptprinzip besteht darin, dass, wenn der Dump-Thread des Masters den Slave benachrichtigt, ein ACK-Mechanismus hinzugefügt wird, der bestätigt, ob der Slave den Transaktionsflagcode erhalten hat. Der Dump-Thread des Masters sendet nicht nur Binlog an den Slave, sondern ist auch für den Empfang der ACK des Slaves verantwortlich. Wenn eine Ausnahme auftritt und der Slave die Transaktion nicht bestätigt, wird automatisch auf die asynchrone Replikation zurückgestuft, bis die Ausnahme behoben ist, und dann automatisch auf die halbsynchrone Replikation umgestellt. Der Prozess der halbsynchronen MySQL-Replikation läuft wie folgt ab: Versteckte Gefahren der halbsynchronen Replikation Der halbsynchrone Replikationsmodus birgt auch bestimmte Datenrisiken: Wenn eine Transaktion an die Masterdatenbank gesendet wird und auf die ACK der Slavedatenbank wartet, treten zu diesem Zeitpunkt zwei Probleme auf, wenn der Master ausfällt.
Um die oben genannten versteckten Gefahren zu beseitigen, hat MySQL seit Version 5.7 einen neuen halbsynchronen Modus hinzugefügt. Der Ausführungsprozess der neuen halbsynchronen Methode besteht darin, den Schritt „Storage Commit“ nach dem Schritt „Write Slave Dump“ zu verschieben. Dadurch wird sichergestellt, dass die Transaktion in der Master-Datenbank erst ausgeführt wird, nachdem die Slave-Transaktion bestätigt wurde. MySQL 5.7.2 fügt einen neuen Parameter zur Konfiguration hinzu: rpl_semi_sync_master_wait_point. Dieser Parameter hat zwei konfigurierbare Werte:
Ab MySQL Version 5.7.2 ist der standardmäßige halbsynchrone Replikationsmodus der AFTER_SYNC-Modus, aber diese Lösung ist kein Allheilmittel, da der AFTER_SYNC-Modus die Transaktion der Master-Datenbank erst festschreibt, nachdem die Transaktion mit dem Slave synchronisiert wurde. Wenn der Master hängt, während die Master-Datenbank darauf wartet, dass die Slave-Datenbank erfolgreich synchronisiert wird, schlägt die Übermittlung der Master-Transaktion fehl und der Client erhält auch das Ergebnis des Transaktionsausführungsfehlers. Der Inhalt von binLog wurde jedoch in das Relay-Protokoll auf dem Slave geschrieben. Zu diesem Zeitpunkt gibt es mehr Slave-Daten, aber das Problem mit mehr Daten ist im Allgemeinen nicht schwerwiegend. Mehr Daten sind immer besser als weniger. Wenn MySQL das Problem der verteilten Datenkonsistenz nicht lösen kann, kann es garantieren, dass keine Daten verloren gehen. Mehr Daten sind immer besser als Datenverlust. Hier sind einige Parameter des halbsynchronen Replikationsmodus: mysql> Variablen wie „%Rpl%“ anzeigen; +----------------------------------------------+------------+ | Variablenname | Wert | +----------------------------------------------+------------+ | rpl_semi_sync_master_enabled | EIN | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | EIN | | rpl_semi_sync_master_wait_point | NACH_SYNC | | rpl_stop_slave_timeout | 31536000 | +----------------------------------------------+------------+ -- Schalter für den halbsynchronen Replikationsmodus rpl_semi_sync_master_enabled -- Halbsynchrone Replikation, Timeout in Millisekunden. Wenn diese Zeit überschritten wird, wird automatisch in den asynchronen Replikationsmodus gewechselt rpl_semi_sync_master_timeout -- Diese Variable wurde in MySQL 5.7.3 eingeführt und legt fest, auf wie viele Slave-Antworten der Master warten muss, bevor er zum Client zurückkehrt. Der Standardwert ist 1. rpl_semi_sync_master_wartet_auf_Slave_Anzahl - Dieser Wert gibt an, ob die Anzahl der Slaves im aktuellen Cluster den aktuell konfigurierten halbsynchronen Replikationsmodus noch erfüllen kann. Der Standardwert ist EIN. Wenn der halbsynchrone Replikationsmodus nicht erfüllt ist, wechseln alle Slaves zur asynchronen Replikation und dieser Wert wird ebenfalls AUS. rpl_semi_sync_master_wait_no_slave -- Stellt die Art und Weise dar, wie bei der halbsynchronen Replikation Transaktionen festgeschrieben werden. Nach 5.7.2 ist der Standardwert AFTER_SYNC rpl_semi_sync_master_wait_point GTID-ModusMySQL hat seit Version 5.6 den GTID-Replikationsmodus eingeführt. GTID ist die Abkürzung für Global Transaction Identifier. GTID setzt sich aus UUID+TransactionId zusammen. UUID ist die eindeutige Kennung einer einzelnen MySQL-Instanz. Wenn die MySQL-Instanz zum ersten Mal gestartet wird, wird automatisch eine Server-UUID generiert und standardmäßig in die Datei auto.cnf (mysql/data/auto.cnf) im Datenverzeichnis geschrieben. TransactionId ist die Anzahl der auf dem MySQL-Server ausgeführten Transaktionen und steigt mit der Anzahl der Transaktionen. Dadurch wird sichergestellt, dass die GTID innerhalb einer Gruppe von Replikaten global eindeutig ist. Auf diese Weise können Sie anhand der GTID deutlich erkennen, von welcher Instanz die aktuelle Transaktion übermittelt wurde und wie viele Transaktionen übermittelt wurden. Schauen wir uns die spezifische Form einer GTID an: mysql> Masterstatus anzeigen; +-----------+----------+--------------+------------------+-------------------------------------------+ | Datei | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------+----------+--------------+------------------+-------------------------------------------+ | am.000003 | 187 | | | 76147e28-8086-4f8c-9f98-1cf33d92978d:1-322| +-----------+----------+--------------+------------------+-------------------------------------------+ 1 Zeile im Satz (0,00 Sek.) So funktionieren GTIDsAufgrund der Eindeutigkeit von GTID in einer Reihe von Master-Slave-Replikationsclustern ist garantiert, dass jede GTID-Transaktion nur einmal auf einem MySQL ausgeführt wird. Wie wird dieser Mechanismus implementiert? Was ist das Prinzip von GTID? Wenn der Slave-Server eine Verbindung zum Master-Server herstellt, übergibt er die von ihm ausgeführte GTID (Executed_Gtid_Set: der ausgeführte Transaktionscode) und die erhaltene GTID (Retrieved_Gtid_Set: die Transaktionsnummer, die der Slave vom Master erhalten hat) an den Master-Server. Der Master-Server sendet die fehlende GTID und die entsprechende Transaktions-ID vom Slave-Server an den Slave-Server, sodass der Slave-Server die Daten vervollständigen kann. Wenn der primäre Server ausfällt, wird der Konferenzserver, der die Daten am erfolgreichsten synchronisiert, gefunden und direkt zum primären Server befördert. Wenn ein anderer als der erfolgreichste Slave-Server gezwungen wird, Master zu werden, wird ein Änderungsbefehl an den erfolgreichsten Server gesendet, um die GTID zu vervollständigen. Anschließend wird der erzwungene Server zum Master befördert. Der Hauptmechanismus zur Datensynchronisierung kann in die folgenden Schritte unterteilt werden:
Die anfängliche Struktur ist wie folgt Aus der obigen Abbildung können wir ersehen, dass Slave-1 die Transaktionen des Masters abgeschlossen hat, wenn der Master auflegt, Slave-2 jedoch etwas verzögert ist und die Transaktionen des Masters daher nicht abgeschlossen hat. Zu diesem Zeitpunkt wird Slave-1 zum Master befördert. Nachdem Slave-2 eine Verbindung zum neuen Master (Slave-1) hergestellt hat, überträgt er die neueste GTID an den neuen Master, und dann beginnt Slave-1, Transaktionen von der nächsten GTID dieser GTID an Slave-2 zu senden. Dieses selbstfindende Replikationsmodell verringert die Möglichkeit eines Transaktionsverlusts und die zur Wiederherstellung nach Fehlern erforderliche Zeit. Vor- und Nachteile von GTIDAus der obigen Analyse können wir schließen, dass die Vorteile von GTID folgende sind:
Auch die Nachteile von GTID liegen auf der Hand:
Tatsächlich gibt es viel Inhalt zu GTID. Wenn Sie sich eingehender damit befassen möchten, können Sie diesen Artikel lesen. Lassen Sie uns abschließend über einige notwendige Voraussetzungen zum Aktivieren von GTID sprechen:
gtid_mode=on (erforderlich) # Aktiviere die gtid-Funktion log_bin=log-bin=mysql-bin (erforderlich) # Aktiviere die binäre Protokollfunktion binlog log-slave-updates=1 (erforderlich) # Du kannst auch 1 als on schreiben. enforce-gtid-consistency=1 (erforderlich) #Sie können auch 1 als on schreiben
gtid_mode=on (erforderlich) enforce-gtid-consistency=1 (erforderlich) log_bin = mysql-bin (optional) #Hochverfügbarkeits-Switching, am besten aktivieren Sie diese Funktion log-slave-updates = 1 (optional) #Hochverfügbarkeits-Switching, am besten aktivieren Sie diese Funktion Oben finden Sie eine ausführliche Erläuterung der MySQL-Halbsynchronisierung. Weitere Informationen zur MySQL-Halbsynchronisierung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Einige gängige CSS-Layouts (Zusammenfassung)
>>: Detailliertes Tutorial zur Installation von Hbase 2.3.5 auf Vmware + Ubuntu18.04
Wir wissen, dass die Eigenschaften des Auswahltags...
Screenshots der Effekte: Implementierungscode: Cod...
Inhaltsverzeichnis 1. Bereiten Sie das Springboot...
1. ip_hash: ip_hash verwendet einen Quelladressen...
In MySQL gibt es überall Caches. Wenn ich den Que...
Jeder, der schon einmal Windows Remote Desktop zu...
Lösung für das Datenasymmetrieproblem zwischen My...
Laden eines oder mehrerer Features <Vorlage>...
1. Laden Sie das RPM-Paket für Linux herunter htt...
Spezifische Methode: 1. Drücken Sie [ Win+R ], um...
Bei einem aktuellen Problem gibt es folgendes Phä...
Einführung Das MySQL-Protokoll für langsame Abfra...
Inhaltsverzeichnis 1. Einführung in die PID-Datei...
Dieser Artikel veranschaulicht anhand von Beispie...
In diesem Artikel finden Sie das Installations- u...