Serverbeheer bij ICT Makers

Veel organisaties hebben maar één MySQL-server waar dagelijks op wordt gewerkt. Vaak komt, wanneer een bedrijf groeit, de vraag op: "Hoe kunnen we de beschikbaarheid van onze MySQL-server vergroten?" In dit artikel maken we een MySQL master-master replicatie die bestaat uit twee servers. Beide servers vervullen een master/slave-rol waarmee ze elkaar repliceren.

Hieronder lees je hoe je de master-master replicatie configureert. Let op: wanneer de replicatie werkt, betekent dat nog geen automatische fail-over voor gebruikers. Op de achtergrond repliceren de machines met elkaar, maar als server 1 uitvalt gaan verbindingen niet automatisch naar server 2. Advies of ondersteuning nodig? Bekijk dan onze serverbeheer-mogelijkheden.

MySQL master-master

Een MySQL master-master replicatie is uitsluitend bedoeld om hogere beschikbaarheid te realiseren. Zoek je naar meer performance én hogere beschikbaarheid, overweeg dan een Galera-cluster: een minimale Galera-opzet bestaat uit 3 machines, tegenover minimaal twee bij een master-master-omgeving.

Hoe werkt het

Een master-master- en master-slave-replicatie werkt met een binary log, een functie die MySQL al geruime tijd ondersteunt. Die binary log houdt alle wijzigingen bij: doet een gebruiker op server 1 een update-query, dan publiceert server 1 die query in zijn binary log. Server 2 verwerkt die binary log vervolgens en past dezelfde wijzigingen toe op zijn eigen dataset.

Stel dat gebruiker A verbonden is met MySQL-1 en gebruiker B met MySQL-2, en beiden tegelijk een INSERT-query uitvoeren. Dat geeft een probleem: de server die de INSERT verwerkt, geeft direct een COMMIT terug zonder te weten dat de andere server dezelfde query ook verwerkt. Bij een replicatiefout stopt de replicatie tussen de servers zelfs helemaal, waarna je als systeembeheerder dubbele primary-key-fouten moet opruimen om de data weer samen te voegen.

Het is dus belangrijk dat gebruikers via een fail-over-constructie altijd naar slechts één van de twee servers schrijven.

Configureren

De onderstaande commando's moeten op beide servers uitgevoerd worden, tenzij anders aangegeven.

Installeer de MySQL 5.7-repository:

rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

Installeer de MySQL community server:

yum install mysql-server

Wijzig /etc/my.cnf en voeg server-id=1 en log-bin=mysql-bin toe (voor server 2 wordt dit server-id=2).

Stop de firewall en schakel deze uit, zodat deze niet meer opstart:

systemctl stop firewalld
systemctl mask firewalld

Start MySQL op:

systemctl start mysqld

Zoek het tijdelijke wachtwoord op:

grep "temporary password" /var/log/mysqld.log

Log in met MySQL en wijzig het rootwachtwoord:

mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'JOUWWACHTWOORD';

Maak een replicatiegebruiker aan en geef deze rechten:

create user 'replication'@'%' identified by 'JOUWWACHTWOORD';
grant replication slave on *.* to 'replication'@'%' identified by 'JOUWWACHTWOORD';
flush privileges;

Start op server 2 MySQL op met systemctl start mysql, log in op MySQL en zoek de binary log en de positie op. Onthoud deze: je gebruikt ze in het volgende commando.

show master status \G;
change master to master_host = 'IPADRESANDERESERVER', master_user = 'replication', master_password = 'JOUWWACHTWOORD', master_log_file = 'mysql-bin.000002', master_log_pos = xxx;

Start na dit commando de slave-rol en controleer de status:

start slave;
slave status \G;

Werkt de replicatie, dan zie je geen fouten in het overzicht staan. Zie je die wel, dan is er iets misgegaan. Heb je een fout gemaakt in het "change master"-commando, stop dan eerst de slave-rol met stop slave;, pas daarna de "change master" opnieuw aan. Controleer de status op beide servers.