Wie synchronisieren Sie den Master-MySQL-DB erneut mit Slave-DB-Änderungen, wenn der Master offline geschaltet wird?

11

MySQL Server 1 wird als Master ausgeführt.
MySQL Server 2 wird als Slave ausgeführt.

Wenn beide DBs online sind, sind sie "perfekt synchronisiert". Wenn der Slave offline geht, gibt es kein Problem, wenn der Master noch online ist. Sie werden wieder synchronisiert, sobald der Slave wieder online ist.

Neben der Serverkonfiguration habe ich die Verbindung (mit JSP-Code) für die Slave-Datenbank umgeleitet, wenn der Master offline geht (ich habe natürlich mit /etc/init.d/mysqld stop getestet).

Gibt es eine automatische Methode, um den Master mit Slave-Updates zu synchronisieren, wenn der Master wieder online geht?

RolandoMySQLDBA
quelle

Antworten:

8

Eine gute Möglichkeit, etwas Ähnliches zu erreichen, besteht darin, die Master-Master-Replikation oder die zirkuläre Replikation einzurichten. Dies ist nicht mit MultiMaster Replciation zu verwechseln.

Das Einrichten der zirkulären Replikation ist sehr einfach, wenn Sie die Master-Slave-Replikation eingerichtet haben. Folgendes müssen Sie tun, um es zu konfigurieren.

In diesem Beispiel wird davon ausgegangen, dass die Master-Slave-Replikation aktiv ist, es jedoch zu Ausfallzeiten (1-2 Minuten) kommt:

Schritt 1) ​​Fügen Sie diese Zeile zu /etc/my.cnf auf dem Master hinzu.

Log-Slave-Updates

Schritt 2) Fügen Sie diese Zeile zu /etc/my.cnf auf dem Slave hinzu:

log-bin = mysql-bin (oder was auch immer der Master dafür hat) log-Slave-Updates

WARNUNG: Hier ist der kurze Moment der Ausfallzeit !!!

Schritt 3) Starten Sie auf dem Slave den Neustart von mysql

Dadurch werden binäre Protokolle auf dem Slave aktiviert

Schritt 4) Warten Sie auf dem Master den MySQL-Stopp

Schritt 5) Verwenden Sie rsync, um den Ordner / var / lib / mysql des Slaves auf den Master zu kopieren.

WARNUNG: Hier ist der längere Moment der Ausfallzeit !!!

Schritt 6) Warten Sie auf dem Slave den MySQL-Stopp

Schritt 7) Finden Sie auf dem Slave das letzte Binärprotokoll heraus

Schritt 8) Ermitteln Sie auf dem Slave die Dateigröße des letzten Binärprotokolls

Schritt 9) Verwenden Sie rsync, um den Ordner / var / lib / mysql des Slaves auf den Master zu kopieren. Dies sollte eine schnellere Kopie sein.

Schritt 10) Bearbeiten Sie auf dem Master
Zeile 2 von master.info mit dem letzten Binärprotokoll des Slaves.
Zeile 3 von master.info mit der Dateigröße des letzten Binärprotokolls des Slaves.
Zeile 4 von master.info mit der IP des Slaves.
Zeile 5 ist die Benutzer-ID des Replikationsbenutzers (NICHT BERÜHREN).
Zeile 6 ist das Kennwort des Replikationsbenutzers (NICHT BERÜHREN).

Schritt 11) Löschen Sie alle Binärprotokolle und die Binärprotokollindexdatei des Masters.

Schritt 12) Warten Sie auf dem Slave den Start von Service MySQL und warten Sie 15 Sekunden

Schritt 13) Starten Sie auf dem Master den Dienst mysql start

Schritt 14) Führen Sie auf dem Master STOP SLAVE aus. SHOW MASTER STATUS;

Schritt 15) Führen Sie auf dem Slave CHANGE MASTER TO MASTER_HOST = 'IP des Slaves', MASTER_USER = 'Benutzer-ID des Replikationsbenutzers ab Schritt 10', MASTER_PASSWORD = 'Kennwort des Replikationsbenutzers ab Schritt 10', MASTER_LOG_FILE = 'Binärprotokoll ab Schritt 14' aus. MASTER_LOG_POS = LogPos aus Schritt 14.

Schritt 16) Führen Sie auf dem Slave START SLAVE aus.

Schritt 17) Führen Sie auf dem Master START SLAVE aus.

Ich habe ähnliche Schritte für eine andere von mir beantwortete StackExchange-Frage ausgeführt .

Versuche es !!!

