Im Durchschnitt wird dieses Tutorial MySQL Master-Slave Replikation auf Ubuntu erstellen mit 5 bewertet, wobei 1.0 die schlechteste und 5.0 die beste Bewertung ist. Es haben insgesamt 62 Besucher eine Bewertung abgegeben.
62 0

MySQL Master-Slave Replikation auf Ubuntu erstellen

vom gridscale Team MySQL Ubuntu
tutorial - MySQL Master Slave Replikation auf Ubuntu

Replikation von einem Master zum Slave einrichten

In folgendem Artikel werde ich dir zeigen, wie man eine MySQL Datenbank auf einem Ubuntu 16.04 Server installiert und eine Replikation von einem Master zum Slave einrichtet.
Man sollte jedoch bedenken bzw. beachten:
Die Replikation ist asynchron! Der Slave Server hinkt je nach Last dem Master Server hinterher und es könnte zu Datenverlust kommen.
Die Anleitung beschreibt eine unverschlüsselte Replikation. Man sollte sie so konfiguriert NUR in Privaten Netzwerken und keinesfalls in Öffentlichen Netzwerken (im Internet) betreiben!
Bedenke: Eine Replikation ist kein Backup! Löscht man eine Datenbank auf dem Master, dann wird sie auf dem Slave genauso gelöscht!

Fallbeispiele

Lastverteilung der Leseabfragen

Da z.B. bei vielen Webanwendungen eine Datenbank um Weiten mehr gelesen als geschrieben wird, kann man die aufkommende Last mit einer Replikation auf mehrere Server aufteilen. (Skalierung)

Master Server Entlastung

Man kann die Replizierung nutzen um auf dem Slave Server regelmäßige Backups laufen zu lassen, so beeinträchtigt man nicht die Kapazitäten des Master Servers durch den Backup Prozess.

Datenverteilung / Desaster Recovery

Die Daten eines MySQL Servers können zu einem anderen, entfernten Server in einem anderen Rechenzentrum repliziert werden. (Disaster Recovery Strategie)

Netzwerk Konfiguration

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

How to gridscale

Beispielkonfiguration der IP Adressen:

Server 1 (MASTER): 10.0.0.1
Server 2 (SLAVE): 10.0.0.2

Installation

Installation und Start des MySQL-Servers auf Server1 und Server2:

apt-get -y install mysql-server
service mysql start

Vorbereitung / Konfiguration

Die MySQL Kommandozeile aufrufen und einen Replikations-Account anlegen:

mysql –u root –p

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘replication‘@’10.0.0.2‘ IDENTIFIED BY ‘password’;

Erläuterung / Erklärung:
replication = der Account der für die Replikation berechtigt ist
10.0.0.2 = Adresse des Slave Servers
password = Ändern in gewünschtes Passwort

REPLICATION SLAVE:
Die Berechtigung „REPLICATION SLAVE“ sollte Konten gewährt werden, die von Slave-Servern zum Herstellen einer Verbindung mit dem aktuellen Server als Master verwendet werden. Ohne diese Berechtigung kann der Slave keine Updates anfordern, die an den Datenbanken auf dem Master-Server vorgenommen wurden.

REPLICATION CLIENT:
Die Berechtigung “REPLICATION CLIENT” ermöglicht die Verwendung von „SHOW MASTER STATUS“ und „SHOW SLAVE STATUS“

Für nähere Informationen zu den verwendeten Befehlen und Optionen, kannst du auf folgende MySQL Dokumentationen zurückgreifen:

Deutsch: downloads.mysql.com
Englisch: dev.mysql.com/en/

Als nächstes nehmen wir Änderungen an der Konfiguration des „MASTER“ Servers vor:

nano /etc/mysql/mysql.conf.d/mysqld.cnf

Folgende Einträge müssen überprüft/abgeändert/auskommentiert werden:

bind-address		= 10.0.0.1
server-id		= 1
log_bin			= /var/log/mysql/mysql-bin.log
max_binlog_size		= 100M

Zu Kontrollzwecken kann man Logging aktivieren – was aber nicht dauerhaft zu empfehlen ist, da die Option ein Performance Killer ist!

general_log_file		= /var/log/mysql/mysql.log
general_log		= 1

– Überprüfen kann man das Logfile dann später mit dem Befehl: tail –f /var/log/mysql/mysql.log

