Wiederherstellungsstrategie für die Master-Master-Replikation


8

Ich habe eine HA-Lösung für MySQL implementiert, die auf der Master-Master-Replikation basiert. Es gibt einen Mechanismus im Front-End-Teil, der garantiert, dass zu einem bestimmten Zeitpunkt nur eine Datenbank gelesen / beschrieben wird (dh wir verwenden die Replikation nur für HA).

Ich habe bestätigt, dass die Replikation wie erwartet funktioniert, frage mich jedoch über das Fehlerszenario und die Wiederherstellung. Insbesondere mache ich mir Sorgen darüber, was passiert, wenn ein Master in einem nicht behebbaren Zustand ausfällt und vom anderen Master neu erstellt werden muss:

  • Da der andere Master live ist und höchstwahrscheinlich verwendet wird, kann ich ihn nicht sperren und Dumps erstellen mysqldump(unsere Datenbanken sind mäßig groß und mysqldumpkönnen nach einigen Monaten der Nutzung leicht Stunden dauern).
  • Selbst wenn ich einen Dump habe, ist es entscheidend, dass die von SHOW MASTER STATUS angezeigte Binlog-Position dem Dump entspricht, der nach dem Sperren der Datenbank ausgeführt wird.

Die einfache Lösung für das erste Problem besteht darin, eine dritte Datenbank als Backup zu verwenden, von der aus ich das ausführen kann mysqldump. Aber wie stelle ich dann sicher, dass der neu erstellte Master die Replikation vom laufenden Master auf konsistente Weise starten kann?


Erwägen Sie, einem der Master einen Slave hinzuzufügen, damit Sie Ihre Dumps daraus ausführen können. Dies hilft auch bei Backups.
John Gardeniers

Antworten:


2

Es gibt zwei grundlegende Ansätze für dieses Problem, die mir bekannt sind. Wenn Sie InnoDB anstelle von Myisam ausführen, können Sie zunächst die Sicherung in einer Transaktion (--single-transaction --lock-tables = FALSE) durchführen, die mit --flush-logs (nicht erforderlich, aber nett) und kombiniert wird --master-data bietet Ihnen eine konsistente Sicherung mit Informationen zur Replikationsposition. Durch Leeren von Protokollen werden die Protokolle zurückgesetzt, bevor der Speicherauszug erstellt wird. Dies bedeutet, dass die Position immer 106 ist und --master-data den Namen und die Position der Protokolldatei direkt in die Speicherauszugsdatei einfügt. Natürlich müssen Sie dies auf dem Master ausführen, damit --master-data funktioniert.

Die zweite Möglichkeit, die Sie erwähnt haben, besteht darin, einen dritten Host zum Erstellen der Sicherungen zu verwenden. In diesem Fall müssen Sie die Replikation stoppen, sicherstellen, dass die Datenbank schreibgeschützt ist (obwohl tatsächlich alle Ihre Replikate schreibgeschützt sein sollten, da dies keine Auswirkungen auf Schreibvorgänge aus der Replikation hat), und dann Ihre Sicherung erstellen UND die Replikationsposition aufzeichnen. In diesem Fall können Sie --master-data nicht verwenden. Stattdessen könnten Sie so etwas tun:

echo 'stop slave' | mysql {options)
mysqldump {your options} > DB.sql
echo 'show slave status\G' > DB.replication
echo 'start slave' | mysql {options)

Wenn Sie jemals aus dieser Sicherung wiederherstellen müssen, führen Sie die Wiederherstellung aus und richten die Replikation ein, wobei die beiden Parameter master_log_file und master_log_pos aus der DB.replication-Datei stammen:

master_log_file = value of Master_Log_File
master_log_pos = value of Exec_Master_Log_Pos

Hinweis: Sie können dies von einem anderen Replikat aus testen.

Zusätzlicher Hinweis: Wenn Sie über einen Pool von Replikaten verfügen (z. B. wenn Sie Lesevorgänge von Schreibvorgängen für eine Web-App getrennt haben), sind die Replikate möglicherweise nicht mit dem neuen Master synchron. Dies kann passieren, wenn das Failover während eines Zeitraums mit starker Schreib-E / A auftritt, da die Replikate asynchron gestreamt werden und keine Garantie dafür besteht, dass sich Ihr Standby beim Failover an derselben Position wie die anderen Replikate befindet. Dies ist mir jedoch noch nicht passiert ...


vielen Dank. All dies ist tatsächlich in mysqldump dokumentiert. Warum es nicht im Haupt-MySQL-Dokument vorhanden ist, ist mir ein
Rätsel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.