MySQL Master-Master replicatie

MySQL is een populair en lichtgewicht database voor (web)applicaties. Als deze applicaties horizontaal geschaald worden, kan dit meerdere MySQL databases betekenen. Maar wat als je de configuratie of data gelijk wil houden? Maar wel de performance van een lokale MySQL Database?
Daarvoor heeft MySQL het Master-Master Replicatie concept.
En gelukkig is het net zo eenvoudig te implementeren als het klinkt.

MySQL Installatie

In dit voorbeeld van een MySQL Master-Master Replicatie opzet hebben we een Centos 7 Operating System gebruikt.
Laten we eerst MySQL installeren. Download daarvoor MySQL van de officiële website: http://dev.mysql.com/downloads/repo/yum/

sudo su -
yum localinstall mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-server
service mysqld start
service mysqld status

Als de firewall actief is, open dan de MySQL poort.

firewall-cmd --get-active-zones
firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --reload

MySQL Root wachtwoord aanpassen:

grep 'temporary password' /var/log/mysqld.log
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root2MySQL!';

Dit doen we 2 keer, voor Server A en Server B.

Replicatie configureren

Eerst zetten we in MySQL de replicatie configuratie aan.

sudo vi /etc/my.cnf
Server AServer B
server_id = 1
log_bin = mysql-bin.log
log_bin_index = mysql-bin.log.index
relay_log = mysql-relay-bin
relay_log_index = mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
#binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = sys
binlog-ignore-db = performance_schema
#replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = sys
replicate-ignore-db = performance_schema
server_id = 2
log_bin = mysql-bin.log
log_bin_index = mysql-bin.log.index
relay_log = mysql-relay-bin
relay_log_index = mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
#binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = sys
binlog-ignore-db = performance_schema
#replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = sys
replicate-ignore-db = performance_schema

Zoals we kunnen zien in de tabel, is de configuratie bijna hetzelfde, maar verschilt het server_id en offset, waardoor het replicatie mechanisme onderscheid kan maken tussen Server A en Server B.

Note 1: In dit voorbeeld willen we dat creatie van databases en users ook gerepliceerd wordt, daarom kiezen we ervoor om de parameters: binlog-ignore-db = mysql en replicate-ignore-db = mysql uit te commentariëren.

Note 2: In plaats van een opt-out, kunnen we ook kiezen voor een opt-in logica voor de replicatie. Gebruik dan in plaats van de parameters: binlog-ignore-db en replicate-ignore-db, de parameters: binlog-add-db en replicate-add-db.

Nu MySQL herstarten om de parameters te activeren.

sudo service mysqld restart

Vervolgens maken we de users met de juiste rechten aan op Server A en Server B, waaronder de replicatie zal plaatsvinden.

mysql -u root -p
CREATE USER 'replicator'@'localhost' IDENTIFIED BY 'Repl2MySQL!';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'localhost' IDENTIFIED BY 'Repl2MySQL!';

CREATE USER 'replicator'@'ServerA' IDENTIFIED BY 'Repl2MySQL!';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'ServerA' IDENTIFIED BY 'Repl2MySQL!';

CREATE USER 'replicator'@'ServerB' IDENTIFIED BY 'Repl2MySQL!';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'ServerB' IDENTIFIED BY 'Repl2MySQL!';

Op deze manier zorgen we ervoor dat de users kunnen inloggen vanaf de localhost, Server A of Server B.
Als we willen dat vanaf elke server met deze user ingelogd kan worden, vervang dan ‘ServerA’ met ‘%’.

Even testen of het werkt en we kunnen inloggen.

mysql -u replicator -pRepl2MySQL! -h ServerA -P 3306

mysql -u replicator -pRepl2MySQL! -h ServerB -P 3306

Dan kan nu de replicatie aangezet worden van Server A naar Server B.

Op Server A halen we Master Replicatie status op:

mysql -u root -p

SHOW MASTER STATUS;

+------------------+----------+--------------+-------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                          | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------+-------------------+
|
mysql-bin.000001

|
704

      |              | information_schema,sys,performance_schema |                   |
+------------------+----------+--------------+-------------------------------------------+-------------------+

Op Server B gebruiken we deze gegevens om de replicatie op te zetten:

mysql -u root -p

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST = 'ServerA', MASTER_USER = 'replicator', MASTER_PASSWORD = 'Repl2MySQL!', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 704;
START SLAVE;

En natuurlijk de replicatie aanzetten van Server B naar Server A.

Op Server B halen we Master Replicatie status op:

mysql -u root -p

SHOW MASTER STATUS;

+------------------+----------+--------------+-------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                          | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------+-------------------+
|
mysql-bin.000002

|
1184

     |              | information_schema,sys,performance_schema |                   |
+------------------+----------+--------------+-------------------------------------------+-------------------+

Op Server A gebruiken we deze gegevens om de replicatie op te zetten:

mysql -u root -p

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST = 'ServerB', MASTER_USER = 'replicator', MASTER_PASSWORD = 'Repl2MySQL!', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 1184;
START SLAVE;

Testen

Alles is klaar, dus we kunnen de Master-Master Replicatie testen.

Op Server A maken we een database en tabel aan.

mysql -u root -p

create database Greater;
create table Greater.project (id varchar(10));

Laten we kijken of we die in MySQL op Server B kunnen vinden.

mysql -u root -p

show tables in Greater;

+-------------------+
| Tables_in_Greater |
+-------------------+
| project           |
+-------------------+
1 row in set (0.00 sec)

Dus dat werkt! Kijken of het de andere kant op ook werkt.

create table Greater.client (id varchar(10));

Eens kijken of we die in MySQL op Server A kunnen vinden.

mysql -u root -p

show tables in Greater;

+-------------------+
| Tables_in_Greater |
+-------------------+
| project           |
| client            |
+-------------------+
2 rows in set (0.00 sec)

EUREKA !

Referenties

 



Melle Visser
Auteur: Melle Visser
Mijn naam is Melle Visser. Sinds 1999 actief in de IT. In het begin als Oracle Database Adminstrator. Inmiddels ben ik expert in de Oracle eBusiness Suite, Portal, Apex, SOA-suite en OSB.

Geef een reactie