Im Durchschnitt wird dieses Tutorial MySQL Master – Master Replikation mit 5 bewertet, wobei 1.0 die schlechteste und 5.0 die beste Bewertung ist. Es haben insgesamt 22 Besucher eine Bewertung abgegeben.
21 1

MySQL Master – Master Replikation

vom gridscale Team MySQL Ubuntu
My SQL Master-Master Replication

Einrichtung einer MySQL Master-Master Replikation

Ich erkläre dir, wie man eine bestehende Datenbank von Server1 mit einer leeren Datenbank auf Server2 synchronisiert, um dann die Replizierung zu realisieren.
Der Unterschied zur Master-Slave Replikation liegt darin, dass nicht nur in eine Richtung Repliziert wird, sondern in beide Richtungen. D.h. Änderungen auf Datenbank 1 werden mit Datenbank 2 synchronisiert und umgekehrt. Somit sorgen wir für sehr hohe Verfügbarkeit und erhöhen die Effizienz im Zugriff auf die Datenbanken.
Solltest du direkt auf dieses Tutorial gestoßen sein und hast bisher noch kaum oder keine Erfahrungen im Einrichten von MySQL Replikationen haben, dann empfehle ich dir zunächst einmal das Tutorial MySQL Master-Slave Replikation auf Ubuntu erstellen anzuschauen.
Um das Tutorial überschaubar zu halten, fasse ich mich relativ kurz und spreche nur das wichtigste an. Natürlich gibt es noch sehr viel mehr Informationen zu dem Thema, allerdings würde das den Rahmen eines Tutorials sprengen. Für weitergehende Informationen empfehle ich die offizielle MySQL Dokumentation: dev.mysql.com

Fallbeispiele

  • Datenverteilung / Disaster Recovery
    • Die Daten eines MySQL Servers können zu einem anderen, entfernten Server in einem anderen Rechenzentrum repliziert werden. Sollte Server1 mal ausfallen so kann man problemlos auf Server2 umschalten. (Disaster Recovery Strategie)
      Wie du einrichtest, dass das automatisch passiert, kannst du in Kürze im Keepalived / IP Failover Tutorial nachlesen.
  • Lastverteilung der Leseabfragen
    • Da z.B. bei vielen Webanwendungen eine Datenbank deutlich mehr gelesen als geschrieben wird, kann man die aufkommende Last mit einer Replikation auf mehrere Server aufteilen. (Skalierung)

Netzwerkkonfiguration

Da wir ein Internes Netzwerk für die Datenbank Replikation benötigen, möchte ich kurz auf folgende Tutorials verweisen, die zeigen, wie du bei gridscale.io ein Internes Netzwerk einrichtest.

Zwei Server mit internem Netz via RestFUL API installieren
How to gridscale

Beispielkonfiguration der IP Adressen:

Server 1 - Master 1: 10.0.0.1
Server 2 - Master 2: 10.0.0.2

Installation / Bestehende Konfiguration / Vorbereitung

Wir haben auf Server1 eine bestehende MySQL Datenbank, da erstellen wir zur Demonstration eine Datenbank und füllen diese mit Dummy Werten. Diese werden wir dann mit einer frisch installierten MySQL Datenbank auf Server2 synchronisieren.
Dazu öffnen wir auf Server1 die MySQL Konsole:

mysql -u root -p
Und geben folgendes ein:
CREATE DATABASE foobar;

USE foobar;

CREATE TABLE dummy (beispiel_id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, beispiel_eintrag VARCHAR(50));

INSERT INTO dummy (beispiel_eintrag) VALUES ('Dies ist ein Beispiel');

Somit haben wir einen Beispiel Datensatz in die Datenbank eingetragen den wir folgend replizieren werden.

Backup der zu Replizierenden Datenbank auf Server1 erstellen, auf Server2 übertragen und einpflegen
Erstmal erstellen wir auf Server1 ein Backup der eben erstellten Datenbank foobar mit folgendem Befehl:

mysqldump -p --allow-keywords --master-data --databases foobar -r /root/db1-foobar-dump.sql

Und übertragen das Backup dann auf Server2:

scp /root/db1-foobar-dump.sql root@10.0.0.2:/root/

Jetzt solltest du auf Server2 im /root/ Verzeichnis die Datei db1-foobar-dump.sql liegen haben.
Also wechseln wir nun auf Server2 und öffnen die MySQL Konsole um das Backup einzulesen.

Dazu verwendest du folgende Befehle:

mysql -u root -p
source /root/db1-foobar-dump.sql;

Konfiguration Server 1

Öffne die Konfigurationsdatei auf Server1 und trage unten folgende Werte ein:

nano /etc/mysql/my.cnf
[mysqld]
server-id			= 1
log_bin				= /var/log/mysql/mysql-bin.log
binlog_do_db			= foobar
replicate-same-server-id		= 0
av-increment-increment		= 2
auto-increment-offset		= 2

Anschließend noch muss noch die bind-address geändert werden damit die Server miteinander kommunizieren können.

nano /etc/mysql/mysql.conf.d/mysqld.conf
bind-address			= 10.0.0.1

Starte MySQL neu damit die Änderungen übernommen werden:

service mysql restart

Konfiguration Server 2

Öffne die Konfigurationsdatei auf Server2 und trage unten folgende Werte ein:

