Eine Datenbank Replikation braucht man eigentlich selten, doch für sehr wichtige Applikationen wo möglichst kein Downtime auftreten soll bei Hardware Fehlern, eignet sich eine Datenbank Replikation.
Eine Replikation ist jedoch kein Backup, da beide Datenbanken ohne Verzögerungen den gleichen Stand haben. Wenn Daten aus der Master DB gelöscht werden, so sind diese zeitgleich auf der Slave DB gelöscht.
Diese Tutorial ist für Debian Lenny geschrieben, sollte aber für alle Linux Versionen sehr ähnlich ablaufen. Unsere Datenbank heisst exampledb.
Als Erstes nehmen wir die Konfiguration am Master vor. Wir müssen zulassen, das der Slave Server auf die Datenbank kommt und passen dazu die /etc/mysql/my.cnf an (existierende Zeilen bitte anpassen, restliche hinzufügen):
#skip-networking
#bind-address = 127.0.0.1log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db=exampledb
server-id=1
Anschliessend, restarten wir den MySQL Dienst:
/etc/init.d/mysql restart
Anschliessend müssen wir ein USer erstellen, welcher die Replication Rechte hat, dazu müssen wir uns am MySQL Server einloggen:
mysql -u root -p
NAch dem richtigen Password, können wir folgende Befehle absetzen:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
Weiterhin müssen wir nun gewisse Informationen haben und geben den Befehl
USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Was Euch dann folgende Ausgabe ergibt:
+---------------+----------+--------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| mysql-bin.004 | 261 | exampledb | |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Schreibt euch die rot markierte Information auf für später.
Nun kann man die MySQL Verbindung schliessen mit
quit;
Es gibt nun 2 Möglichkeiten wie man den initialen Load vom Master in den Slave bekommt. Die erste Möglichkeit ist ein Backup vom der MAster DB zu machen und in dem Slaveserver einzuspielen, die 2te ist mit einem Befehl wo man auf dem Slave startet.
Startet man die Replikation mit einem Befehl und hat viele Daten in der Master DB, dann wird dies einige Zeit in Anspruch nehmen und solange wird die Applikation nicht funktionieren, dafür hat man selber sehr wenig zu tun. Grundsätzlich sollte man aber die erste Replikation zu Randzeiten starten und nicht inmitten des Tages, daher spielt dies keine Rolle.
Ich werde beide Arten beschreiben.
Nun müssen wir uns nochmals mit der MySQL verbinden und die Tablesperre aufheben:
mysql -u root -p
Enter password:
UNLOCK TABLES;
quit;
Nun können wir uns dem Slaveserver widmen.
Als Erstes müssen wir nun eine Datenbank erstellen, welche den gleichen Namen wie auf dem Masterserver hat. Dazu verbinden wir uns mit der MySQL:
mysql -u root -p
CREATE DATABASE exampledb;
quit;
Als Nächstes müssen wir dem Slave sagen, wo die Master Datebank zu finden ist und fügen dazu die folgende Konfiguration in /etc/mysql/my.cnf ein:
server-id=2
master-host=IP Adresse vom Master Server
master-user=slave_user
master-password=password
master-connect-retry=60
replicate-do-db=exampledb
Danach restarten wir den MySQL Dienst:
/etc/init.d/mysql restart
Damit am Ende alles funktioniert müssen wir nun noch den Slave stoppen:
mysql -u root -p
SLAVE STOP;
Die beim Master notierte Ausgabe muss nun hier eingefüllt werden. Anschliessend senden wir den Befehl auf der MySQL Konsole ab.
CHANGE MASTER TO MASTER_HOST='IP Adresse vom Master Server', MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.004', MASTER_LOG_POS='261';
Mit dem Befehl:
START SLAVE;
quit;
Starten wir den Slave wieder und verlassen die MySQL Konsole. Die Replikation ist nun eingerichtet.
PS: Eine zeitverzögerte MySQL Replikation ist von Haus auf nicht möglich. Wer dennoch Interesse daran hat, sollte sich das Maatkit mal genauer anschauen.