La réplication MySQL est relativement simple à mettre en uvre.
Nous l'utilisons au quotidien sous Windows sur notre site à forte audience sur 5 serveurs (1 maître et 4 esclaves) depuis 2 ans sans problème majeur.
On supposera que vous disposez de 2 instances de MySQL fonctionnelles et fraichement installées (au moins pour l'esclave).
Cette méthode a été testée avec les versions Windows de MySQL 4.1 et MySQL 5.1.
::TOC::
Configuration du maître
Activation de la réplication
Dans le fichier my.ini, ajoutez les lignes suivantes :
server-id = 1 log-bin
Il faudra définir un server-id différent pour chaque serveur entrant dans la réplication (maître ou esclave).
La 2eme ligne permet d'activer le log binaire qui sera lu par les esclaves pour assurer les mises à jour de leur base.
Si vous souhaitez exclure certaines bases de la réplication, il suffit d'ajouter une ou plusieurs fois la directive binlog-ignore-db.
ex :
binlog-ignore-db = db1 binlog-ignore-db = db2
Création de l'utilisateur de réplication
Cet utilisateur sera celui que les threads de réplication utiliseront pour se connecter au maître. Il doit avoir les droits "REPLICATION SLAVE" .
Vous pouvez le créer via phpMyAdmin ou en ligne de commande :
CREATE USER 'replication'@'%' IDENTIFIED BY 'votrepass'; GRANT REPLICATION SLAVE ON * . * TO 'replication'@'%' IDENTIFIED BY 'votrepass';
Votre serveur maître est prêt mais ne le redémarrez pas encore.
Configuration de l'esclave
Ajoutez au fichier my.ini les directives suivantes :
server-id = 2 master-host = <ip du serveur maître> master-port = <port du serveur maître> master-user = replication master-password = votrepass
Le server-id doit être unique dans le groupe de réplication.
Les valeurs de master-user et master-password correspondent à celles de l'utilisateur créé précédemment.
Synchronisation initiale des bases de données
La méthode la plus simple pour synchroniser les bases entre le maître et le(s) esclave(s) consistent à recopier manuellement le contenu du dossier data (y compris la base mysql) :
- Arrêtez les 2 serveurs maître et esclave.
- Supprimez (ou mettez de côté) le contenu du dossier data de l'esclave.
- Recopiez le contenu du maître sur l'eclave.
- Relancer l'esclave.
- Relancer le maître.
Vérification de la synchronisation
Vérifier que la synchronisation fonctionne
Normalement, si il n'y a pas de problème de configuration, les 2 serveurs ont redémarrés sans erreurs.
Pour vérifier que la réplication s'effectue correctement, lancez la commande suivante sur l'esclave :
SHOW SLAVE STATUS;
Il y a 2 lignes à 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 la ligne Last_IO_Error.
Vérifiez également sur le serveur esclave le fichier <nomduserveur>.err.
L'une des causes fréquentes d'erreur au début est un problème de mot de passe pour l'utilisateur de réplication.
Vérifier que les données se répliquent bien
Sur le maître, lancez une commande INSERT ou UPDATE et vérifiez que les données apparaissent bien sur l'esclave.
En cas de blocage de réplication
Si une commande SHOW SLAVE STATUS montre un Seconds_Behind_Master sur Null, allez sur l'esclave en question :
1. Vérifier dans le fichier datas\<serveur>.err où se situe l'erreur.
2. Si l'erreur n'est pas trop bloquante (pas de création de nouvel ID qui pourrait entraîner un décalage entre le maître et les esclaves, par exemple), lancez les commandes suivantes dans le client MySQL sur le serveur esclave :
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; (où n est le nombre de requêtes à sauter (1 en général)) START SLAVE;
3. Vérifiez avec SHOW SLAVE STATUS;
Il faut parfois lancer plusieurs fois la commande SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; pour que ça marche (en mettant 2 si 1 ne fonctionne pas).
Nettoyer les fichiers de log obsolètes
vous pouvez supprimer régulièrement les fichiers binaires de logs sur le serveur maître, à condition d'être sûr qu'ils ont bien été traités par les esclaves.
la réplication se faisant quasiment en temps réel, en général, seul le dernier est encore utile.
Toutefois, pour plus de sécurité, je conserve 3 jours d'historique.
Voici un script à enregistrer dans un .vbs et à planifier quotidiennement pour supprimer les logs obsolètes :
' Liste des dossiers à purger tCheminsLogs = Array("E:\MySQL\Datas") 'Indiquez la Fréquence du recyclage (nb de jours de conservation) : frequence = 3 On Error Resume Next Err.Clear Set oFSO = CreateObject("Scripting.FileSystemObject") For i = 0 To Ubound(tCheminsLogs) ShowAllFiles oFSO.GetFolder(tCheminsLogs(i)) Next Sub ShowAllFiles(oFolder) Dim oSubFolder, oFile, strRech strRech = "MySQL-A-bin.0" For Each oFile In oFolder.Files If oFile.DateCreated < ((Now) - frequence + 1) Then Set F2 = oFSO.GetFile(oFile.Path) F2.Delete End If Next End Sub
Pour plus d'informations
http://dev.mysql.com/doc/refman/5.1/en/replication-howto.html
Commentaires