La réplication est supportée par MySQL depuis la version 3.23.15. Elle est unidirectionnelle, c’est-à-dire que les modifications effectuées sur un serveur peuvent être répliquées sur un autre.
Un esclave ne peut avoir qu’un maître mais peut aussi être maître d’autres serveurs. Le principe de fonctionnement est le suivant :
Les serveurs MySQL esclaves se connectent au serveur MySQL maître et sont à l’écoute de chaque modification pour que les modifications intervenant sur le serveur MySQL maître puissent être transmises par le serveur MySQL maître, il est nécessaire d’activer sur celui-ci les journaux binaires.
La réplication reproduit les modifications effectuées sur le serveur MySQL maître sur l’ensemble de des serveurs MySQL esclaves. Ceci permet d’augmenter les performances en lecture en augmentant le nombre de réplicats.
Pour avoir une réplication dans les deux sens c’est à dire une configuration maître-maître, il faut définir une réplication maître-esclave bidirectionnelle. Le premier maître est donc l’esclave du second et le second est aussi l’esclave du premier.
Installez sur un premier serveur une base de données contenant une seule table. Dans ce tutoriel ce serveur est situé à l’adresse 192.168.1.27. Ce sera le serveur MySQL Maître.
Adaptez les adresses IP de ce tutoriel aux adresses IP réelles de vos VMs.
Dans ce tutoriel, votre 2eme serveur LAMP avec Debian a l'adresse IP 192.168.1.18 et ne contient aucune base de données GLPI. Ce sera le serveur MySQL esclave.
Créez un utilisateur spécial pour la réplication sur le maître avec les droits de REPLICATION SLAVE. Vous devez aussi lui donner les droits de connexion depuis tous les esclaves. Comme cet l'utilisateur ne fait que de la réplication (ce qui est recommandé), vous n'avez pas à lui donner d'autres droits. Donnez comme nom repl:
Ouvrez une console sur le serveur MySQL Maître et tapez les commandes suivantes :
# mysql –u root -pbtssio mysql> GRANT REPLICATION SLAVE on *.* to ’repl’@’%’ identified by ’btssio’;
Modifiez le fichier de configuration /etc/mysql/my.cnf du serveur MySQL Maître pour ajouter la section [mysqld] :
bind-address = 0.0.0.0 server-id = 1 log-bin = /var/log/mysql/mysql-bin.log
Commentaires :
Redémarrez le serveur MySQL Maître:
# service mysql restart
Vérification qu’il y ait bien un log binaire :
# mysql –u root -pbtssio mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 28275 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
Il y a bien un log binaire appelé ici mysql-bin.000001.
Configurer le serveur MySQL Esclave pour qu’il écoute sur le réseau :
Modifiez le fichier de configuration /etc/mysql/my.cnf du serveur MySQL Esclave dans la section [mysqld] :
bind-address = 0.0.0.0 server-id = 10
Commentaires
Toute sauvegarde effectuée sur le maître doit s’accompagner d’un relevé de la position dans les journaux binaires. En effet, les esclaves qui seront configurés par la suite ont besoin de savoir où commencer à récupérer les ordres ou lignes à répliquer. Dans le cas d’une sauvegarde logique basée sur mysqldump on utilisera l’option –master-data qui relève les informations de position (MASTER_LOG_FILE et MASTER_LOG_POS) et ajoute la commande CHANGE MASTER TO adéquate dans le dump SQL.
# mysqldump -u root -p --master-data --single-transaction --all-databases > dump.sql
Le mot de passe du compte root de MySQL vous sera demandé.
Il ne reste plus qu’à restaurer ces données sur le serveur MySQL Esclave (et tous les autres esclaves éventuels) :
# mysql -u root -pbtssio < dump.sql
Il reste à positionner les variables MASTER_HOST, MASTER_USER et MASTER_PASSWORD :
Sur le serveur MySQL Esclave, ouvrez une session console et tapez les commandes suivantes :
# mysql –u root -pbtssio mysql> CHANGE MASTER TO MASTER_HOST=’192.168.1.27’, MASTER_USER=’repl’, MASTER_PASSWORD=’btssio’;
Redémarrez le serveur MySQL esclave :
# /etc/init.d/mysql restart
Si nécessaire lancez le serveur MySQL Esclave :
# mysql –u root -pbtssio mysql> START SLAVE;
Avec Phpmyadmin, vous pouvez voir qu’une colonne Réplication qui montre que la réplication est active pour toutes les tables :
Pour vérifier que la synchronisation fonctionne : Normalement, s’il n'y a pas de problème de configuration, les 2 serveurs ont redémarré sans erreurs. Pour vérifier que la réplication s'effectue correctement, lancez la commande suivante sur l'esclave :
# mysql –u root -pbtssio mysql> SHOW SLAVE STATUS;
Il y a 2 informations à vérifier :
Seconds_behind_master : Celle-ci doit être à 0. Si elle indique Null, dans ce cas, la réplication ne fonctionne pas. Vérifiez alors l’information Last_IO_Error. Cette vérification n’est pas facile à faire. Par contre vous pouvez vous assurer qu’il n’y a pas de message d’erreur renvoyé.
L'une des causes fréquentes d'erreur au début est un problème de mot de passe pour l'utilisa-teur de réplication.
À présent, les modifications effectuée sur le serveur MySQL Maître se retrouveront répliquées sur le serveur MySQL Esclave.
Vous pouvez aussi directement lancez une commande INSERT, UPDATE ou DELETE sur le serveur maître et vérifiez que les données apparaissent bien sur l'esclave.
Si la réplication ne fonctionne pas ou ne fonctionne plus, vous pouvez essayer la démarche suivante :
# mysqldump -u root -pbtssio --master-data --single-transaction --all-databases > dump.sql
# mysql –u root -pbtssio mysql> STOP SLAVE; quit
# mysql -u root -pbtssio < dump.sql
# mysql –u root -pbtssio mysql> START SLAVE;