Frage: Wie wir alle wissen, kann Binlog zum Archivieren und zur Master-Slave-Synchronisierung verwendet werden, aber was ist sein Inhalt? Warum kann die Standby-Datenbank nach der Ausführung von Binlog nicht mit der Primärdatenbank konsistent sein? Das Grundprinzip von MySQL Master-SlaveAbbildung 1 MySQL Master-Slave-Umschaltprozess Im Zustand 1 greifen die Lese- und Schreiboperationen des Clients direkt auf Knoten A zu, und Knoten B ist die Backup-Datenbank von A. Er synchronisiert lediglich alle Updates von A und führt diese lokal aus. Dadurch bleiben die Daten auf den Knoten B und A gleich.
Ich habe die Backup-Datenbank auf schreibgeschützt eingestellt. Wie kann ich sie synchron mit der primären Datenbank auf dem neuesten Stand halten? Abbildung 2 Flussdiagramm Aktiv/Standby Nach dem Empfang der Aktualisierungsanforderung vom Client führt die Masterdatenbank die Aktualisierungslogik der internen Transaktion aus und schreibt gleichzeitig das Binärprotokoll. Zwischen der Standby-Datenbank B und der primären Datenbank A wird eine lange Verbindung aufrechterhalten. Innerhalb der Masterdatenbank A gibt es einen Thread, der ausschließlich für die Bereitstellung der Langzeitverbindung der Standbydatenbank B zuständig ist. Der vollständige Ablauf einer Transaktionsprotokollsynchronisierung läuft wie folgt ab:
Später, mit der Einführung von Multithread-Replikationslösungen, entwickelte sich sql_thread zu mehreren Threads . Vergleich dreier Binlog-FormateBinlog hat zwei Formate, eines ist Anweisung und das andere ist Zeile. Möglicherweise sehen Sie auch ein drittes Format namens „Mixed in Other Materials“. Tatsächlich handelt es sich dabei um eine Mischung der ersten beiden Formate. mysql> CREATE TABLE t ( id int(11) NICHT NULL, ein int(11) DEFAULT NULL, t_modified Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP, Primärschlüssel (ID), SCHLÜSSEL a (a), SCHLÜSSEL t_modifiziert(t_modifiziert) )ENGINE=InnoDB; einfügen in t-Werte (1,1, '2018-11-13'); einfügen in t-Werte (2,2, '2018-11-12'); einfügen in t-Werte (3,3, '2018-11-11'); einfügen in t-Werte (4,4, '2018-11-10'); einfügen in t-Werte (5,5, '2018-11-09'); Wenn Sie eine Datenzeile in der Tabelle löschen möchten, sehen wir uns an, wie das Binärprotokoll dieser Löschanweisung aufgezeichnet wird. mysql> löschen aus t /Kommentar/, wobei a>=4 und t_modified<='2018-11-10' Limit 1; Wenn binlog_format=statement, wird der Originaltext der SQL-Anweisung in binlog aufgezeichnet . Sie können den Befehl mysql> show binlog events in 'master.000001'; verwenden, um den Inhalt des Binärprotokolls anzuzeigen. Abbildung 3. Beispiel für das Anweisungsformat binlog Sehen wir uns nun die Ausgabe in Abbildung 3 an.
Um den Unterschied zwischen Anweisungs- und Zeilenformaten zu veranschaulichen, schauen wir uns das Ausführungseffektdiagramm dieses Löschbefehls an: Abbildung 4: Warnungen zur Löschausführung Das Ausführen dieses Löschbefehls generiert eine Warnung, da das aktuelle Binärprotokoll auf das Anweisungsformat eingestellt ist und in der Anweisung eine Beschränkung vorliegt . Daher ist dieser Befehl möglicherweise unsicher. Warum sage ich das? Dies liegt daran, dass der Löschbefehl eine Beschränkung hat, die zu Inkonsistenzen zwischen den Primär- und Standbydaten führen kann . Wenn die Löschanweisung den Index a verwendet, wird die erste Zeile, die die Bedingung erfüllt, basierend auf dem Index a gefunden, d. h. die Zeile mit a = 4 wird gelöscht. Da der Originaltext der Anweisung im Anweisungsformat im Binärprotokoll aufgezeichnet wird, kann die folgende Situation auftreten: Wenn die SQL-Anweisung in der primären Datenbank ausgeführt wird, wird der Index a verwendet. Wenn die SQL-Anweisung jedoch in der Standby-Datenbank ausgeführt wird, wird der Index t_modified verwendet. Aus diesem Grund hält MySQL es für riskant, so zu schreiben . Wenn ich das Binlog-Format in binlog_format='row' ändere, verschwindet dieses Problem dann? Abbildung 5 Beispiel für das Zeilenformat Binlog Im Vergleich zum Anweisungsformat Binlog sind BEGIN und COMMIT davor und danach identisch. Der ursprüngliche Text der SQL-Anweisung befindet sich jedoch nicht mehr im Binärprotokoll im Zeilenformat. Stattdessen wird er durch zwei Ereignisse ersetzt: Table_map und Delete_rows.
Verwenden Sie mithilfe des Tools mysqlbinlog den folgenden Befehl, um den Inhalt des Binärprotokolls zu analysieren und anzuzeigen. Das Binärprotokoll dieser Transaktion beginnt an Position 8900. Daher kann mit dem Parameter „Startposition“ angegeben werden, dass die Protokollanalyse an dieser Position beginnt. mysqlbinlog -vv data/master.000001 --start-position=8900; Abbildung 6 Details eines Binärprotokollbeispiels im Zeilenformat Aus dieser Abbildung können wir die folgenden Informationen ersehen:
Das letzte Xid-Ereignis wird verwendet, um anzuzeigen, dass die Transaktion erfolgreich abgeschlossen wurde. Wenn binlog_format das Zeilenformat verwendet, wird die Primärschlüssel-ID der tatsächlich gelöschten Zeile im Binlog aufgezeichnet. Auf diese Weise wird die Zeile mit der ID = 4 definitiv gelöscht, wenn das Binlog in die Slave-Datenbank übertragen wird, und es besteht kein Problem, dass Master und Slave unterschiedliche Zeilen löschen . Warum gibt es ein Binlog mit gemischten Formaten?Da einige Binärprotokolle im Anweisungsformat zu Inkonsistenzen zwischen Master und Slave führen können, sollte das Zeilenformat verwendet werden . Der Nachteil des Zeilenformats besteht jedoch darin, dass es viel Platz beansprucht . Wenn Sie beispielsweise mit einer Delete-Anweisung 100.000 Datenzeilen löschen , wird eine SQL-Anweisung im Binärprotokoll aufgezeichnet, die Dutzende Bytes Speicherplatz beansprucht. Wenn Sie Binlog jedoch im Zeilenformat verwenden, müssen Sie alle 100.000 Datensätze in Binlog schreiben. Dadurch wird nicht nur mehr Speicherplatz beansprucht, sondern es werden auch IO-Ressourcen zum Schreiben des Binärprotokolls verbraucht, was sich auf die Ausführungsgeschwindigkeit auswirkt . Aus diesem Grund hat MySQL eine Kompromisslösung gewählt, d. h. es gibt ein Binlog mit gemischtem Format. Das gemischte Format bedeutet, dass MySQL ermittelt, ob diese SQL-Anweisung zu Inkonsistenzen zwischen dem Master und dem Slave führen kann. Wenn möglich, wird das Zeilenformat verwendet, andernfalls das Anweisungsformat . Mit anderen Worten: Das gemischte Format kann die Vorteile des Anweisungsformats nutzen und gleichzeitig das Risiko von Dateninkonsistenzen vermeiden. Mittlerweile erfordern immer mehr Szenarien, dass das MySQL-Binlog-Format auf „row“ eingestellt wird . Dafür gibt es viele Gründe, einer liegt sofort auf der Hand: Datenwiederherstellung . Wir werden das Problem der Datenwiederherstellung aus der Perspektive von drei SQL-Anweisungen betrachten: Löschen, Einfügen und Aktualisieren.
Bei Datenoperationsfehlern, die durch Lösch-, Einfüge- oder Aktualisierungsanweisungen verursacht werden, ist häufig eine Wiederherstellung des Zustands vor der Operation erforderlich. Das Flashback-Tool von MariaDB führt ein Rollback der Daten basierend auf den oben beschriebenen Prinzipien durch. mysql> in t-Werte einfügen (10,10, jetzt ()); Wenn Sie das Binärprotokollformat auf „gemischt“ einstellen, glauben Sie, dass MySQL es im Zeilenformat oder im Anweisungsformat aufzeichnet? Abbildung 7: Gemischtes Format und jetzt() MySQL verwendet tatsächlich das Anweisungsformat. Als nächstes verwenden wir das Tool mysqlbinlog, um einen Blick darauf zu werfen: Abbildung 8 TIMESTAMP-Befehl Es stellt sich heraus, dass Binlog beim Aufzeichnen des Ereignisses einen zusätzlichen Befehl aufzeichnet: SET TIMESTAMP=1546103491. Dabei wird der Befehl SET TIMESTAMP verwendet, um den Rückgabezeitpunkt der nachfolgenden now()-Funktion zu vereinbaren . Durch diesen SET TIMESTAMP-Befehl stellt MySQL die Konsistenz der Primär- und Standbydaten sicher. Beim Wiedergeben von Binlog-Daten wird Folgendes durchgeführt: Verwenden Sie mysqlbinlog, um das Protokoll zu analysieren, und kopieren Sie dann die darin enthaltenen Anweisungen direkt und führen Sie sie aus . Daher besteht die Standardmethode zum Verwenden von Binlog zum Wiederherstellen von Daten darin, diese mit dem Tool mysqlbinlog zu analysieren und dann das gesamte analysierte Ergebnis zur Ausführung an MySQL zu senden . Ein Befehl ähnlich dem folgenden: mysqlbinlog master.000001 --start-position=2738 --stop-position=2942 | mysql -h127.0.0.1 -P13000 -u$user -p$pwd; Dieser Befehl dient dazu, den Inhalt von Byte 2738 bis Byte 2942 in der Datei master.000001 zu analysieren und ihn zur Ausführung in MySQL zu übertragen. Problem der zirkulären Replikation Die Binlog-Funktion stellt sicher, dass die Ausführung desselben Binlogs auf der Slave-Datenbank denselben Status wie auf der Master-Datenbank erreichen kann. Wir können davon ausgehen, dass im Normalfall die Daten des Primär- und des Backup-Gerätes konsistent sind . Das heißt, die Inhalte der Knoten A und B in Abbildung 1 sind konsistent. Tatsächlich handelt es sich bei dem, was ich in Abbildung 1 gezeichnet habe, um die MS-Struktur. In der tatsächlichen Produktion wird jedoch häufiger die Dual-M-Struktur verwendet . Dabei handelt es sich um den in Abbildung 9 gezeigten Aktiv-Standby-Umschaltvorgang. Abbildung 9 MySQL Master-Slave-Umschaltprozess - Duale M-Struktur Die Knoten A und B stehen immer in einer Master-Slave-Beziehung zueinander. Somit ist es nicht notwendig, die Master-Slave-Beziehung beim Umschalten zu verändern. Bei der Doppel-M-Struktur ist jedoch noch ein Problem zu lösen . Die Geschäftslogik aktualisiert eine Anweisung auf Knoten A und sendet dann das generierte Binärprotokoll an Knoten B. Knoten B generiert nach der Ausführung der Aktualisierungsanweisung ebenfalls ein Binärprotokoll. (Ich schlage vor, dass Sie den Parameter log_slave_updates auf „on“ setzen, was bedeutet, dass die Standby-Datenbank nach der Ausführung des Relay-Protokolls ein Binärprotokoll generiert). Wenn Knoten A dann auch die Sicherungsdatenbank von Knoten B ist, entspricht dies dem erneuten Ausführen des neu generierten Binärprotokolls von Knoten B. Anschließend wird diese Aktualisierungsanweisung wiederholt zwischen Knoten A und Knoten B ausgeführt, was einer zirkulären Replikation entspricht. Wie kann dieses Problem gelöst werden ? Wie in Abbildung 6 oben zu sehen ist, zeichnet MySQL die Server-ID der Instanz im Binärprotokoll auf, auf der dieser Befehl zuerst ausgeführt wurde . Daher können wir die folgende Logik verwenden, um das Problem der zirkulären Replikation zwischen zwei Knoten zu lösen:
Wenn wir dieser Logik zufolge eine doppelte M-Struktur einrichten, sieht der Ausführungsfluss des Protokolls folgendermaßen aus:
Zusammenfassen:Damit ist dieser Artikel darüber, wie MySQL die Konsistenz zwischen dem primären und dem Backup-Server sicherstellt, abgeschlossen. Weitere Informationen dazu, wie MySQL die Konsistenz zwischen dem primären und dem Backup-Server sicherstellt, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Reines CSS zum Anpassen der Div-Höhe entsprechend der adaptiven Breite (Prozentsatz)
Inhaltsverzeichnis Ein Mord verursacht durch ERR ...
Ich habe kürzlich den Quellcode von Vue studiert ...
Als ich mir heute die Laborprojekte ansah, stieß ...
MySQL-Basisdatentypen Übersicht über gängige MySQ...
yum-Befehl Yum (vollständiger Name Yellow Dog Upd...
Ich freue mich sehr, an dieser Folge der Kartoffe...
Manchmal müssen wir einige Befehle auf einem Remo...
Methode 1: Verwenden Sie das Zielereignisattribut...
Hyperlinks sind die am häufigsten verwendeten HTM...
Ich habe meinen Raspberry Pi-Server vor zwei Tage...
In diesem Artikel wird der spezifische JavaScript...
Dies ist ein Artikel über die Benutzerfreundlichk...
1. Laden Sie MySQL Community Server 5.6.35 herunt...
Docker unterstützt die Ausführung auf den folgend...
1. Ändern Sie den Host-Feldwert eines Datensatzes...