Avr 18 2007

Réplication Mysql pour la haute disponibilité

Publié par à 12:00 sous Mysql




Avec des bases de données Mysql et des tables contenant plusieurs millions d’enregistrements, les sauvegardes deviennent assez lourdes. Si un serveur tombe, cela peut entrainer plusieurs heures perdues, le temps de mettre en place un nouveau serveur, de réimporter les données depuis la backup. Nous ne parlons même pas des pertes financières potentielles due à cette période. On peut parvenir à une meilleure stabilité avec Mysql soit grâce à un cluster ou une réplication. Nous allons nous concentrer sur la réplication dans cet article. Quoiqu’il en soit, ceci est un rapide tutorial pour mettre une réplication en place; Faîtes un tour dans la documentation Mysql pour en savoir plus.

 

Réplication

 

Le master peut répliquer ses données vers plusieurs esclaves, auxquels des clients web différents peuvent envoyer leurs requêtes. Les écritures doivent toujours être envoyées au master. Si elles sont envoyées à un esclave, elles ne seraient pas répliquées sur les autres serveurs.
 
Note La réplication est asynchrone puisque l’esclave a besoin d’un petit délai pour être mis à jour. C’est particulièrement adapté pour les applications comme les datawarehouses.

 

Fail-over

La réplication ne fournit pas d’auto-failover car elle requiert une intervention manuelle. Un autre article est disponible sur l’implementation du failover avec Heartbeat. Cela donne la possibilité de basculer le trafic automatiquement vers le serveur esclave en quelques secondes.

 

Démarrage

Nous assumerons avoir un serveur seul contenant déjà les informations précieuses, et où l’on veut implémenter un système de redondance. Procédez de la manière suivante pour que votre serveur soit prêt à la réplication:

  • Activatez le log binaire sur le serveur maître. C’est absolument nécessaire, l’esclave doit lire ces fichiers binaires pour se synchroniser. my.cnf contient log-bin=mysql-bin dans la section [mysqld] dans mon cas
  • Ajoutez server-id=1 dans my.cnf.
    Cet id doit être unique pour chaque serveur (L’esclave sera 2). Redémarrez le service si ces options n’étaient pas activées.
  • Créez un compte pour l’esclave sur le master pour qu’il soit autorisé à répliquer:
    GRANT REPLICATION SLAVE ON *.*
    TO 'slave'@'192.168.0.3' IDENTIFIED BY 'mypassword';

    où ‘slave’ est le nom d’utilisateur avec lequel le serveur esclave va se connecter, 192.168.0.3 l’adresse IP de l’esclave.

  • Mettez en place une nouvelle machine pour le serveur esclave et installez Mysql. my.cnf doit contenir ceci:
    [mysqld]
    server-id=2
    . Ne démarrez pas le service maintenant!

 

Transfert des données vers l’esclave

  • Bloquez tout d’abord les opérations d’écriture sur le master et enregistrez les dernières valeurs depuis le log binaire:
    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SHOW MASTER STATUS;

    Vous devriez obtenir quelque chose de similaire à ceci:

    +-------------------+----------+--------------+------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +-------------------+----------+--------------+------------------+
    | my-db1-bin.000002 |      239 |              |                  |
    +-------------------+----------+--------------+------------------+

    Soyez sûrs d’enregistrer ces valeurs, elles seront nécessaires pour la suite.

  • Arrétez le processus Mysql sur le maître et faîtes une copie du répertoire de données avec tar par exemple. Après avoir exécuté tar, redémarrez le service. C’est la seule fois que le master sera arrété.
  • Copiez le fichier tar sur l’esclave dans le répertoire temp par exemple, décompressez le et copiez les fichiers vers le répertoire de données. Ne copiez pas les fichiers de log.
    Vérifiez que les droits sont corrects (Ils doivent être identiques aux fichiers originaux). Vous avez maintenant les données du master sur l’esclave.

 

Activation de la réplication sur l’esclave

Démarrez l’esclave avec l’option suivante:
–skip-slave-start
 
Vous pouvez aussi logguer les warnings dans le log d’erreurs pour avoir une meilleure idée de ce qu’il se passe
–log-warnings
 
Maintenant que le serveur est démarré, connectez-vous dessus avec un client Mysql, et ajoutez les détails du master:

mysql> CHANGE MASTER TO
mysql> MASTER_HOST='192.168.0.2',
mysql> MASTER_USER='slave',
mysql> MASTER_PASSWORD='mypassword',
mysql> MASTER_LOG_FILE='my-db1-bin.000002',
mysql> MASTER_LOG_POS=239;

Les 2 dernières lignes contiennent bien sûr les valeurs récupérées sur le master.

mysql> START SLAVE;

La réplication peut commencer!
Le status de l’esclave peut être vérifiée via la commande suivante:

mysql> show slave status;
+-------------------+-------------+-------------+-/-+---------------+-------------------+
| Slave_IO_State    | Master_Host | Master_User |   | Connect_Retry | Master_Log_File   |
+-------------------+-------------+-------------+-/-+---------------+-------------------+
| Wait...send event | 192.168.0.2 | slave       |   |            60 | my-db1-bin.000006 |
+-------------------+-------------+-------------+-/-+---------------+-------------------+