nano /etc/mysql/my.cnf
[mysqld]
server-id			= 2
log_bin				= /var/log/mysql/mysql-bin.log
binlog_do_db			= foobar
replicate-same-server-id		= 0
auto-increment-increment		= 2
auto-increment-offset		= 1
Auch hier muss die bind-address geändert werden.
nano /etc/mysql/mysql.conf.d/mysqld.conf
bind-address			= 10.0.0.2

Auch hier, starte MySQL neu damit die Änderungen übernommen werden:

service mysql restart

Konfiguration der Replikation

Öffne erneut die MySQL Konsole auf Server1 und tippe folgende Befehle ein:

CREATE USER ‘replicator‘@’10.0.0.2‘ IDENTIFIED by ‘yourPW‘;
GRANT REPLIKATION SLAVE ON *.* TO ‘replicator‘@’10.0.0.2’;
SHOW MASTER STATUS\G

Durch den zuletzt eingetragenen Befehl erhalten wir wichtige Informationen auf die wir gleich nochmal zurück greifen werden.

Bei mir sieht die Ausgabe so aus:

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 1533
Binlog_Do_DB: foobar
Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

File & Position solltest du dir notieren!

Somit wechseln wir auf Server2 und öffnen dort erneut die MySQL Konsole und tippen folgende Befehle ein:

CREATE USER ‘replicator‘@’10.0.0.1‘ IDENTIFIED by ‘yourPW‘;
GRANT REPLIKATION SLAVE ON *.* TO ‘replicator‘@’10.0.0.1’;

CHANGE MASTER TO MASTER_HOST=’10.0.0.1’, MASTER_USER=’replicator’, MASTER_PASSWORD=’yourPW’, MASTER_LOG_FILE=’mysql-bin.000004’, MASTER_LOG_POS=’1533’;

Bei dem zuletzt eingetragenen Befehl dann die Werte eingeben die du dir von Server1 notiert hast!

Als nächstes dann noch einmal folgenden Befehl eingeben um wiederrum die benötigten Informationen für Server1 zu bekommen:

SHOW MASTER STATUS\G

Meine Ausgabe hier:

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000006
Position: 154
Binlog_Do_DB: foobar
Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

Auch hier solltest du dir wieder File & Position notieren!

Jetzt wechseln wir erneut auf Server1 und geben folgenden Befehl in der MySQL Konsole ein:

CHANGE MASTER TO MASTER_HOST=’10.0.0.2’, MASTER_USER=’replicator’, MASTER_PASSWORD=’yourPW’, MASTER_LOG_FILE=’mysql-bin.000006’, MASTER_LOG_POS=’154’;

Bei dem zuletzt eingetragenen Befehl dann die Werte eingeben die du dir von Server2 notiert hast!

Replikation Starten und Funktionalität überprüfen

Die Server sollten nun bereit für die Replikation sein, also tippen wir Folgende Befehle auf beiden Servern in der MySQL Konsole ein um die Replikation zu starten:

start slave;

Überprüfen kannst du die Replikation dann mit dem Befehl:

show slave status\G

Folgende Zeilen geben dir Auskunft ob du richtig konfiguriert hast und ob die Replikation funktioniert:

Master_Host: 10.0.0.2
Master_User: replicator

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Natürlich kannst du die Replikation auch testen indem du erneut Datensätze in die Datenbank foobar eingibst, änderst oder löschst.
Fügen wir doch mal einen Datensatz hinzu. Auf welchem Server du das machst ist egal, da die Daten nun in beide Richtungen repliziert werden.
Auf der MySQL Konsole:

INSERT INTO foobar.dummy (beispiel_eintrag) VALUES ('Dies ist ein weiteres Beispiel');
INSERT INTO foobar.dummy (beispiel_eintrag) VALUES ('UND NOCH EINS!');
Auf dem anderen Server kannst du dann gucken ob die Daten synchronisiert wurden:
SELECT * FROM foobar.dummy; 

Zuletzt empfehle ich die Replikation regelmäßig zu überwachen, da diese unter verschiedenen Umständen unterbrochen werden kann, was einen manuellen Eingriff erfordert um die Replikation neu zu starten.

Weitere Tutorials:

MySQL Master-Slave Replikation auf Ubuntu erstellen
MySQL Datenbank erstellen und löschen
Wie erstelle ich einen MySQL Benutzer und weise ihm Rechte zu?

Einrichtung einer MySQL Master-Master Replikation Ich erkläre dir, wie man eine bestehende Datenbank von Server1 mit einer leeren Datenbank auf Server2 synchronisiert, um dann die Replizierung zu realisieren. Der Unterschied zur Master-Slave Replikation liegt darin, dass nicht nur in eine Richtung Repliziert wird, sondern in beide Richtungen. D.h. Änderungen auf Datenbank 1 werden mit Datenbank […]

Schade, dass dir der Artikel nicht gefallen hat.
Was sollten wir deiner Meinung nach besser machen?

Vielen Dank für dein Feedback!
Wir melden uns bei dir, sobald der Artikel zu deinem Wunschthema fertig ist.

Übrigens: kennst du schon unser Tutorial zum Thema ownCloud installieren auf Ubuntu 16.04?

×

Entwickler?

Dann einfach hier für unsere Tutorial-Updates anmelden.
Keine Sorge: Wir spammen dich nicht zu