Ich als Betreiber von einem großen DynDNS Dienst (IPv64.net) muss für meine Nameserver den richtigen Weg finden, um meine Datenbanken abzugleichen. Was bietet sich mehr an als eine MySQL Replikation. Für mich war natürlich eine asynchrone Replikation ausreichen.

Asynchrone Replikation bedeutet, dass die Daten auf den Slave zwar kopiert werden und synchron gehalten werden, aber für den Client die Bestätigung bereits kommt, wenn der Master die Daten geschrieben hat. Also es kann vorkommen, dass auf dem Slave die Daten erst wenige Millisekunden später kopiert werden und dann zur Verfügung stehen. Das nennt man Asynchron.

Aber eben genau da, z.B. bei Webseiten ist das nicht grundlegend schlimm, wenn der Datenbankbestand ein paar Millisekunden abweicht.

1. MySQL Replikation einrichten – Master Einstellungen

Als Erstes legen wir einen Benutzeraccount auf dem Master an, welcher benutzt werden darf von den Slaves für die Replikation. Ändert natürlich nach Bedarf, die IP-Adresse, den Benutzernamen und das Passwort.

mysql -u root -p

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY 'password';

Es folgen einige kleine Änderungen in der “/etc/my.conf” (MySQL) oder “/etc/mysql/mariadb.conf/50-server” (MariaDB). Danach starten wir den MySQL Dienst neu und überprüfen unsere Einstellungen.

log_bin = mysql-bin
server_id = 1
sync_binlog = 1
bind-address = 192.168.0.1 <Nimm hier deine IP>

## MySQL Neustarten ##
service mariadb restart

## Master Status überprüfen ##
mysql -u root -p

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

2. MySQL Replikation einrichten – Slave Einstellungen

Es folgen einige kleine Änderungen in der “/etc/my.conf” (MySQL) oder “/etc/mysql/mariadb.conf/50-server” (MariaDB).

server_id = 2
relay_log = mysql-relay-bin
read_only = 1

3. Daten auf den Slave kopieren

Jetzt müssen wir initial 1x die Daten (wenn vorhanden) auf den Slave kopieren, damit der Datenstand auf Master und Slave beim starten der Replikation gleich ist.

## Auf dem MASTER ##
mysqldump --all-databases --allow-keywords --single-transaction --flush-logs --master-data=2 -r /root/mysqldump.sql

## Daten auf den Slave kopieren ##
scp mysqldump.sql root@<IP-Adresse>:/root

## Master Status anzeigen lassen ##
mysql -u root -p

mysql> show master status;
## Auf dem Slave Datenbank importieren ##
cat /root/mysqldump.sql | mysql -u root -p

4. MySQL Replikation starten

Jetzt starten wir die Replikation auf dem Slave.

GANZ WICHTIG: Mit dem nächsten Befehl müssen die Daten “master_log_file” & “master_log_pos” übereinstimmen mit der Ausgabe von dem “show master status” Befehl.

mysql -u root -p

mysql> change master to master_host='<IP-Addresse>', master_user='repl', 
  master_password='password', master_log_file='mysql-bin.000001', master_log_pos=98;

## Slave starten ##
mysql> start slave;

## Replikation Status auf Slave überprüfen ##
mysql> show slave status\G

## Replikation Status auf Master überprüfen ##
mysql> show master status;

Das war’s. Jetzt werden jegliche Änderungen auf dem Master sofort auf den / die MySQL Slaves kopiert. Du kannst nun die Slave Datenbank Server als lesende Datenbanken verwenden und den Master weiter entlasten. Der Slave kann natürlich auch im Falle eines großen Ausfalls zum Master promotet werden.

Das folgende Bild zeigt auch wie ich die Replikation in dem Dienst IPv64.net verwende.

IPv64.net MySQL Replikation
IPv64.net MySQL Replikation