Mysql
Mysql

Configurer la réplication MySQL Master/Slave sur CentOS 7

La réplication Mysql est un process qui vous permet de copier automatiquement les données depuis un serveur de base de donnée vers un ou plusieurs serveurs.

MySQL prend en charge un certain nombre de topologies de réplication :

  • Réplication master/slave : l’un des serveur de base de donnée agit comme un master tandis qu’un ou plusieurs serveurs agissent comme esclaves, cela veut dire que si le slave détecte un changement au niveau du master il va automatiquement le copier.
  • Réplication master/master : Dans ce cas les deux serveurs permet aux données d’être copiées de l’un ou l’autre serveur vers l’autre.

Dans cet article nous allons voir comment mettre en place la réplication MySQL master/slave avec un master et un slave sur CentOS 7.

Lab :

Pour mettre en place ce système de réplication je vais utiliser deux serveurs avec Centos 7 ayant les adresse IP ci-dessous :

-serveur master : 192.168.162.140
-serveur slave : 192.168.162.141

Installer MySQL :

Suivez l’article Comment installer mysql sur CentOS 7.

Configuration du serveur master :

Le ficher /etc/my.cnf :

Nous allons commencer par éditer le fichier /etc/my.cnf ( fichier de configuration de MySQL) et ajouter les lignes (en bleu) ci-dessous :

[mysqld]
bind-address=192.168.162.144
server-id=1
log_bin=mysql-bin
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Ensuite redémarrer le service mysqld :

[root@master ~]# systemctl restart mysqld
[root@master ~]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since sam. 2021-04-10 12:48:36 CEST; 8s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 5422 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 5493 (mysqld)
Status: "Server is operational"
CGroup: /system.slice/mysqld.service
└─5493 /usr/sbin/mysqld
avril 10 12:48:27 master systemd[1]: Starting MySQL Server…
avril 10 12:48:36 master systemd[1]: Started MySQL Server.

Utilisateur de réplication :

Ensuite il faut un utilisateur et lui donner les droits nécessaire pour répliquer les base de données, pour cela connectez vous à MySQL en tant que root :

#mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Exécuter ensuite la requête ci-dessous qui permet de créer l’utilisateur ‘rep’ qui se connecte depuis le slave avec le mot de passe ‘p@ssw0rd’ :

mysql > CREATE USER 'rep'@'192.168.162.145' IDENTIFIED BY 'p@ssw0rd';
Query OK, 0 rows affected (0.04 sec)

Accorder lui le privilège ‘REPLICATION SLAVE’ :

mysql > GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.162.145';
Query OK, 0 rows affected (0.03 sec)

Exécuter ensuite la commande suivante pour afficher le fichier binaire et la position :

mysql> SHOW MASTER STATUS\G
* 1. row *
File: mysql-bin.000001
Position: 716
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

Garder ces deux valeur quelque part on en aura besoin durant la configuration du slave.

Configuration du serveur slave :

Comme pour le master, éditer le fichier de configuration de MySQL et ajouter les lignes ci-dessous et redémarrer ensuite le service mysqld :

bind-address=192.168.162.145
server-id=2
log_bin=mysql-bin
[root@slave ~]# systemctl restart mysqld
[root@slave ~]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since dim. 2021-04-11 10:24:08 CEST; 8s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 1450 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 1474 (mysqld)
Status: "Server is operational"
CGroup: /system.slice/mysqld.service
└─1474 /usr/sbin/mysqld
avril 11 10:24:07 slave systemd[1]: Stopped MySQL Server.
avril 11 10:24:07 slave systemd[1]: Starting MySQL Server…
avril 11 10:24:08 slave systemd[1]: Started MySQL Server.

Maintenant nous allons configurer le slave pour qu’il puisse se connecter au master :

-Connectez-vous à mysql :

[root@slave ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

-Désactiver le slave :

mysql> STOP SLAVE;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

-Exécuter les requetes ci-dessous afin que le slave puisse repliquer du master :

CHANGE MASTER TO 
MASTER_HOST='192.168.162.146',
MASTER_USER='rep',
MASTER_PASSWORD='P@ssw0rd',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=716;

MASTER_HOST est l’adresse IP du master.
MASTER_USER est le nom d’utilisateur de réplication que nous avons créé tout à l’heure
MASTER_PASSWORD est le mot de passe de l’utilisateur de réplication
MASTER_LOG_FILE et MASTER_LOG_POS sont les deux valeur que je vous ai demandé de garder tout à l’heure.

Test de la configuration :

Sur le master connectez-vous à Mysql et créez une base de donnée :

#mysql -uroot -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> CREAT DATABASE Linux;

Si vous vous connecter au slave vous allez trouver que la base a été répliquée :

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Linux |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)