Nachdem die Änderungen der Konfiguration vorgenommen sind, laden wir die Konfiguration des MySQL Servers neu ein, öffnen die MySQL Kommandozeile und schauen uns den Status des „MASTER“ Servers an.

service mysql reload
mysql –u root –p
show master status;

Ausgabe:

mysql> show master status;
+---------------------+----------+----------------+---------------------+
| File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+----------------+---------------------+
| mysql-bin.000001  |      98    |                      |                            | 
+---------------------+----------+----------------+---------------------+

File & Position merken für die SLAVE Server Konfiguration!

Jetzt nehmen wir uns die Konfiguration des SLAVE Servers vor:

nano /etc/mysql/mysql.conf.d/mysqld.cnf

Folgende Einträge müssen überprüft/abgeändert/auskommentiert werden:

server-id		= 2		# Muss einen höheren Wert als der MASTER haben.
bind-address		= 10.0.0.2
log_bin			= /var/log/mysql/mysql-bin.log
max_binlog_size		= 100M

Auch hier gilt, zu Kontrollzwecken kann man Logging aktivieren:

general_log_file		= /var/log/mysql/mysql.log
general_log		= 1

Backup erstellen und im SLAVE einbinden

Auf dem „MASTER“ Server erstellen wir das benötigte Backup der Datenbank mit folgendem Befehl:

mysqldump -A --allow-keywords --single-transaction -F --master-data=2 -r /root/mysqldump.sql --user=root -p

Erläuterung / Erklärung der verwendeten Optionen:
-A (–all-databases) Bezieht alle Datenbanken und Tabellen mit ein.

-F (–flush-logs) Synchronisiert die Logdateien des MySQL Servers auf der Festplatte, bevor der Backupvorgang gestartet wird.

–allow-keywords Erlaubt die Erstellung von Spaltennamen, die Schlüsselwörter sind.

–single-transaction Diese Option setzt eine SQL-Anweisung BEGIN ab, bevor der Speicherauszug vom Server durchgeführt wird. Der Speicherauszug spiegelt den konsistenten Zustand der Datenbank zu dem Zeitpunkt wieder, an dem BEGIN abgesetzt wurde, ohne dass Anwendungen gesperrt werden.

–master-data=2 Fügt Dateiname und Position des Binärlogs der Ausgabe hinzu.

-r /root/dump.sql (–result-file=file) Die Ausgabe erfolgt in die angegebene Datei.

–user=root Verwendet den angegebenen MySQL-Benutzernamen zur Verbindung.

-p (–password[=password]) Da kein Passwort mit übergeben wird, werden wir vom Server nach einem Passwort gefragt.

Für nähere Informationen zu den verwendeten Befehlen und Optionen, kannst du auf folgende MySQL Dokumentationen zurückgreifen:

Deutsch: downloads.mysql.com
Englisch: dev.mysql.com/en/

Das erstellte Backup der Datenbank finden wir nun unter /root/mysqldump.sql, diese Datei übertragen wir mit folgendem Befehl auf den Slave:

scp /root/mysqldump.sql root@10.0.0.2:/root/

Wenn du mehr über die Nutzung von scp wissen willst, dann schaue dir folgendes Tutorial an: Via SCP Dateien sicher zwischen Linux und Windows übertragen

Die Datei „mysqldump.sql“ sollte jetzt im „/root/“ Verzeichnis auf dem Slave Server zu finden sein.

Auf dem „SLAVE“ Server:

Nachdem das Backup erfolgreich auf den Slave übertragen wurde öffnen wir die MySQL Kommandozeile und löschen alle vorhandenen MySQL Datenbanken.

mysql -u root -p		# Öffnen der MySQL Kommandozeile
show databases;		# Auflistung aller vorhandenen Datenbanken

Die Ausgabe sieht dann so oder ähnlich aus:

mysql> show databases;
+---------------------------+
| Database                  |
+---------------------------+
| mysql			    |
| test            	    |
+---------------------------+
2 rows in set (0.01 sec)

Jetzt Löschen wir alle vorhandenen Datenbanken mit dem Befehl:

drop database mysql;
drop database test;
…
…
…

Wenn du alle vorhandenen Datenbanken gelöscht hast, kommst du mit folgendem Befehl zurück auf die Linux Konsole

exit;

