Nous allons voir comment mettre en place un service MySQL de réplication de base de données de type Maitre-Maitre. Le but est de pouvoir sauvegarder, de manière bidirectionnelle, toutes les données que nous ajoutons sur un serveur MySQL afin de lutter contre de potentielles pertes.

Nous utiliserons ici deux serveurs distincts :

  • Le serveur MySQL1 avec pour @IP : 192.168.0.21
  • Le serveur MySQL2 avec pour @IP : 192.168.0.22

Installation des paquets nécessaires :

Nous allons commencer par installer le service MySQL sur nos deux machines :

$ apt-get update --yes
$ apt-get install mysql-server --yes

Nous utiliserons dans notre tutoriel ‘motdepasse’ comme identifiant de nos services.

Configuration du Serveur MySQL1 :

Passons maintenant à la configuration de notre serveur maître :

Nous nous connectons à notre service MySQL afin de créer la base de données qui sera répliquée :

$ mysql -u root -p
mysql> CREATE DATABASE exempledb;
mysql> exit

Il faut ensuite éditer le fichier /etc/mysql/my.cnf pour permettre au service d’accepter les connexions entrantes depuis l’extérieur de la machine :

$ nano /etc/mysql/my.cnf
#bind-address = 127.0.0.1

Et configurer les lignes suivantes ainsi :

server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = exempledb

Nous redémarrons MySQL afin de prendre en compte nos modifications.

$ service mysql restart

Nous allons maintenant créer l’utilisateur « repuser » qui sera dédié au service de réplication des données :

$ mysql -u root -p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repuser'@'192.168.0.22' IDENTIFIED BY 'motdepasse';
mysql> FLUSH PRIVILEGES;
mysql> USE exempledb;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
mysql> exit

Capture.PNG

Les valeurs des colonnes ‘File’ et ‘Position’ sont à garder puisqu’elles nous serons nécessaire plus tard.

Nous pouvons désormais faire un dump de la base données ‘exempledb’ :

$ mysqldump -u root -p exempledb > exempledb.sql

On peut alors désactiver le mode de lecture seule :

$ mysql -u root -p
mysql> USE exempledb; 
mysql> UNLOCK TABLES;
mysql> exit

Puis on envoie notre fichier contenant les données de notre base vers notre serveur MySQL2 :

$ scp exempledb.sql root@192.168.0.22:/root/

Capture2.PNG

Configuration du Serveur MySQL2 :

On se connecte maintenant sur notre serveur MySQL2 afin d’y créer la base de données ‘exempledb’ qui doit être répliquée :

$ mysql -u root -p
mysql> CREATE DATABASE exempledb;
mysql> exit

Et on y importe les données de MySQL1 grâce au fichier dump :

$ mysql -u root -p exempledb < exempledb.sql

Capture3.PNG

On configure ensuite comme pour notre serveur MySQL1 le fichier /etc/mysql/my.cnf de la manière suivante :

$ nano /etc/mysql/my.cnf
#bind-address = 127.0.0.1
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = exempledb

On redémarre le service MySQL pour prendre en compte les modifications :

$ service mysql restart

On se connecte au service MySQL afin de configurer la réplication :

$ mysql -u root – p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repuser'@'192.168.0.21' IDENTIFIED BY 'motdepasse';
mysql> FLUSH PRIVILEGES;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.21', MASTER_USER='repuser', MASTER_PASSWORD='motdepasse', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 342;
mysql> START SLAVE;

Capture4

N’oubliez pas de modifier les valeurs des colonnes ‘File’ et ‘Position’ que nous avons notés précédemment puisse qu’elles ne sont pas les mêmes en fonction des installations.

Il faut maintenant récupérer les informations de notre serveur afin d’activer la réplication depuis le serveur MySQL1 :

mysql> SHOW MASTER STATUS

Capture

On note une nouvelle fois ces informations qui nous seront utiles dans l’étape d’après.

Activation de la réplication sur MySQL1 :

$ mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.22', MASTER_USER='repuser', MASTER_PASSWORD='motdepasse', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 342;
mysql> START SLAVE;

Capture5

Il ne faut pas oublier de modifier les informations de ‘File’ et ‘Position’ en fonction de notre installation.

Tester notre service :

Nous allons maintenant tester notre service de réplication afin d’être sûr qu’il soit fonctionnel.

Sur notre serveur MySQL1, nous créons une nouvelle table ‘exempletable1’ dans notre base de données ‘exempledb’ qui est normalement répliquée.

$ mysql -u root -p
mysql> USE exempledb;
mysql> CREATE TABLE exempletable1 (              
    -> ID INT NOT NULL AUTO_INCREMENT,              
    -> TEST VARCHAR(100) NOT NULL,              
    -> PRIMARY KEY (ID));

Capture6

Puis on se rend sur notre serveur MySQL2 afin de vérifier que la table ait bien été ajoutée dans la base de données :

$ mysql -u root -p
mysql> USE exempledb;
mysql> SHOW TABLES;

Capture7.PNG

La table ‘exempletable1’ que nous avons créée sur notre serveur MySQL1 a été ajoutée automatiquement dans la base de données ‘exempledb’ de notre serveur MySQL2.

Ensuite nous recréons une seconde table ‘exempletable2’ dans notre base de données ‘exempledb’ depuis notre serveur MySQL2 :

mysql> CREATE TABLE exempletable2 (
    -> ID INT NOT NULL AUTO_INCREMENT,
    -> TEST VARCHAR(100) NOT NULL,
    -> PRIMARY KEY (ID));

Capture8.PNG

Puis on se rend sur notre serveur MySQL1 afin de vérifier que la table ait bien été ajoutée dans la base de données :

$ mysql -u root -p 
mysql> USE exempledb; 
mysql> SHOW TABLES;

Capture9

La table ‘exempletable2’ que nous avons créée sur notre serveur MySQL2 a été ajoutée automatiquement dans la base de données ‘exempledb’ de notre serveur MySQL1 en plus de la base ‘exempletable1’ que nous avons créée juste avant. Notre service est donc fonctionnel.