RolandoMySQLDBA
quelle
Sehr schön! Ist es möglich, dass mehr als eine Slave-Datenbank mit dem Master synchronisiert wird, eher wie eine "Master-Master-Master" -Lösung?
Herberth Amaral
Dies hat mein Setup irreparabel zerstört. Musste mein VPS komplett neu installieren. Ich denke, ich mache einen Schnappschuss, bevor ich das nächste Mal zwielichtige Ratschläge lese.
Vasili Syrakis
@ VasiliSyrakis Es tut mir leid, dass Sie meinen Rat als zweifelhaft empfunden haben. Trotzdem habe ich in meinen 10 Jahren als MySQL-DBA noch nie eine VPS- oder MySQL-Installation zerstört, als ich Binärprotokolle für die Replikation neu ausgerichtet habe. Ich mache das seit vielen Jahren ohne Zwischenfälle für Drupal- und Wordpress-Kunden. Entschuldigung für meinen Rat.
RolandoMySQLDBA
Hmm. Ich würde nicht empfehlen, rsync zum Kopieren einer laufenden Instanz zu verwenden. Ich würde Percona XtraBackup verwenden, um den Master vom Slave neu zu initialisieren . Sie brauchen auch nicht, es log-slave-updatessei denn, die Master werden zusätzliche Slaves haben.
Bill Karwin
2

Nicht bei der asynchronen Replikation, die MySQL bietet. Sie haben gerade den sprichwörtlichen Nagel getroffen, warum die sofort einsatzbereite MySQL-Replikation (vor 5.5) an und für sich keine Hochverfügbarkeitslösung ist. Mit 5.5 mit halbsynchroner Replikation (http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html) wird es etwas besser, jedoch auf Kosten einer langsameren Transaktionszeit, wenn der Master auf die wartet ack vom Sklaven.

Wenn es nicht möglich ist, die Möglichkeit eines Datenverlusts beim Ausfall des Masters zu akzeptieren, würde ich sagen, dass ein komplexeres Setup als ein einfacher Master / Slave angebracht ist.

Die Master-to-Master-Replikation wurde von vielen bekannten MySQL-Leuten als eher problematisch als vorteilhaft angesehen (selbst MySQL AB selbst empfiehlt sie nicht mehr als Hochverfügbarkeitslösung). Daher denke ich, dass Sie hier das DRBD-Setup verwenden müssen, um den aktiven Master und den passiven Slave mithilfe von Kopien auf Blockebene synchron zu halten.

TechieGurl
quelle
1
Ich liebe DRBD selbst. Ich arbeite regelmäßig mit vielen Clients, die ucarp als Failover-Mechanismus verwenden. DRBD ist eigentlich sehr gut und für HA vorzuziehen, vorausgesetzt, die Datenbank ist alles InnoDB. Jede MyISAM-Tabelle, die während eines Failovers geöffnet ist, wird auch in der DRBD-Sekundärdatei als abgestürzt markiert. InnoDB führt gerade eine Absturzwiederherstellung durch, wenn ein Failover auf die neue DRBD-Primärdatenbank durchgeführt wird. Ich sehe also, dass DRBD und InnoDB zusammen verwendet werden. Vielen Dank für Ihren gesunden Menschenverstand, DRBD anzusprechen. +1 für deine Antwort.
RolandoMySQLDBA
Vielen Dank :) und ich denke in meiner Antwort
gehe
1

IMHO, Erstens sollte Ihr Slave in einer Nicht-Multi-Master-Konfiguration (Master / Slave) niemals Schreibvorgänge ausführen. Der Slave my.cnf sollte konfiguriert und der Server gestartet werden mit:

# Flag to not take writes from network
read-only

Um das Problem zu beheben, dass ein Master nicht synchron mit einem beschreibbaren Slave ist, der versehentlich Schreibvorgänge ausführt, müssen Sie die Daten auf beiden Hosts unterscheiden. Wenn keine Schlüsselkollision vorliegt, sollten Sie Ihren früheren Slave-Host zum Master befördern und Ihren alten Master als Slave-Host neu abbilden, der vom neuen Master repliziert. (Es könnte / wahrscheinlich gibt es hier Datenprobleme)

Schließlich , wenn dieses Szenario des Ausfalls / Ausfallzeit ist auch eine Möglichkeit , vorwärts gehen , sich die Zeit nehmen beide Hosts einzurichten als Multi-Master (log-bin, Server-ID, Versetzungen, etc.). Auf diese Weise können Sie Ausfälle und Ausfallzeiten bis zu einem gewissen Grad verringern.

Wenn Sie Master / Slave ausführen müssen , erhalten Sie mindestens einige Bonuspunkte für die Trennung von Lese- und Schreibbenutzerverbindungen in Ihrer ACL und Ihren Anwendungen.

randomx
quelle