MySql Master-Slave Replikation einrichten

Inhalt:

Einführung

MySql Replikation ermöglicht es, mehrere Kopien einer MySQL Datenbank auf unterschiedlichen Servern vorhalten zu können. Der Abgleich der Daten erfolgt dabei automatisch. Eine Replikation einzurichten ist in vielen Szenarien sinnvoll:

  • Datenanalyze ohne die Performance des Masters zu beeinträchtigen
  • Erstellung eines konsistenten Backups der Daten ohne den Betrieb des Masters zu unterbrechen
  • Scale-Out Lösung

Dieses Tutorial erläutert an einem sehr einfachen Beispiel, wie Sie eine Replikation zwischen einem Master und einem Slave einrichten. Sie benötigen hierzu zwei Server auf unterschiedlichen IP-Adresse für den Master und den Slave.

In diesem Tutorial verwenden wir die folgenden IP-Adressen:

Master-DB: 12.34.56.789
Slave-DB: 12.23.34.456

Voraussetzung

Sie benötigen auf dem Master- und dem Slave-Server Root-Rechte und auf beiden Servern ist MySQL bereits installiert.

Schritt Eins: Konfiguration der Master-Datenbank

Öffnen Sie als Benutzer root auf dem master-server die Mysql-Konfigurationsdatei.

vim /etc/mysql/my.cnf

In dieser Datei werden wir folgende Anpassungen vornehmen:

Setzen der Bind-Address. Suchen Sie in der Datei nach der bind-address:

bind-address            = 127.0.0.1

Ersetzen Sie die Standard-Adresse mit der des Master-Servers

bind-address            = 12.34.56.789

Die nächste Änderung betrifft die server-id, die Sie im Abschnitt [mysqld] finden. Sie können eine beliebige Zahl wählen, der Einfachheit halber beginnen wir hier mit “1”. Beachten Sie jedoch, dass diese Nummer eindeutig innerhalb ihrer Replikations-Gruppe sein muss.

Stellen Sie sicher, dass die Zeile nicht auskommentiert ist!

server-id               = 1

Als nächstes wenden wir uns der Konfiguration des Replikations-Logs zu. Im binlog werden alle Daten der Replikation gespeichert. Der Slave wird alle im Replikationslog festgehalten Änderungen in seine Version der DB kopieren. Wir können die vorhandenen Standard-Konfigurration übernehmen; dazu kommentieren wir die Zeile ein:

log_bin                 = mysql-bin

Abschließend müssen wir festlegen, welche Datenbank repliziert werden soll. Sie können mehrere Datenbank angeben, indem Sie für jede Datenbank eine dieser Zeilen hinzufügen:

binlog_do_db            = my_database

Nachdem Sie die Änderungen vorgenommen haben speichern Sie bitte die Datei.

Nun müssen Sie den mysql-server neu starten, damit er die Konfiguration übernimmt.

service mysql restart

Für die nächsten Schritte müssen Sie in die MySQL-Shell wechseln:

Öffnen der MySQL-Shell.

mysql -u root -p

Dem Slave müssen für die Replikation Rechte zugewiesen werden. Dazu legen Sie mittels dieser Zeile einen Slave-Benutzer samt Kennwort an

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';

Und nun noch die Rechte aktivieren:

FLUSH PRIVILEGES;

Daten für die Replikation vorbereiten

Wichtig bei einer nachträglich eingerichteten Replikation einer bestehenden Datenbank ist die Konsistenz der Daten, mit denen der Slave vorbereitet wird.

Um die nächsten Schritte ausführen zu können, müssen Sie eine weitere aktive Sitzung(ssh-console) zu dem Server starten, auf dem der mysql-Master läuft.

In der ursprünglichen Sitzung mit der geöffneten MySQL-Shell wechseln Sie bitte zur Ihrer Datenbank “my_database”:

USE my_database;

Achtung

Die folgende Aktion führt dazu, dass die Datenbank für ihre Applikationen nicht mehr beschreibbar ist. Eventuell führt das zur Fehlfunktion der Anwendungen, die auf ihren DB-Server zugreifen!

