Erstellen Sie einen MySQL-Slave von einem anderen Slave, aber richten Sie ihn auf den Master

8

Problem

Ich habe MySQL-Replikation zwischen 2 Servern eingerichtet, Master ( A ) und Slave ( B ). Ich muss der Mischung einen neuen Slave hinzufügen ( C ). Ich möchte, dass dieser Slave seine Updates direkt vom Master erhält. Ich möchte keine Kettenreplikation vom Slave. Der Master ist jedoch "heiß". Normalerweise verwende ich Xtrabackup, um eine vollständige Sicherung des Masters zu erstellen. Dadurch wird er jedoch für gut 10 Minuten gesperrt, da die Datenbank etwa 20 GB groß ist.

Mögliche Lösung

SPÜLEN SIE TABELLEN MIT READ LOCK auf Slave B , verwenden Sie SHOW SLAVE STATUS auf B , notieren Sie das Binlog und die Position. Sichern Sie dann die Datenbank mit Xtrabackup, senden Sie die Sicherung an C und erstellen Sie damit den Slave. Setzen Sie die Replikation so, dass sie mit der gerade notierten Binlog-Position auf A zeigt.

Frage

Gibt es einen besseren Weg, bei dem ich B nicht so lange sperren muss ? Oder etwas, das einfacher zu automatisieren ist?

Alex Recarey
quelle

Antworten:

20

Hey, ich kenne eine verrückte Methode, um einen Slave zu erstellen, ohne die Operation von Master (ServerA) oder Slave (ServerB) zu erweitern.

Schritt 1) ​​Richten Sie einen neuen Server ein (ServerC)

Schritt 2) Installieren Sie auf ServerC MySQL (dieselbe Version wie ServerB).

Schritt 3) Führen Sie auf ServerC den Dienst mysql stop aus

Schritt 4) Kopieren Sie /etc/my.cnf von ServerB nach ServerC

Schritt 5) Ändern Sie auf ServerC die Server-ID in einen anderen Wert als ServerA und ServerB

Schritt 6) rsync / var / lib / mysql auf ServerB zu ServerC

Schritt 7) Wenn rsync abgeschlossen ist, führen Sie "STOP SLAVE;" auf ServerB

Schritt 8) rsync / var / lib / mysql auf ServerB zu ServerC

Schritt 9) Führen Sie auf ServerB "START SLAVE;"

Schritt 10) Starten Sie auf ServerC den Dienst mysql

Schritt 11) Führen Sie auf ServerC "START SLAVE;" (Tun Sie dies, wenn sich Skip-Slave-Start in /etc/my.cnf befindet.)

Versuche es !!!

Übrigens habe ich das größte Vertrauen, dass dies funktionieren wird, da ich dies in den letzten 2 Tagen nur für den Kunden getan habe. Der Client hatte 2,7 TB Daten auf einem Slave. Ich habe auf einen anderen Server synchronisiert, während der Slave noch aktiv war. rsync dauerte ungefähr 11 Stunden. Ich habe dann STOP SLAVE ausgeführt. auf dem ersten Slave und lief rsync erneut. Das hat noch eine Stunde gedauert. Ich habe dann den obigen Schritt ausgeführt und alles ist erledigt.

RolandoMySQLDBA
quelle
LOL. Ich wollte das OP kommentieren, um Ihren Vorschlag zu verwenden, und siehe da, Mr. Rolando, der "Kühlschrank" -DBA. Rolando hat den Nagel auf den Kopf getroffen und dies ist die bevorzugte Methode, ohne einen Meister stoppen zu müssen und ohne Ihren B-Sklaven zu lange anzuhalten.
Coderwhiz
2
Ich weiß, dass dies ein ziemlich alter Beitrag ist, aber jemand hat mich nach dieser Methode gefragt. Dies funktioniert gut, vorausgesetzt, der neue Slave und der alte Slave sind genau gleich. Wenn der neue Slave ein anderer Bogen ist, funktioniert er nicht (iirc). Und ich bin mir fast sicher, dass es nicht funktioniert, wenn Sie Innodb-Tablespaces pro Datei verwenden. Die sicherste Lösung besteht darin, im Zweifelsfall eine vollständige Sicherung vom Master durchzuführen.
Lusis
@lusis - Dein Kommentar ist sehr wahr. In einer perfekten Welt, die sich die meisten MySQL-Kunden vorstellen, möchten sie dies tun, da alle Hardwarespezifikationen identisch sind. In Setups mit unterschiedlicher Hardware ist mysqldumps und reload am sichersten. Sie sollten Ihren Kommentar als Antwort einreichen. Ich würde es positiv bewerten. Mal sehen, ob andere das wollen !!!
RolandoMySQLDBA
Ich folgte dem Verfahren. Nachdem ich mysql wieder auf SlaveC gestartet habe, erhalte ich die Fehlermeldung "Ihre Datenbank ist möglicherweise beschädigt oder Sie haben möglicherweise den InnoDB-Tabellenbereich kopiert, aber nicht die InnoDB-Protokolldateien". Und auf start slave(SlaveC) erhalte ich "Fehler beim Öffnen des Relaisprotokolls '/var/log/mysql/mysql-relay-bin.001603"
Hussain Tamboli
Auf diese Weise können Sie leicht Daten auf ServerC verlieren.
Akuzminsky
3

