Réplication asynchrone de MySQL avec du load balancing en utilisant un serveur Nginx comme frontal
Pour assurer une très haute disponibilité et une tolérance aux pannes liées à leurs serveurs de base de données, les entreprises ont opté pour la réplication de ces dernières, soit de façon synchrone ou asynchrone (selon les moyens et l’expertise).
Dans ce atelier, nous allons mettre en place un cluster MySQL composé de deux instances (Master-1 & Master-2). Une entité externe (Un serveur Nginx dans notre cas) qui jouera le rôle de load balancer.
/image%2F3625927%2F20220521%2Fob_6a111e_1.png)
Config IP
Nginx == 192.168.231.25
Master-1 == 192.168.228.1
Master-2 == 192.168.231.26
Installer mysql sur chacune de deux instances du cluster
# apt install mysql-server
Faire écouter le SGBDR en réseau
# nano /etc/mysql/mysql.conf.d/mysqld.cnf
/image%2F3625927%2F20220521%2Fob_dcde02_2.png)
Sur le Master-1
Dans le fichier /etc/mysql/my.cnf
[mysqld]
server-id=2
log_bin=/var/log/mysql/mysql-bin.log
auto_increment_increment=2
auto_increment_offset=1
Redémarrer le SGBDR
# service mysql restart
Créer un user de réplication
/image%2F3625927%2F20220521%2Fob_4e3352_3.png)
Faire un show master status pour copier les fichiers bin et la position à envoyer sur le second serveur
/image%2F3625927%2F20220521%2Fob_1cb460_4.png)
Faire les mêmes config sur les second master.
Faire écouter le SGBD en réseau, et faire les configs suivantes dans le fichier ci-dessous :
Dans le fichier /etc/mysql/my.cnf
[mysqld]
server-id=1
log_bin=/var/log/mysql/mysql-bin.log
auto_increment_increment=2
auto_increment_offset=2
Redémarrer le SGBDR
# service mysql restart
Créer un utilisateur de réplication aussi et lui donner les droits de réplications comme sur le premier master.
/image%2F3625927%2F20220521%2Fob_fc789a_5.png)
Activation de la réplication
Arrêter le slave et renseigner les informations du master 1 sachant que vous êtes sur le master 2.
/image%2F3625927%2F20220521%2Fob_4ad2bc_6.png)
Maintenant prendre les informations du master2 à copier sur le master1
/image%2F3625927%2F20220521%2Fob_7f72e7_7.png)
Retourner maintenant sur le Master-1 et faire les actions suivantes :
/image%2F3625927%2F20220521%2Fob_ca9120_8.png)
Depuis le Master-1, nous pouvons afficher l'état du slave
/image%2F3625927%2F20220521%2Fob_2d4a8d_9.png)
Il attend les événements provenant de l'autre instance !
De même sur le Master-2
/image%2F3625927%2F20220521%2Fob_10bfeb_10.png)
A cet instant, les deux instances sont synchronisées !
III : Occupons-nous à la mise en place du frontal
# apt install curl gnupg2 ca-certificates lsb-release -y
# echo "deb http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
# curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
# apt update ; apt install nginx -y
Configuration
Dans le fichier /etc/nginx/nginx.conf
stream {
upstream mysqlproxy {
least_conn;
server 192.168.228.1:3306 weight=2;
server 192.168.231.26:3306;
}
server {
listen 3306;
proxy_pass mysqlproxy;
}
}
Redémarrer Nginx
# service nginx restart
Puisque Nginx est avant tout un serveur Web, il devrait écouter sur le port 80
/image%2F3625927%2F20220521%2Fob_34927d_11.png)
Rappel :
Nginx == 192.168.231.25
Master-1 == 192.168.228.1
Master-2 == 192.168.231.26
Pour tester le fonctionnement, sur l’une des instances, nous allons créer un user auquel nous allons attribuer tous les droits sur toutes les BD, ...
/image%2F3625927%2F20220521%2Fob_e09170_12.png)
Notre client va se connecter depuis n’importe qu’elle machine du réseau ayant le client MySQL.
/image%2F3625927%2F20220521%2Fob_f6845b_13.png)
Liste des BD
/image%2F3625927%2F20220521%2Fob_239def_14.png)
Il peut même créer d’autres BD (étant donné qu’il a tous les droits sur toutes les bases de données et leurs tables).
/image%2F3625927%2F20220521%2Fob_7c81b4_15.png)
Vérifions cela sur Master-2
/image%2F3625927%2F20220521%2Fob_62eca0_16.png)
C'est assez clair !!!