Mettre en place une réplication entre plusieurs bases de données MariaDB

1 – Préambule

Nous allons mettre en place une réplication entre deux bases de données mariadb, ce qui signifie que ce qui se passe sur une base sera automatiquement renvoyé sur l’autre base

Attention : il faut prévoir un maître et un ou des esclaves

Le maître sera celui qui envoie les données, le ou les esclaves seront ceux qui recevront les données

Un cas précis serait de mettre une base en écriture et une ou plusieurs bases en lecture

Cela permettrai de rediriger le trafic entre les utilisateurs qui vont écrire dans la base (faire des commandes, etc…) et les utilisateurs qui vont lire la base (voir leurs infos, voir leurs commandes, etc…)

Cela permet, à terme, une scalabilité horizontale d’une application

Dans notre exemple nous allons avoir le « Master » qui aura l’ip 192.168.1.169 et un seul « Slave » qui aura l’ip 192.168.1.91

Notre base de données sera nommée test et aura une seule table nommée test

2 – Préparation du master

Toutes les commandes seront à faire sur le serveur « Maître »

2.1 – Modifier la configuration de MariaDB

Éditer le fichier /etc/mysql/mariadb.conf.d/50-server.cnf

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Repérer la ligne bind-address, et mettre à la place

bind-address = 0.0.0.0
server-id = 1
log_bin = mariadb-bin
binlog_format = ROW

Enregistrer le fichier

Redémarrer MariaDB

sudo systemctl restart mariadb

2.2 – Création de l’utilisateur qui va servir pour la réplication

Se connecter à mariaBD

sudo mysql -u root

Créer l’utilisateur

CREATE USER 'nomutilisateurreplication'@'192.168.1.%' IDENTIFIED BY 'motdepasseutilisateur';

Changer le nomutilisateurreplication par le nom désiré et le motdepasseutilisateur par le mot de passe désiré

Donner les accès à l’utilisateur pour qu’il puisse répliquer

GRANT REPLICATION SLAVE ON *.* TO 'nomutilisateurreplication'@'192.168.1.%';
FLUSH PRIVILEGES;

2.3 – Verrouillage des tables et récupération des infos Binlog

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Noter les valeurs dans un coin

2.4 – Faire une sauvegarde de la base master pour pouvoir la réinjecter dans le slave

mysqldump -u root -p --all-databases --master-data=2 > dump.sql

Récupérer le fichier dump.sql sur le poste – voir tuto SCP si nécessaire

Déverrouiller le master

UNLOCK TABLES;

3 – Préparation du slave

Toutes les commandes seront à faire sur le serveur « Esclave »

3.1 – Éditer le fichier /etc/mysql/mariadb.conf.d/50-server.cnf

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Après bind-adress rajouter

server-id = 2
relay_log = relay-bin

Enregistrer le fichier

Redémarrer MariaDB

sudo systemctl restart mariadb

3.2 – Importer le fichier dump crée à l’étape 2.4

Voir le tuto sur SCP si nécessaire pour mettre le fichier sur le serveur esclave

mysql -u root -p < dump.sql

3.3 – Configurer la réplication

Se connecter sur mariaDB

mysql -u root -p

Passer la commande suivante en modifiant les valeurs que l’on a mises tout au long de ce tuto

CHANGE MASTER TO
  MASTER_HOST='ipdumaster',
  MASTER_USER='nomutilisateurreplication',
  MASTER_PASSWORD='motdepasseutilisateur',
  MASTER_LOG_FILE='nomfichieretape2.3',
  MASTER_LOG_POS=positionetape2.3;

Démarrer l’esclave

START SLAVE;

3.4 – Vérification

SHOW SLAVE STATUS\G

Vérifier surtout

  • Slave_IO_Running : Yes
  • Slave_SQL_Running : Yes
  • Seconds_Behind_Master : 0 (ou proche)

4 – Tester une insertion dans la base pour voir si ça réplique bien

Et sur le slave

5 – Bonus

Pour rajouter d’autres slave, on reprends au 2.3 pour retrouver le fichier et la position

Et dans l’étape 3.1 on mets un server-id à 3, ou 4, ou 5, etc…