Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Replikation:Fehlerhafte Transaktionen bei der GTID-basierten Replikation

GTID oder Global Transaction Identifier wurde in MySQL 5.6.5 eingeführt. Eine GTID ist eine global eindeutige ID, die allen Transaktionen zugewiesen wird, die auf einem GTID-fähigen MySQL-Hosting-Server ausgeführt werden. GTIDs sind eine Kombination aus der UUID des Servers, auf dem eine bestimmte Transaktion festgeschrieben wurde, und der Sequenznummer dieser Transaktion auf diesem bestimmten Server. Dadurch sind die GTIDs weltweit eindeutig.

MySQL-Replikation

Die GTID-basierte Replikation ist viel flexibler als die ältere binlog-basierte Replikation. In einem GTID-basierten Setup benötigt der Slave keine Master-Binlog-Datei und -Position, um die Replikation zu starten. Lesen Sie mehr über die GTID-basierte Replikation. In diesem Blogbeitrag werden wir einige allgemeine MySQL-Replikationsprobleme besprechen, die beim Bereitstellen eines GTID-basierten Replikatsatzes auftreten.

Fehlerhafte Transaktionen sind Transaktionen, die auf einen oder mehrere Slaves angewendet werden, die nicht auf anderen Knoten repliziert werden müssen. Dies können zeitweise auf den Slave angewendete Korrekturen oder versehentliche Schreibvorgänge auf den Slave durch eine Anwendung sein.

Das Problem mit diesen fehlerhaften Transaktionen entsteht, wenn der Slave, der eine fehlerhafte Transaktion enthält, zum Master befördert wird. Im Fall einer GTID-basierten Replikation würde dies zu einem Problem führen. Der neue Master erkennt nun, dass die Slaves die fehlerhafte Transaktion nicht ausgeführt haben. Eines von zwei Dingen kann passieren:

(1) Die fehlerhafte Transaktion ist immer noch im Binlog des Masters vorhanden und wird an die Slaves gesendet, dies kann die Daten beschädigen oder einen Fehler verursachen.
(2) Die Transaktion ist nicht im Binlog vorhanden, und daher kann nicht an den Slave gesendet werden, was zu einem Replikationsfehler führt.

Prävention

Fehlerhafte Transaktionen können durch Befolgen dieser Schritte aktiv verhindert werden. Wenn Sie einen Fix auf einen Slave anwenden müssen, besteht eine Möglichkeit, fehlerhafte Transaktionen abzuschwächen, darin, die binäre Protokollierung auf dem Slave vorübergehend zu deaktivieren. Das Ausführen von sql_bin_log =0 vor dem Ausführen der fehlerhaften Abfrage sollte ausreichen. Sie können binlog später aktivieren, indem Sie sql_bin_log =1 ausführen. Um zu verhindern, dass Anwendungen auf Slaves schreiben, sollte Read-Only auf einem Server aktiviert werden, wenn er als Slave konfiguriert ist.

Erkennung

Das Erkennen einer fehlerhaften Transaktion in einem GTID-basierten MySQL-Replikatsatz ist einfach. MySQL speichert alle ausgeführten GTIDs in seiner Leistungsschema/Informationsschema-Tabelle basierend auf der von Ihnen verwendeten MySQL-Version. Wenn Sie die ausgeführten GTIDs des aktuellen Slaves nehmen und sie von den auf dem aktuellen Master ausgeführten GTIDs subtrahieren, sollten Sie alle fehlerhaften Transaktionen auf diesem bestimmten Slave erhalten. Dienstprogramme wie mysqlfailover oder mysqlrpladmin können auch bei der Erkennung fehlerhafter Transaktionen helfen.

Lösung

Nachdem eine fehlerhafte Transaktion erkannt wurde, gibt es zwei Möglichkeiten, die nach einem Failover verursachten Replikationsfehler zu beheben. Eine Möglichkeit besteht darin, die GTID der fehlerhaften Transaktion aus der Ausführungshistorie der Slave-GTID zu löschen. Auf diese Weise würde die fehlerhafte Transaktion nicht auf alle Knoten repliziert, wenn der Slave zum Master befördert wird. Eine andere Möglichkeit, eine fehlerhafte Transaktion zu handhaben, besteht darin, allen anderen Slaves zu sagen, dass sie die fehlerhafte Transaktion überspringen sollen. Das würde das Einfügen einer leeren Transaktion mit der gleichen GTID wie die fehlerhafte Transaktion in alle anderen Knoten im Replikatsatz beinhalten. Dies soll alle anderen Knoten denken lassen, dass sie diese Transaktion bereits angewendet haben, und sie daher überspringen. MySQL hat dafür ein Dienstprogramm namens Mysqlslavetrx. Dieses Dienstprogramm kann verwendet werden, um leere Transaktionen mit der angegebenen GTID einzufügen. Das Hinzufügen leerer Transaktionen kann auch andere Verwendungen haben, wie hier besprochen.