Réplication mysql
Par Christophe de saint leger le vendredi, décembre 11 2009, 16:39 - Serveur - Lien permanent
MIse en place
Après avoir écrit cet article je me suis aperçu que le procédé ne fonctionne pas parfaitement ....
notamment si des données existent déjà sur le serveur maître .
Je vous présente donc ma façon de faire , afin de mettre en place une réplication avec un serveur déjà en production .
Note : Pas de différence entre le moteur des tables MyIsam , InnoDb .
Utilisateur de replication
Je vais créer sur le maître un utilisateur , qui aura les droits pour effectuer sa réplication .
mysql -uroot -p******* CREATE USER 'slave_user'@'%' IDENTIFIED BY 'motdepasse'; GRANT REPLICATION SLAVE ON *.* TO slave_user@'%' IDENTIFIED BY 'motdepasse'; FLUSH PRIVILEGES;
Faits attention à ce qu'il n'y ai pas plusieurs utilisateurs du même nom .
Fichiers de conf
Il nous faut faire quelques modifications dans les fichiers de conf des serveurs maître est esclave ... pas de panique , quivez le guide .
Maître
vim /etc/mysql/my.cnf
Dans la section mysqld Il faut juste vérifier à ce que les paramètres suivants soient dé-commentés.
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
Server-id se doit d'être unique , sur l'esclave , nous mettrons donc 2
Par contre , commentez le paramètre suivant:
#bind-adress = 127.0.0.1
Sans quoi les connexions extérieures n'aboutirons pas .
Esclave
vim /etc/mysql/my.cnf
Dans la section mysqld Il faut juste vérifier à ce que les paramètres suivants soient dé-commentés et configurés.
server-id = 2 master-host=ipservmaitre master-user=slave_user master-password=****** master-port=3306
Par contre , commentez le paramètre suivant:
#bind-adress = 127.0.0.1
Sans quoi les connexions extérieures n'aboutirons pas .
Ensuite , Commençons par couper les services qui écrivent sur les bases
Sur le maître et l'esclave :
Dans mon cas , je n'ai eu qu'à couper apache et cron
/etc/init.d/apache2 stop /etc/init.d/cron stop
Sur le maître
Le principe est le suivant :
- RESET des logs binaires
- Visualisation de la position
- Dump
- Envoie du dump ver l'esclave
1 RESET des logs 2:Position
Connectons nous à mysql:
mysql -uroot -p******* RESET MASTER; SHOW MASTER STATUS; exit
Ce qui doit donner :

Il vous faut noter précieusement le nom du fichier binaire , et la position ici par exemple :
- mysql-bin.000001
- 13860
3 Dump des bases du maître
Dans mon cas , je vais repliquer l'ensemble des bases de mon serveur maître, j'utilise donc la commande suivante :
mysqldump -uroot -p******* --databases databaseA databaseB databaseC >/root/dump.sql
Note: je n'ai pas utilisé --all-databases , pour la simple raison , que cela produit un conflit avec la base information_schema et mysql , j'ai donc sélectionné toutes mes bases .
4: Envoie du dump vers le serveur esclave
Bon , juste pour rappel hein ...
scp /root/dump.sql adminservEsclave@ipservesclave:/home/adminservEsclave/dump.sql
Voilà laissons le maître de coté , passons à l'esclave ..
L'esclave:
Voilà le programme ...
- On vide entièrement mysql pour être sur du neuf
- Importation du dump
- Arrêt SQL_SLAVE
- RESET SQL SLAVE
- Définition du master
- Redémarrage du master
- Tests
1 nettoyage:
une simple requête :
DROP DATABASES databaseA; DROP DATABASES databaseB; DROP DATABASES databaseC;
2 Importation
L'importation aussi simple que l'export :
mysql -uroot -p******* < dump.sql
L'informatique compliqué ... quenéni !!!
3 Reconfiguration SLAVE
Nous voilà à l'étape de configuration de l'esclave .. commençons par le couper
mysql -uroot -p******* STOP SLAVE; RESET SLAVE;
Puis définissons le master (toujours dans la console mysql)
CHANGE MASTER TO MASTER _HOST='ip du maitre', MASTER_USER='slave_user', MASTER_PASSWORD='pwdslaveuser', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=13860; SLAVE START;
Voyez l'utilisation du nom du fichier de logs binaires , et la position noté auparavant .
J'ai eu des soucis pour le bon démarrage de l'esclave , je suis obligé de le redémarrer complètement
STOP SLAVE; RESET SLAVE; START SLAVE;
4 : passons aux tests
Il faut nous assurer que l'esclave soit bien démarré , pour cela utilisez la commande sql suivant :
SHOW SLAVE STATUS;
Ce qui donne quelque chose du genre :

Il faut vérifier le début , à savoir :
- Slave_IO_State soit à Waiting for master to send event
- Slave_IO_Runnig soit à Yes
- Slave_SQL_Running soit aussi à Yes
Ne vous reste plus qu'à tester l'évolution de la valeur de la position ( dans le log binaire ) à l'insertion d'un enregistrement sur le serveur maître ...
Ici la valeur qui doit évoluer : 972765
A savoir
- Il est IMPERATIF de ne pas faire d'insertions sur le serveur esclave , seul les sélections sont possible, sinon , votre réplication s'arrêtera.
- Les valeurs des screens ci dessous ne correspondent pas ensembles , pour la simple raison que les commandes pour faire cet article se sont fait sur des postes qui ne sont pas de vrai replications.
Si vous avez des commentaires , n'hésitez pas .
Ch.
Toujours est-il ,


Commentaires
Un seul mot: MERCI!!!