Réplication MySQL

Classé dans : Bases de données | 4 commentaires

jeudi 04 février 2010

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

Le 20 mai 2010 cadet a dit :

Bonjour,
merci pour ce tutoriel qui m'a bien aidé.

Je suggère de préciser dans la rubrique
Création de l'utilisateur de réplication
qu'il faut lancer l'ordre create user sur la base mysql. (use mysql).

enfin, dans le script de suppression des Logs, apparait me semble-t-il un ; de trop en début de ligne 20 et un END IF en trop dans la boucle For debutée en ligne 19.

Je vais maintenant parcourir votre site avec interêt.

Cordialement.

Le 17 juin 2010 fred a dit :

@cadet :
Bien vu pour le script ! ;-)

Par contre, pour la création de l'utilisateur, la commande CREATe ne nécessite pas forcément de se trouver sur la base mysql.

C'est en revanche le cas si l'on utilise une insertion en dur du type INSERT INTO user ...

Le 12 juillet 2010 Yoann a dit :

Attention tout de même aux (binlog-ignore-db = db1
binlog-ignore-db = db2) qui ne se comportent pas comme on pourrait le croire

http://www.mysqlperformanceblog.com/2009/05/14/why-mysqls-binlog-do-db-option-is-dangerous/

Cdt,

Le 15 septembre 2011 -yom- a dit :

Bonjour, très intéressant votre site, de passage je vous laisse un petit commentaire car je suis moi aussi grand utilisateur de la réplication mysql !

Concernant la purge des logs binaires, je préfère utiliser la fonction mysql dédiée.
Faites comme suit :
mysql&gt; SHOW MASTER LOGS;
(vous liste les logs binaires existants)
mysql&gt; PURGE MASTER LOGS TO 'master-bin.0000xx';
(à scripter pour ne conserver que xx logs, vous pourrez ensuite vérifier que l'opération s'est bien déroulée en appelant à nouveau :)
mysql&gt; SHOW MASTER LOGS;

Fil RSS des commentaires de cet article