Als nächstes spielen wir dann das Datenbank Backup mit folgendem Befehl ein und starten den SLAVE neu:

cat /root/mysqldump.sql | mysql -u root -p
service mysql restart

Starten der Replikation und auf Funktionalität überprüfen

Die Server sind konfiguriert und sollten jetzt bereit für die Replikation sein.

Dazu öffnen wir erneut die MySQL Kommandozeile am SLAVE Server und führen folgenden Befehl aus:

change master to master_host=’10.0.0.1‘, master_user=‘replication‘, master_password=‘password‘, master_log_file=‘mysql-bin.000001‘, master_log_pos=98;

Hierbei ist zu beachten, dass die Werte bei master_log_file und master_log_pos individuell geändert werden müssen. Die benötigten Werte haben wir zuvor auf dem MASTER Server einsehen können als wir in der MySQL Kommandozeile den Befehl show master status; ausgeführt haben!

Alternativ können wir auch die benötigten Werte direkt aus der Backup Datei entnehmen, das geht mit dem Befehl:

head /root/mysqldump.sql -n 25

Als Ausgabe bekommen wir:

…
…
…
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
…
…

In der MySQL Kommandozeile können wir die Eingabe dann überprüfen:

show slave status\G

Sollten die Werte master_Log_file und Read_master_log_pos korrekt sein, so können wir die Replikation starten:

start slave;

Jetzt geben wir ein weiteres mal show slave status\G ein und prüfen die Werte Slave_IO_Running und Slave_SQL_Running, diese sollten nun beide auf Yes stehen.

Ergänzung: Nur bestimmte Datenbanken replizieren bzw. bestimmte Datenbanken ignorieren
Da wir in diesem Tutorial bisher nur die komplette Datenbankstruktur replizieren, möchte ich noch darauf eingehen wie man nur bestimmte Datenbanken / Tabellen repliziert, oder bestimmte Datenbanken bei der Replizierung ignoriert.
Als Beispiel werden wir die Datenbanken mysql und information_schema aus der Replizierung rausnehmen. Es ist nicht immer Sinnvoll diese mit zu replizieren, da sie z.B. die Userinformationen der Mysql Datenbank enthält.

Auf dem MASTER öffnen wir die MySQL Konfigurationsdatei.

nano /etc/mysql/mysql.conf.d/mysqld.cnf

und fügen folgende Zeilen hinzu:

binlog_ignore_db        = mysql
binlog_ignore_db        = information_schema

Anschließend führen wir einen Reload von MySQL aus:

service mysql restart

Jetzt öffnen wir auf dem „SLAVE“ die Konfigurationsdatei.

nano /etc/mysql/mysql.conf.d/mysqld.cnf

und fügen folgende Zeilen hinzu:

replicate-ignore-db     = mysql
replicate-ignore-db     = information_schema

Auch hier führen wir jetzt einen Reload von MySQL aus:

service mysql restart

Erläuterung:

Kurz gesagt, binlog-ignore-db eine Einstellung des MASTER Servers, sie teilt dem MASTER mit keine der aufgelisteten Datenbanken zu protokollieren.
replicate-ignore-db hingegen ist eine Einstellung des SLAVE Servers, die dem SLAVE mitteilt welche Datenbanken ignoriert werden sollen.

Natürlich gibt es viele weitere Möglichkeiten der Datenbank Replizierung, z.B. nur einzelne Tabellen zu replizieren, oder, oder, oder. Allerdings würde das wohl den Rahmen eines Tutorials sprengen.

Dazu kann ich dir nur nochmal die MySQL Dokumentation empfehlen:

dev.mysql.com/en/

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.

Ein Tutorial zur automatisierten Überwachung wird in Kürze folgen!

Weitere Tutorials:
MYSQL Datenbanken ersellen und löschen
MYSQL Benutzer erstellen und Rechte vergeben

Replikation von einem Master zum Slave einrichten In folgendem Artikel werde ich dir zeigen, wie man eine MySQL Datenbank auf einem Ubuntu 16.04 Server installiert und eine Replikation von einem Master zum Slave einrichtet. Man sollte jedoch bedenken bzw. beachten: Die Replikation ist asynchron! Der Slave Server hinkt je nach Last dem Master Server hinterher […]

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 OpenLiteSpeed auf Ubuntu 16.04 installieren?

×

Entwickler?

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