Avr 18 2007
Réplication Mysql pour la haute disponibilité
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.
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.