Mar.17

Réplication circulaire avec MySQL

Récemment, il m’a été demandé de développer une application de gestion de stocks, pour une entreprise de construction, basée sur MySQL, pour la base de données. Évidemment, qui dit entreprise, dit logiciel qui fonctionne 24h/24, 7j/7, éviter la perte de données… Ceci m’a amené à m’intéresser à la fonction de réplication de MySQL…

J’ai donc cherché un peu de documentation, quelques tutos, mais rien ne fonctionnait. J’ai donc décidé de prendre le taureau par les cornes, en me référant à la documentation de MySQL.

Dans cet exemple, nous allons configurer 2 serveurs pour faire de la réplication circulaire: server01 (192.168.0.95) et server02 (192.168.0.96):

  1. Préparer le système:
    Pour se reconnaître entre-eux, les serveurs MySQL ont besoin d’avoir des server-id différents et d’échanger leurs logs binaires. Ouvrez donc le fichier my.cnf et ajoutez-y les lignes suivantes dans la section [mysqld]:
    [mysqld]
    log-bin
    server-id=1 #sur server01
    server-id=2 #sur server02
  2. Créer les utilisateurs:
    Pour pouvoir assurer la réplication, chaque machine doit avoir accès à l’autre. Nous allons donc lui créer un utilisateur, repl12, qui répliquera les données de server01 vers server02. Les deux utilisateurs auront besoin de la permission « REPLICATION SLAVE ».
    Sur server01, faire:
    GRANT REPLICATION SLAVE ON *.* TO repl21@'%' IDENTIFIED BY 'password21';
    Sur server02, faire:
    GRANT REPLICATION SLAVE ON *.* TO repl12@'%' IDENTIFIED BY 'password12';
  3. Configurer la réplication
    On commence par récupérer les informations de logs actuelles:
    sur server01, faire:
    SHOW MASTER STATUS;
    sur server02, faire:
    SHOW MASTER STATUS;

    Ensuite, reste à configurer les esclaves:
    sur server01, faire:

    CHANGE MASTER TO
    MASTER_HOST='server02',
    MASTER_USER='repl21', MASTER_PASSWORD='password21', MASTER_LOG_FILE='log_file>', MASTER_LOG_POS=log_offset;

    log_file et log_offset sont obtenus à partir du « SHOW MASTER STATUS » de server02.

    sur server02, faire:

    CHANGE MASTER TO
    MASTER_HOST='server01',
    MASTER_USER='repl12', MASTER_PASSWORD='password12', MASTER_LOG_FILE='log_file>', MASTER_LOG_POS=log_offset;

    Où log_file et log_offset sont obtenus à partir du « SHOW MASTER STATUS » de server01.

    Note: Si un slave a déjà été lancé, vous aurez à lancer la commande « STOP SLAVE » pour pouvoir effectuer ces modifications.

  4. Lancer, et admirer ! Enfin, lancez la commande suivante sur les deux machines et la réplication de données débutera :
    START SLAVE;
  5. Gérer les conflits sur les AUTO_INCREMENT (optionnel)
    Si, comme moi, vous avez dans votre base de données des AUTO_INCREMENT, des conflits risquent d’apparaître si deux insertions sont effectuées en même temps sur des serveurs différents. Pour résoudre ce problème, de nombreuses solutions existent, mais j’ai choisis la plus simple (et je pense, la plus fiable): modifier le pas d’incrément. J’ai donc ajouté 2 lignes au fichier my.cnf (toujours dans mysqld):
    auto_increment_increment= 2
    auto_increment_offset   = x

    x étant le server-id. De cette façon, on est sûr d’éviter les conflits d’auto-incrément puisque server01 incrémentera en impair alors que server02 incrémentera en pair !

Voilà, c’est terminé, bon courage !

Note: quelque-soit le nombre de serveurs, la marche à suivre reste la même. Dans le cas d’une configuration à trois machines, la 01 répliquerait la 02, qui répliquerait elle-même la 03, qui répliquerait la 01 (d’où la notion de réplication circulaire).

Cependant, en cas de défaillance d’un des nœuds, le système n’assure plus la réplication. Il faut donc se tourner vers d’autres solutions comme le FailOver ou changer de conception, et passer sur du MySQL Cluster, par exemple.

Voir mon article sur la redondance avec HeartBeat pour plus d’infos sur la haute-disponibilité du système.

Tech&Dev

Leave a comment

Comment