Serveurs Base de données

MySQL : Répliquer en mode actif/actif une base de données MySQL

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

replication_bdd







Introduction





Pour des raisons de haute disponibilité, il peut être utile de mettre en place une réplication de bases de données.

Cet article montre et décrit comment mettre en place cela.



Ces manipulations ont été réalisées avec MySQL 5.5.40

La distribution de support est Calculate Linux Server Scratch






Les serveurs





Pour la suite de cet article, voici ma configuration :



Cluster1 : 10.21.27.11

Cluster2 : 10.21.27.12




Moteur de base de données : MySQL 5.5







La mise en oeuvre







Sur le cluster1 :





On se connecte

Code BASH :
mysql -u root -p




On créé la base :

Code SQL :
CREATE DATABASE base;




On vérifie que la base est bien créé :

Code SQL :
SHOW DATABASES;




On rajoute dans le fichier /etc/mysql/my.cnf section [mysqld] :



Code BASH :
log-bin
server-id=1
binlog-do-db=base                 # Base à répliquer
binlog-ignore-db=mysql            # Base à ne pas répliquer






S'assurer que mysql n'écoute pas que sur le réseau concerné :

bind-address=0.0.0.0




On créé un utilisateur de réplication (IP du cluster2):

Code SQL :
GRANT REPLICATION SLAVE ON *.* TO 'replication'@10.21.27.12 IDENTIFIED BY 'slave';




On relance mysql

Code BASH :
/etc/init.d/mysql restart




On se reconnecte et taper les commandes :



Code SQL :
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
 
+-------------------+----------+-----------------+------------------+
| File              | POSITION | Binlog_Do_DB    | Binlog_Ignore_DB |
+-------------------+----------+-----------------+------------------+
| mysqld-bin.000011 |      107 | base            | mysql            |
+-------------------+----------+-----------------+------------------+
1 ROW IN SET (0.00 sec)




Les informations importantes sont : File et Position



Puis libérer les tables par

Code SQL :
UNLOCK TABLES;




Sauvegarder la base à répliquer :

Code BASH :
mysqldump -u root -p --create-options --master-data -B base > /root/base.sql




Transférer le fichier sur le cluster2.

Code BASH :
scp /root/base.sql 10.21.27.12:/root/








Sur le cluster2





Se connecter à MySQL puis

Code SQL :
STOP SLAVE;




On restaure la base:

Code BASH :
 mysql -u  root -p  < /root/base.sql




Et on vérifie la présence de la base :

Code SQL :
 SHOW DATABASES;




On édite le fichier /etc/mysql/my.cnf et on ajoute dans la rubrique [mysqld] :

Code BASH :
server-id=2
binlog-do-db=base      # Base à répliquer
binlog-ignore-db=mysql            # Base à ne pas répliquer




S'assurer que mysql n'écoute pas que sur le réseau concerné :

bind-address=0.0.0.0




On redémarre mysql

Code BASH :
/etc/init.d/mysql restart




Se connecter au serveur Mysql puis :

Code SQL :
  STOP SLAVE;




Puis :

Code SQL :
CHANGE MASTER TO MASTER_HOST='10.21.27.11', MASTER_USER='replication', MASTER_PASSWORD='slave', MASTER_LOG_FILE='mysqld-bin.000011', MASTER_LOG_POS=107;




Les valeurs MASTER_LOG_FILE et MASTER_LOG_POS correspondent aux valeurs relevées tout à l'heure avec la commande SHOW MASTER STATUS;



Relancer par :

Code SQL :
START SLAVE;




On ajoute un utilisateur pour la réplication :

Code SQL :
GRANT REPLICATION SLAVE ON *.* TO 'replication'@10.21.27.11 IDENTIFIED BY 'slave';






Sur le cluster1





Les commandes à saisir dans MySQL parlent d'elle même :

Code SQL :
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.21.27.12', MASTER_USER='replication', MASTER_PASSWORD='slave';
START SLAVE;










On teste :







Sur le cluster1 :





On créé une table



Code SQL :
USE base;
 
CREATE TABLE matable(
    texte VARCHAR(256)
);




Vérifier que la table est créée:

Code SQL :
SHOW TABLES;




Insérer une ligne :

Code SQL :
INSERT INTO matable VALUES ('Un texte');




On vérifie que le texte est rentré :

Code SQL :
SELECT * FROM matable;








On se connecte sur cluster2 :





Code SQL :
USE base;




On vérifie que la table a bien été répliquée :

Code SQL :
SHOW TABLES;




Et que l'enregistrement saisi sur cluster1 ait bien été inséré aussi :

Code SQL :
SELECT * FROM matable;




On insère un deuxième enregistrement :

Code SQL :
INSERT INTO matable VALUES ('Un deuxieme texte');




On vérifie qu'il a été inséré :

Code SQL :
SELECT * FROM matable;






Retour sur cluster1





On vérifie que les 2 enregistrements sont là aussi:

Code SQL :
SELECT * FROM matable;






Si ça ne marche pas, vérifier le statut via :

Code SQL :
SHOW SLAVE STATUS;






:magic: