1 - PRÉAMBULE
Lors d'une réunion, on m'a demandé comment mettre en place sur Mysql une réplication Maître/Maître entre 2 serveurs.
Je vous livre ici la version ligne de commande.
Pour la version phpmyadmin, c'est ici : Réplication Master/Master Phpmyadmin
J'ai besoin pour cela de 2 serveurs Mysql hébergés sur des machines virtuelles Centos 6.4.
Soit l'installation se fait en double en suivant cet article : Virtualisation 05 - Installation Centos 6.4
Soit vous avez comme moi une VM de référence et vous la clonée suivant cet article : Clonage de VM Centos
Sur les 2 VMs vous installez phpmyadmin comme ici : Installation phpmyadmin sur Centos
2 - ETAT DES LIEUX
2.1 - SERVEUR 1
- nom = Centos_Mysql_Master1Slave2
- ip = 192.168.0.151
2.2 - SERVEUR 2
- nom = Centos_Mysql_Master2Slave1
- ip = 192.168.0.152
3 - Création réplication Master1-Slave1
3.1 - Travail sur le Maître1
Se connecter au serveur :
mysql -u root -p
et saisir le mot de passe.
Créer un base avec la commande suivante :
CREATE DATABASE testreplication;
Lister les bases avec la commande : SHOW DATABASES;
Le fichier /etc/my.cnf contient :
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used (fedora >= 15). # If you need to run mysqld under a different user or group, # customize your systemd unit file for mysqld according to the # instructions in http://fedoraproject.org/wiki/Systemd user=mysql # Semisynchronous Replication # http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html # uncomment next line on MASTER ;plugin-load=rpl_semi_sync_master=semisync_master.so # uncomment next line on SLAVE ;plugin-load=rpl_semi_sync_slave=semisync_slave.so # Others options for Semisynchronous Replication ;rpl_semi_sync_master_enabled=1 ;rpl_semi_sync_master_timeout=10 ;rpl_semi_sync_slave_enabled=1 # http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html ;performance_schema [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
Nous allons rajouté ces lignes :
log-bin binlog-do-db=testreplication # input the database which should be replicated binlog-ignore-db=mysql # input the database that should be ignored for replication binlog-ignore-db=test server-id=1
Pour obtenir au final
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used (fedora >= 15). # If you need to run mysqld under a different user or group, # customize your systemd unit file for mysqld according to the # instructions in http://fedoraproject.org/wiki/Systemd user=mysql # Semisynchronous Replication # http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html # uncomment next line on MASTER ;plugin-load=rpl_semi_sync_master=semisync_master.so # uncomment next line on SLAVE ;plugin-load=rpl_semi_sync_slave=semisync_slave.so # Others options for Semisynchronous Replication ;rpl_semi_sync_master_enabled=1 ;rpl_semi_sync_master_timeout=10 ;rpl_semi_sync_slave_enabled=1 # http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html ;performance_schema log-bin binlog-do-db=testreplication # input the database which should be replicated binlog-ignore-db=mysql # input the database that should be ignored for replication binlog-ignore-db=test server-id=1 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
Nous devons ajouter un utilisateur pour la réplication.
grant replication slave on *.* toCette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. identified by 'slave';
Relancer le serveur mysql par la commande : service mysqld restart.
Se connecter au serveur mysql et taper les commandes suivantes :
- FLUSH TABLES WITH READ LOCK;
- SHOW MASTER STATUS;
Les informations importantes sont :
- File
- Position
Puis libérer les tables par UNLOCK TABLES;
Faire une sauvegarde de la base par la commande :
mysqldump -u root -p --create-options --master-data -B testreplication> /tmp/testreplication.SQL
Transférer le fichier sur le serveur Slave 1.
3.2 - Travail sur l'esclave (Slave1)
Dans un premier temps, se connecter au serveur Mysql et stopper le serveur Slave:
STOP SLAVE;
Se déconnecter et insérer la sauvegarde du serveur Maître 1:
mysql -u root -p < /tmp/testreplication.SQL
Se connecter sur le serveur Mysql et lister les databases:
Il faut modifier le fichier /etc/my.cnf qui contient :
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used (fedora >= 15). # If you need to run mysqld under a different user or group, # customize your systemd unit file for mysqld according to the # instructions in http://fedoraproject.org/wiki/Systemd user=mysql # Semisynchronous Replication # http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html # uncomment next line on MASTER ;plugin-load=rpl_semi_sync_master=semisync_master.so # uncomment next line on SLAVE ;plugin-load=rpl_semi_sync_slave=semisync_slave.so # Others options for Semisynchronous Replication ;rpl_semi_sync_master_enabled=1 ;rpl_semi_sync_master_timeout=10 ;rpl_semi_sync_slave_enabled=1 # http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html ;performance_schema [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
nous rajoutons les lignes :
server-id=2
Pour obtenir ceci :
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used (fedora >= 15). # If you need to run mysqld under a different user or group, # customize your systemd unit file for mysqld according to the # instructions in http://fedoraproject.org/wiki/Systemd user=mysql # Semisynchronous Replication # http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html # uncomment next line on MASTER ;plugin-load=rpl_semi_sync_master=semisync_master.so # uncomment next line on SLAVE ;plugin-load=rpl_semi_sync_slave=semisync_slave.so # Others options for Semisynchronous Replication ;rpl_semi_sync_master_enabled=1 ;rpl_semi_sync_master_timeout=10 ;rpl_semi_sync_slave_enabled=1 # http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html ;performance_schema server-id=2 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
Relancer le serveur mysql par la commande : service mysqld restart.
Se connecter au serveur Mysql et arrêter les threads esclaves par la commande :
STOP SLAVE;
Taper la commande :
CHANGE MASTER TO MASTER_HOST='192.168.0.151', MASTER_USER='replication', MASTER_PASSWORD='slave', MASTER_LOG_FILE='mysqld-bin.000004', MASTER_LOG_POS=107;
Les valeurs MASTER_LOG_FILE et MASTER_LOG_POS correspondent aux valeurs relevées sur le serveur maître avec la commande SHOW MASTER STATUS;
Relancer la réplication par :
START SLAVE;
4 - Test de la réplication
Sur le serveur Mysql Maître 1, taper :
USE testreplication;
puis :
CREATE TABLE contacts (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,data VARCHAR(100));
Vous pouvez voir que la table est bien crée en tapant :
texte
Voici ce que cela donne:
Se connecter sur le serveur Mysql Slave 1 et lister les tables:
La réplication fonctionne bien.
5 - Réplication Master 2/Slave 2
Pour mettre en place la réplication retour, il faut procéder a peu près de la même manière.
Sur le serveur Mysql du Master 2, nous devons ajouter :
log-bin binlog-do-db=testreplication # input the database which should be replicated binlog-ignore-db=mysql # input the database that should be ignored for replication binlog-ignore-db=test
au fichier /etc/my.cnf, afin d'obtenir:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock server-id=2 log-bin binlog-do-db=testreplication # input the database which should be replicated binlog-ignore-db=mysql # input the database that should be ignored for replication binlog-ignore-db=test # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used (fedora >= 15). # If you need to run mysqld under a different user or group, # customize your systemd unit file for mysqld according to the # instructions in http://fedoraproject.org/wiki/Systemd user=mysql # Semisynchronous Replication # http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html # uncomment next line on MASTER ;plugin-load=rpl_semi_sync_master=semisync_master.so # uncomment next line on SLAVE ;plugin-load=rpl_semi_sync_slave=semisync_slave.so # Others options for Semisynchronous Replication ;rpl_semi_sync_master_enabled=1 ;rpl_semi_sync_master_timeout=10 ;rpl_semi_sync_slave_enabled=1 # http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html ;performance_schema [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
Nous devons ajouter un utilisateur pour la réplication.
grant replication slave on *.* toCette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. identified by 'slave';
Relancer le serveur mysql Maître 2 par la commande : service mysqld restart.
Sur le serveur Mysql du serveur Slave2, taper la commande :
CHANGE MASTER TO MASTER_HOST='192.168.0.152', MASTER_USER='replication', MASTER_PASSWORD='slave';
Relancer le serveur mysql Esclave 2 par la commande : service mysqld restart.
6 - Conclusion
Vous avez maintenant une réplication Master/Master opérationnelle.