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




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 :
log-bin
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:
Cette page a été vue 4848 fois