Wenn wir unserem Mix einen Slave hinzufügen, gehen wir wie folgt vor:

  • Schalten Sie einen Slave offline
  • Kopieren Sie das Datenbankdatenverzeichnis auf den neuen Slave (Slave-Einstellungen - Binlog-Position, Master-Host usw. - sind korrekt, da wir von einem Slave kopiert haben).
  • Starten Sie den ursprünglichen Slave
  • Ändern Sie die Server-ID in my.cnf für den neuen Slave
  • neuen Slave starten
sreimer
quelle
Ich musste das heute Nachmittag
einfach
1

Ich habe getan, was @RolandoMySQLDBA vorschlägt, aber auch 6 ' und 8' Schritte hinzugefügt (dies löst, was @Hussain Tamboli kommentiert.):

Schritt 1) ​​Richten Sie einen neuen Server ein (ServerC)

Schritt 2) Installieren Sie auf ServerC MySQL (dieselbe Version wie ServerB).

Schritt 3) Führen Sie auf ServerC den Dienst mysql stop aus

Schritt 4) Kopieren Sie /etc/my.cnf von ServerB nach ServerC

Schritt 5) Ändern Sie auf ServerC die Server-ID in einen anderen Wert als ServerA und ServerB

Schritt 6) rsync / var / lib / mysql auf ServerB zu ServerC

Schritt 6 ') rsync / var / log / mysql auf ServerB zu ServerC

Schritt 7) Wenn rsync abgeschlossen ist, führen Sie "STOP SLAVE;" auf ServerB

Schritt 8) rsync / var / lib / mysql auf ServerB zu ServerC

Schritt 8 ') rsync / var / log / mysql auf ServerB zu ServerC

Schritt 9) Führen Sie auf ServerB "START SLAVE;"

Schritt 10) Starten Sie auf ServerC den Dienst mysql

Schritt 11) Führen Sie auf ServerC "START SLAVE;" (Tun Sie dies, wenn sich Skip-Slave-Start in /etc/my.cnf befindet.)

Pere Barceló
quelle
Ihre Antwort ist nicht vollständig und verweist auf andere Dinge. Es ist kein Forum, verbessern Sie Ihre Antwort, um selbstständig zu sein.
Asdmin
0

Sie haben die Option "DATEN VON MASTER LADEN", ​​aber davon wird dringend abgeraten.

Nehmen Sie nächtliche / wöchentliche Backups auf Ihrem System vor? Wenn ja, notieren Sie auch die Position mit Ihrem Backup, dann können Sie dieses Backup zum Einrichten eines neuen Slaves verwenden. Lass es einfach sein und lass es für einige Zeit auf dem neuesten Stand sein.

Jishi
quelle
0

Ich habe Rolando-Antworten ausprobiert und es hat gut funktioniert, aber es wurde von Anfang an wiedergegeben und ich musste mehr Fehlercode hinzufügen, um zu überspringen (ich weiß, dass es nicht empfohlen wird, aber ich weiß, was ich tat).

Nachdem ich mit Schritt 7 fertig war, habe ich das MySQL-Protokoll eingecheckt, den Namen und die Position des Bin-Protokolls notiert und bis zum 9. Schritt fortgefahren. Vor dem 10. Schritt habe ich nur die change masterProtokolldatei und die Protokollposition ausgeführt. Und weiter ab Schritt 11. Für mich sieht alles gut aus.

Spitze
quelle
-2

Sie müssen die Slave-UUID in auto.cnf ändern, damit der Master die beiden Slaves unterscheiden kann.

Nazgul
quelle