MySQL Multi Master Replikation. Niemand kann zwei Herren dienen (Matthäus 6,24)?

obey-title

Seit der MySQL-Version 5.7 gibt es eine Neuerung im Umfeld der Replikation: Multi Source Replication. In diesem Blog möchten wir Sie kurz darüber informieren, was die Besonderheiten dieses Replikationssetups sind und wie man dieses einrichtet. In unserem Beispiel soll es zwei Master (Port 3306 und 3307) und ein Replikat (Port 3308) geben. 

Globalisierung ist hier ein Segen

Die Voraussetzung für ein solches Setup ist der Einsatz von GTIDs (Globalen Transaktions-IDs). Eine global Transaktions-ID beinhaltet neben einer eindeutigen Transaktions-ID auch immer die UUID des originären Servers (DB), auf dem diese Transaktion durchgeführt wurde. GTIDs gibt es bei MySQL ab der Version 5.6

Mehr dazu unter: https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-concepts.html

Die Nutzung von GTIDs und ein paar weitere grundlegende Einstellungen sind bei den aktuellen Releases (wir haben mit der Version 8.0.19 getestet) so eingestellt, dass man direkt loslegen kann.

In unserem Beispielsetup haben wir drei Datenbankserver auf einem Host:

  • Port 3306; Master; db3306
  • Port 3307; Master; db3307
  • Port 3308, Replicate; soll die obenstehenden DBs db3306/07 replizieren

Vorbereitung ist alles.

Zunächst legen wir auf den beiden (!) Master-Systemen einen Replikations-User an:

# exemplarisch auf dem Server 3306
mysql 3306> create user 'repl'@'%' identified by 'repl'; 
mysql 3306> grant replication slave on *.* to 'repl'@'%'; 

Zusätzlich erstellen wir Sicherungen von den beiden zu replizierenden Datenbanken:

# exemplarisch das Backup des Servers 3306
bash> mysqldump -uroot -proot --socket=/tmp/mysqld.sock --databases db3306 > db3306.sql 

Diese Dumps beinhalten den Zeitpunkt des Backups in Form einer GTID. Diese wird aus den Backups ermittelt und gespeichert (notiert):

# exemplarisch für das Backup des Servers 3306
bash> cat db3306.sql |  grep GTID_PURGED | perl -p0 -e 's#/\*.*?\*/##sg' | cut -f2 -d'=' | cut -f2 -d$'\''
56c9de03-1ea6-11eb-9900-080027e0daf2:1-3 

Zusätzlich wird die Backup-Datei so überarbeitet, dass die entsprechende SET-Anweisung zum automatischen Setzen der GTID auf dem Replikat entfernt wird:

# exemplarisch für das Backup des Servers 3306
bash> sed '/GTID_PURGED/d' db3306.sql > db3306_clean.sql 

Nun werden auf dem Replikat-Server (3308) beide Backups der jeweiligen Master-Datenbanken eingespielt.

mysql 3308> source db3306_clean.sql
mysql 3308> source db3307_clean.sql 

Nach der Pflicht kommt die Kür

Nun können wir mit dem Einrichten der eigentlichen Replikation beginnen. Dazu werden auf dem Replikat (3308) die GTIDs der beiden Master-Systeme konfiguriert:

mysql 3308> SET @@GLOBAL.gtid_purged = "56c9de03-1ea6-11eb-9900-080027e0daf2:1-3, 9e5b06ec-1ea6-11eb-9cc5-080027e0daf2:1-3"; 

Im Anschluss daran werden zwei Replikations-Channels deklariert und Filter eingerichtet von welchem Master welche Daten repliziert werden sollen:

# exemplarisch jeweils nur für den Master 3306
mysql 3308> change master to master_host="192.168.56.101", master_user="root", master_password="root", master_ssl=1, master_port=3306, master_auto_position=1 for channel "master_3306";
mysql 3308> change replication filter replicate_wild_do_table = ('db3306.%‘) for channel "master_3306"; 

Der Filter sorgt dafür, dass nur die Tabellen aus der Datenbank „db3306" über den entsprechenden Kanal übertragen werden. Für den zweiten Master wird eine dementsprechende Konfiguration erzeugt.

Mittels des Kommandos „start slave" werden dann beide Channels aktiviert. Natürlich kann man die Channels auch getrennt starten und stoppen:

mysql 3308> START SLAVE FOR CHANNEL "master_3306";
mysql 3308> STOP SLAVE FOR CHANNEL "master_3306"; 

Das Monitoring der Replikation und der Channels kann über das althergebrachte „show slave status"-Kommando oder über entsprechende Views im „performance_schema" erfolgen:

Gib deinen HTML Code hier ein...

mysql 3308>mysql> select channel_name, source_uuid, service_state, last_error_message from replication_connection_status;
+--------------+--------------------------------------+---------------+--------------------+
| channel_name | source_uuid                          | service_state | last_error_message |
+--------------+--------------------------------------+---------------+--------------------+
| master_3306  | 56c9de03-1ea6-11eb-9900-080027e0daf2 | OFF           |                    |
| master_3307  | 9e5b06ec-1ea6-11eb-9cc5-080027e0daf2 | ON            |                    |
+--------------+--------------------------------------+---------------+--------------------+
2 rows in set (0,00 sec) 

Fazit

Wir hoffen, dass wir einen kurzen Überblick über das Thema Multi-Master-Replikation geben konnten. Die Einrichtung einer solchen Replikation ist recht einfach und dennoch sehr nützlich. Eine umfangreiche Dokumentation inkl. eines Beispielsetups finden Sie unter: https://dev.mysql.com/doc/refman/8.0/en/replication-multi-source.html

Natürlich stehen auch wir rund um Ihre Fragen zum Thema MySQL zur Verfügung. Sprechen Sie uns an.

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/