Skip to main content

Master-Master-Replikation

Dieser Artikel zeigt, wie man mit 2 (oder mehr) MySQL-Servern eine echte Master-Master-Replikation aufsetzt, um die Server HA-tauglich zu machen.

Es gibt 2 Server: 

  • mysql1  192.168.1.10 10
  • mysql2 192.168.1.11

Als Heartbeat-IP kann man irgendeine IP verwenden, da MySQL automatisch auf allen konfigurierten IP-Adressen lauscht.

  • /etc/my.cnf auf mysql1 anpassen
[mysqld]
...
server-id=1
log-bin
...
  • auf mysql1 den Useraccount für die Replikation anlegen
mysql> grant replication slave on *.* to 'replication'@192.168.1.11 identified by 'slave';
  • MySQL-Server auf mysql1 neu starten
  • Nun auf mysql2 die Datei /etc/my.cnf anpassen
[mysqld]
...
server-id=2
master-host = 192.168.128.1
master-user = replication
master-password = slave
master-port = 3306
...
  • auf mysql2 den MysSQL-Server neu starten und in der MySQL-Konsole den Slave-Status ausgeben
mysql> show slave status\G;

*************************** 1. row ***************************
 
Slave_IO_State:	Waiting for master to send event
Master_Host:	192.168.1.10
Master_User:	replica
Master_Port:	3306
...
Slave_IO_Running:	Yes
Slave_SQL_Running:	Yes
...
1 row in set (0.00 sec)
  • Auf dem mysql1 kontrolliert man den Master-Status
mysql> show master status;

+------------------------+----------+--------------+------------------+
| File                   | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------------+----------+--------------+------------------+
|MysqlMYSQL01-bin.000016 |      132 |              | foobar           |
+------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
  • nun haben wir bereits ein funktionierenden Master-Slave-Setup, in den weiteren Schritten konfigurieren wir uns ein echtes Master-Master-Setup
  • auf mysql2 /etc/my.cnf anpassen
[mysqld]
...
server-id=2
log-bin
binlog-ignore-db=mysql
master-host = 192.168.1.10
master-user = replication
master-password = slave
master-port = 3306
  • den Replikationsaccount auf mysql2 anlegen
mysql> grant replication slave on *.* to 'replication'@192.168.1.10 identified by 'slave';
  • MySQL-Server auf mysql2 neu starten
  • /etc/my.cnf auf mysql1 anpassen
[mysqld]
...
master-host = 192.168.128.2
master-user = replication
master-password = slave
master-port = 3306
...
  • jetzt auch auf mysql1 den MySQL-Server neu starten
  • mit den altbekannten Kommandos „show slave status“ und „show master status“ den aktuellen Stand der Replikation kontrollieren. Auf beiden Systemen sollten folgende Zeilen erscheinen:
Slave_IO_Running:	Yes
Slave_SQL_Running:	Yes
  • im Falle eines Fehlers kann man in /var/log/mysqld.log nachlesen, was den Server grade stört