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ß undmysqldump
kö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?
quelle
Antworten:
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:
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:
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 ...
quelle