Introduction
Pour gagner en performance lors de requête de type SELECT, ou pour avoir une sauvegarde complète d’une base. La réplication MySQL est un très bon choix, nous allons voir ici la mise en place.
System maître linux : Debian etch
System esclave linux : Debian etch
Terminologie
Maître = master en anglais = serveur principal contenant les données de références
Escalve = slave en anglais = serveur reprenant fidèlement les données du maître.
Pré-requis
Maître
# apt-get install mysql-server |
mysql > CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; |
On crée un utilisateur spécifique à la réplication, qui doit avoir des droits spéciaux.
mysql > CREATE USER 'rep'@ '%'; |
| mysql > GRANT SELECT ,
RELOAD ,
SUPER ,
REPLICATION SLAVE ON * . *
TO 'rep'@ '%'
WITH MAX_QUERIES_PER_HOUR 0
MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0
MAX_USER_CONNECTIONS 0 ;
|
Dans le my.cnf : commentez la ligne
bind-address = 127.0.0.1
Pour permettre des connections externes.
Esclave
# apt-get install mysql-sever |
Mise en place
Maitre
Ceci est optionnel et permet de ne pas partir de zéro. Si vous voulez passer outre, ou si vous ne possédez aucune donnée pour le moment ignorer toutes les lignes qui commencent par ( !)
(!)mysql > FLUSH TABLES WITH READ LOCK; |
( !) Puis, on exporte par dump les données qu’on sauvegarde dans un fichier ".sql".
(!)mysql > SHOW MASTER STATUS; |
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000007 64178
Conservez ce résultat, il sera utile pour la suite.
(!) mysql > UNLOCK TABLES; |
Dans le my.cnf
server-id = 3301
log_bin = /var/log/mysql/mysql-bin.log
3301 : Numéro aléatoire mais unique qui nous permettra d’identifier le Maitre.
Esclave
Dans le my.cnf
server-id=3302
( !) Import du Dump maître sur l’esclave.
Définition du maître
| mysql > CHANGE MASTER TO
MASTER_HOST='192.168.1.112', -- Adresse Ip du Maitre
MASTER_USER='rep',
MASTER_PASSWORD='',
(!) MASTER_LOG_FILE='mysql-bin.000007',
(!) MASTER_LOG_POS=64178;
|
La synchronisation est effective. L’esclave va rattraper son retard automatiquement.
Chaque requête d’insertion sur le maitre sera envoyé sur le/les esclaves, cependant, aucune modification sur un esclave ne sera reporté sur les autres serveurs.
Attention donc, les esclaves ne sont là que pour la lecture et pour avoir un backup.
Test de Comportement
Test 1 : Démarrage sans accès
La lecture sur l’esclave se fait sans aucun problème.
Aucune insertion ne doit être faites sur l’esclave.
mysql > SHOW SLAVE STATUS; |
Slave_IO_Running : No
Slave_SQL_Running : Yes
Cela veut dire qu’aucune synchronisation n’est en cours, mais que le serveur SQL fonctionne.
Ajout d’une table sur le Maitre.
Rétablissement de la connexion Maitre Esclave.
Table récupéré automatiquement après 30 secondes.
Synchronisation effective par la suite.
| mysql > SHOW SLAVE STATUS;
Slave_IO_Running : Yes
Slave_SQL_Running : Yes
|
Tout est rentré dans l’ordre.
Test 2 : redémarrage de l’esclave pendant une synchronisation
La synchronisation continue après le redémarrage, tout est rentré dans l’ordre.
Problèmes et solutions
Une action qui bloque un esclave.
Sur l’esclave :
| mysql > SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
|
- Sautera la requête gênante, il faut parfois en passer 2, si la requête modifie des auto-increment.
- Remarque : en théorie, ce cas ne se retrouve que si une modification a été faites sur un esclave. Or ceci ne doit jamais être le cas.
Et pour éviter de se retrouver bloquer, mettre :
Dans le my.cnf de l’esclave
Ne pas redémarrer la synchronisation au lancement de MySql :
- Dans le my.cnf : skip-slave-start
|