MySQL est un serveur de bases de données. Comme tout serveur de base de données, les données contenues à l’intérieur sont extrêmement importantes voire parfois vitales. Après vous avoir enseigné les quelques sécurités MySQL je vais désormais vous apprendre à manipuler la réplication MySQL, un mécanisme complexe d’utilisation mais permettant de redéployer rapidement une base de données plantée, de sauvegarder ses données ou encore de gérer du Load Balancing sur des données pratiquement statiques.
Avant de plonger dans le vif du sujet, je vais vous expliquer comment fonctionne la réplication.
La réplication MySQL se joue au moyen d’un principe de Maître-Esclave. Dans la configuration 5.x de MySQL, il ne peut y avoir qu’un seul maître par esclave, ou alors il faut ruser. Je vais vous expliquer pourquoi.
Les développeurs de MySQL ont choisi de définir le maître comme étant celui sur lequel se trouve la base utilisée et l’esclave comme réplicat.
La réplication s’effectue de la manière suivante :
Afin d’activer la réplication, votre serveur MySQL doit déjà écouter le réseau. Pour se faire, changez l’option bind-address. Si vous avez plusieurs interfaces réseau indiquez l’adresse IP de l’interface d’écoute. Si vous souhaitez mettre l’écoute sur toutes les interfaces tapez
bind-address = 0.0.0.0
Ensuite il faut activer l’identification serveur afin de pouvoir gérer la réplication. Décommentez la ligne server-id et donnez un identifiant unique à votre serveur.
server-id = 1
Activez maintenant les logs binaire, servant à la réplication
log-bin=mysql-bin
Nous allons définir les bases à répliquer ou non. Afin de sélectionner une base à répliquer, décommentez la ligne binlog_do_db. Si vous avez plusieurs bases entrez autant de lignes que de bases.
binlog_do_db = db1
binlog_do_db = db2
binlog_do_db = db3
ensuite nous allons ignorer les bases de données sensibles de MySQL, sur le même schéma que précédemment
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
Voilà qui termine la configuration software. Redémarrez mysql et lancez la console d’administration.
service mysql restart
mysql -p
Nous allons tout d’abord créer un utilisateur de réplication sécurisé et lui donner les droits nécessaires pour répliquer.
CREATE USER 'replic-1-fwd'@'10.16.64.1' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON db1.* TO 'replic-1-fwd'@'10.16.64.1' IDENTIFIED BY 'password';
Dans l’exemple précédent, nous avons créé l’utilisateur replic-1-fwd qui possède un mot de passe et pourra se connecter uniquement depuis la machine 10.16.64.1. Nous l’autorisons à répliquer la base db1 et toutes ses tables. Répétez l’action autant de fois qu’il y a de base à répliquer pour ce réplica.
Pour terminer, vérifiez la configuration du Maître en tapant :
SHOW MASTER STATUS;
Une fois ceci fait nous allons maintenant préparer le réplica.
Le réplica nécessite aussi un server-id. Ouvrez cette fois-ci le fichier my.cnf sur le réplica et entrez un server-id non utilisé sur votre réseau. En revanche, a contrario du Master, le réplica n’a pas besoin d’écouter sur le réseau .
server-id = 2
Passons maintenant en console MySQL et configurons le réplica:
replica# mysql -p
Enter your password: ******
mysql> CHANGE MASTER TO
MASTER_HOST='10.16.64.3',
MASTER_USER='replic-1-fwd',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.00001',
MASTER_LOG_POS=105;
Remplacez mysql-bin.00001 par la donnée que vous a renvoyé SHOW MASTER STATUS sur le maître et 105 par la position donnée.
Note: la configuration interactive du slave n’est possible que depuis MySQL 5.5. Il faut la configurer dans le my.cnf pour les versions inférieures
Il faut maintenant répliquer la base. Pour ce faire nous avons besoin d’un DUMP complet de celle-ci à l’instant T. Nous allons utiliser l’utilitaire mysqldump, l’envoyer sur le réplica et verrouiller provisoirement la base.
master# mysqldump db1 > db1.sql -p
Enter your password: ******
master# scp db1.sql root@10.16.64.1:/root/
master# mysql -p
Enter your password: ******
mysql> FLUSH TABLES WITH READ LOCK;
Passez maintenant sur le réplica. Nous allons créer et injecter la base à répliquer depuis la console MySQL.
mysql> CREATE DATABASE db1;
mysql> USE db1;
mysql> SOURCE /root/db1.sql
Voilà votre base est identique sur les 2 postes. Nous allons maintenant réactiver le mécanisme de réplication.
Sur le maître :
mysql> UNLOCK TABLES;
Sur l’esclave :
mysql> START SLAVE;
mysql> LOAD DATA FROM MASTER;
Voilà votre réplication SQL est terminée. Vous pouvez tester en insérant une donnée sur le maître, elle devrait être répliquée d’ici 1 minute sur l’esclave.
ATTENTION ! N’insérez JAMAIS de données sur l’esclave, vous risqueriez d’endommager la réplication. Il est possible de positionner un flag sur le slave pour qu’il soit uniquement en read-only.