+----------------+---------------+---------------+--------------------+-----------------+
| Rd_Mtr_Log_Pos | Relay_Log_File| Relay_Log_Pos | Relay_Mtr_Log_File | Slave_IO_Running|
+----------------+---------------+---------------+--------------------+-----------------+
|      514457737 | s...in.000007 |      26082745 | my-db1-bin.000006  | Yes             |
+----------------+---------------+---------------+--------------------+-----------------+

+-------------------+-/-+---------------------+-----------------+-/-+-------------------+
| Slave_SQL_Running |   | Exec_Master_Log_Pos | Relay_Log_Space |   | Sds_Behind_Master |
+-------------------+-/-+---------------------+-----------------+-/-+-------------------+
| Yes               |   |           514457737 |        26082745 |   |                 0 |
+-------------------+-/-+---------------------+-----------------+-/-+-------------------+

 

Si la réplication arrête de fonctionner pour quelque raison que ce soit, la dernière erreur sera affichée ici. Vous pouvez aussi les trouver dans le fichier de log d’erreurs mysql.
Désactivez l’option –skip-slave-start du script de démarrage pour que la réplication soit activée après le redémarrage du serveur.


5 responses so far

5 Réponses à “Réplication Mysql pour la haute disponibilité”

  1. Quentinon 19 Sep 2008 at 3:28

    Merci pour ce tutorial qui m’a bien aidé ! Je l’ai complété par un tutorial lu sur Developpez.com : http://jgrondin.developpez.com/article/MySQL/Replication_MySQL/.
    En effet grâce à ce second tutorial, on apprend comment mettre en place la réplication SANS arrêter le master (ce qui était important dans mon cas, avec un serveur de prod).
    En gros, il faut rajouter quelques privilèges au SLAVE (SUPER et RELAOD), et après il n’y a exécuter la commande « LOAD DATA FROM MASTER » qui rapatrie tout comme il le faut.

  2. Malickon 18 Fév 2009 at 10:21

    Bonjour,
    Merci pour ce tuto.
    Le seul souci que je rencontre est que les log binaires sont bien rapatriés au niveau du serveur slave mais ils ne sont pas pris en compte au niveau de la base.
    Effect j’ai au niveau de la base de slave les mêmes données depuis la première replication et les logs ne font que se rajouter.

    Au niveau de mon slave j’ai:
    mysql> show processlist;
    +——+————-+———–+——+———+——-+———————————-+——————+
    | Id | User | Host | db | Command | Time | State | Info |
    +——+————-+———–+——+———+——-+———————————-+——————+
    | 1261 | system user | | NULL | Connect | 17367 | Waiting for master to send event | NULL |
    | 1264 | root | localhost | NULL | Query | 0 | NULL | show processlist |
    +——+————-+———–+——+———+——-+———————————-+——————+
    2 rows in set (0.00 sec)

    et au niveau du Master:
    mysql> show processlist;
    +——+———-+——————–+——+————-+——-+—————————————————————-+——————+
    | Id | User | Host | db | Command | Time | State | Info |
    +——+———-+——————–+——+————-+——-+—————————————————————-+——————+
    | 1984 | replifin | 192.168.1.21:56458 | NULL | Binlog Dump | 18003 | Has sent all binlog to slave; waiting for binlog to be updated | NULL |
    | 2660 | root | localhost | NULL | Query | 0 | NULL | show processlist |
    +——+———-+——————–+——+————-+——-+—————————————————————-+——————+
    2 rows in set (0.00 sec)

    Où peut bien se situer le souci? Merci d’avance pour votre aide.

  3. Henryon 06 Déc 2009 at 10:50

    Merci beaucoup pour ce tutoriel ! :-)

    J\’aimerai ajouter ces 2 précisions :
    1/ pour delocker les tables sur le maitres il faut utiliser la commande :
    UNLOCK TABLES;

    2/Il semble que le \"GRANT REPLICATION SLAVE\" ne soit pas suffisant, il m\’a fallu ajouter remplacer par \"GRANT all privileges\" sinon j\’avais toujours l\’erreur suivante :

    mysql> LOAD DATA FROM MASTER;
    ERROR 1219 (HY000): Error running query on master: Access denied; you need the RELOAD privilege for this operation

    Merci encore pour ce tutoriel simple et concret !

  4. salaunon 15 Déc 2010 at 12:12

    Merci pour ce tutoriel.
    C’est bien écrit.
    Pas une usine à gaz comme certain tuto que j’ai peu lire ici ou là.
    Efficace, 20 minutes pour installer la réplication sur 2 serveurs windows.

  5. Waltokranon 06 Jan 2011 at 2:51

    Petite précision : LOAD DATA FROM MASTER ne fonctionne que si les tables sont en myisam.
    De plus, cette fonction ne doit plus être utilisée car elle sera bientôt supprimée dans leqs versions à venir de mysql (hélas, trois fois hélas).

Comments RSS

Leave a Reply