Nun müssen Sie alle Tabellen mit einem Write-Lock versehen:

FLUSH TABLES WITH READ LOCK;

Ermitteln der binlog-Position:

SHOW MASTER STATUS;

Sie sehen eine Ausgabe, die in etwa dieser hier entspricht:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | newdatabase  |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Die ausgegeben Position gibt den Startpunkt für die Replikation des Slaves an. Notieren Sie diese Nummer, Sie benötigen sie später bei der Konfiguration des Slaves.

Setzen Sie in der MySQL-Shell nun keine weiteren Kommandos ab, denn ansonsten wird der Write-Lock der Datenbank wieder aufgehoben. Dies ist auch der Grund, warum Sie eine zweite Session auf den Master-Datenbankserver öffnen sollten, in der wir nun die weiteren Schritte durchführen werden.

Mit der Write-Locked Datenbank werden wir nun einen mysqldump der Daten durchführen. Führen Sie in der Shell(bash) folgendes Kommando aus:

mysqldump -u root -p --opt newdatabase > newdatabase.sql

Tipp

Sie sollten in einer dritten ssh-session auf den Master-Server kontrollieren, dass die dump-Datei wächst. Ist dies nicht der Fall, dann hält wahrscheinlich noch eine Applikation auf den MySQL-Server eine Verbindung, die den Table-Lock verhindert. Beenden Sie diese Applikation und wiederholen Sie die Prozedur.

Wechseln Sie nun wieder zurück in das Fenster mit der Ausgangs-Session.

UNLOCK TABLES;

QUIT;

Damit ist die Konfiguration des Masers abgeschlossen.

Schritt Zwei: Konfiguration der Slave Datenbank

Melden Sie sich per ssh an den Server mit der Slave-DB an, starten Sie die MySQL-Shell und legen eine neue DB an, die die Daten vom Master beziehen soll:

CREATE DATABASE my_database;

EXIT;

Einspielen der Daten (Seed)

Importieren Sie das vorher auf dem Master erzeugte Backup:

mysql -u root -p m_database < /path/to/my_database.sql

Konfiguration des Slave-MySQL-Servers

Die slave-Konfiguration erfoglt analog zu der des Masters, muss jedoch an einigen Stellen angepasst werden:

vim /etc/mysql/my.cnf

Die erste Einstellung betrifft die server-id. Wie schon erwähnt muss diese Nummer eindeutig sein. Da sie auf dem Server bereits 1 ist, müssen wir hier nun eine anderer Nummer vergeben:

server-id               = 2

Stellen Sie sicher, dass die folgenden Parameter vorhanden und nicht auskommentiert sind:

relay-log               = mysql-relay-bin

log_bin                 = mysql-bin

binlog_do_db            = my_database

Die Zeile mit “relay-log” werden Sie hinzufügen müssen, da diese nicht im Standard vorhanden ist. Nachdem Sie die Anpassungen vorgenommen haben, speichern Sie das Konfigurationsfile

Starten Sie auch den MySQL-Slave-Server neu:

service mysql restart

Um die eigentliche Replikation durchzuführen, starten Sie die MySQL-Shell:

CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=  107;

Mit diesem Kommando erreichen Sie folgende Dinge:

  • der Server wird zum slave des Masters erklärt
  • dem Server werden die Anmeldedaten für den Master mitgeteilt
  • es wird eingestellt, von wo und an welcher Stelle die Replikation beginnen soll; die Werte für das master log file und die log position stammen von Master.

Damit ist die Konfiguration abgeschlossen, es bleibt den Slave zu aktivieren:

START SLAVE;

Um den Status der slave-Replikation zu sehen verwenden Sie das folgende Kommando. Das “\G” dient nur der besseren Textausgabe:

SHOW SLAVE STATUS\G

Sollte es zu Verbindungsproblemen kommen können Sie einen Neustart versuchen:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;

Sie haben nun erfolgreich eine Master-Slave Replikation eingerichtet!