«

»

Fév 03 2016

[Tuto]: Replication Master-Slave avec MySQL sous Debian 8

Bonjour à tous,

Dans ce tuto nous allons voir comment mettre en place une replication master-slave avec MySQL sous Debian 8.

Je vais donc utiliser deux serveur

  • mysql-node1 (Master) => 192.168.2.11
  • mysql-node2 (Slave) => 192.168.2.12

Le but sera de repliquer sur mysql-node2 la base de donnée « replication »

Commençons par le début.

Installation de MySQL

Sur les deux serveurs faire:

apt-get update && apt-get dist-upgrade

apt-get install mysql-server

Durant l’installation fournissez le mot de passe pour l’utilisateur « root »de MySQL.

Configuration de mysql-node1

Connectez-vous à la console de MySQL pour créer la base de données que vous souhaitez répliquer.

root@mysql-node1:~# mysql -u root -p

CREATE DATABASE replication;
 Query OK, 1 row affected (0.00 sec)

exit
 Bye

Pour configurer la réplication, éditez le fichier /etc/mysql/my.cnf sur le serveur mysql-node1

Configurez ces entrées conne ceci:

bind-address = ip_de_votre_serveur
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = replication #Nom de la BDD a repliquer

Et redémarrez MySQL

root@mysql-node1:~# service mysql restart

Une fois MySQL redémarré tapez la commande suivante dans la console de MySQL afin de créer un utilisateur dédié à la replication

root@mysql-node1:~# mysql -u root -p

GRANT REPLICATION SLAVE ON *.* TO 'repuser'@'IP_SERVEUR_SLAVE' IDENTIFIED BY 'password';

FLUSH PRIVILEGES;

#On met la base de donnée a repliquer en lecture seule
USE replication;
FLUSH TABLES WITH READ LOCK;

HOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 340 | replication | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Notez bien la valeur de File et Position, cela va nous servir plus tard.

Faites un dump de la base de donnée

root@mysql-node1:~# mysqldump -u root -p replication > replication.sql

Une fois le dump fait on enlève le mode lecture seule.

root@mysql-node1:~# mysql -u root -p

use replication;
 Database changed
UNLOCK TABLES;
 Query OK, 0 rows affected (0.00 sec)

On envoie maintenant le fichier sur le serveur mysql-node2

root@mysql-node1:~# scp replication.sql root@mysql-node2:/root/

On se connecte maintenant sur mysql-node2

On créer sur celui-ci la base de donnée

root@mysql-node2:~# mysql -u root -p

CREATE DATABASE replication;
 Query OK, 1 row affected (0.00 sec)

exit
 Bye

On importe le dump

root@mysql-node2:~# mysql -u root -p replication < replication.sql

Comme sur le premier serveur on édite le fichier /etc/mysql/my.cnf

Configurez les valueurs suivantes: 
server-id = 2 
log_bin = /var/log/mysql/mysql-bin.log 
binlog_do_db = replication 

Et on redémarre MySQL

root@mysql-node2:~# service mysql restart 

On se connecte à la console de MySQL et on tape la commande suivante pour configurer la replication:

root@mysql-node2:~# mysql -u root -p 
#Ne copiez pas cette ligne adaptez la à votre configuration mysql 
CHANGE MASTER TO MASTER_HOST='IP_MASTER_SERVEUR',MASTER_USER='repuser', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 340;
Query OK, 0 rows affected (0.02 sec)

#Et on lance le serveur en tant que SLAVE
START SLAVE;

On regarde si la replication est bien activée

SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.11
Master_User: repuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 340
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 340
Relay_Log_Space: 410
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)

Si vous avez Slave_IO_State: Waiting for master to send event cela veut dire que tout est OK

Testons la replication:

Sur le serveur mysql-node1 nous allons créer une table dans la base de données replication:

root@mysql-node1:~# mysql -u root -p
use replication;
 Database changed

mysql> CREATE TABLE replication_table (
-> ID INT NOT NULL AUTO_INCREMENT,
-> TEST VARCHAR(100) NOT NULL,
-> PRIMARY KEY ( ID ));
Query OK, 0 rows affected (0.06 sec)

On vérifie sur mysql-node2 que la base de données a été créer

root@mysql-node2:~# mysql -u root -p
use replication;
Database changed

show tables;
+-----------------------+
| Tables_in_replication |
+-----------------------+
| replication_table |
+-----------------------+
1 row in set (0.00 sec)

Si la table est bien la tout est OK!

(2 commentaires)

  1. stif

    Bonjour,

    d’abord merci pour ce tuto qui est très complet, mais je rencontre des soucis pour le mettre en place sous freebsd, quelqu’un pour aider?

    lorsque j’insère dans le fichier my.cnf la ligne:
    log_bin=…

    Je ne peux plus rédemarrer le service mysql.

    1. stif

      J’ai finalement trouver d’ou venait l’erreur.

      J’ai cependant une question.

      Dans le cas présenté, il s’agit d’une nouvelle base. Mais est-il possible d’effectuer une réplication avec une base déjà existante?

      Un serveur utilisant la base de données, ajoutant régulièrement des nouvelles données dans la base. Est-ce que la réplication pourra se faire automatiquement sur le seconde a chaque fois qu’une nouvelle données est ajouté?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Lire les articles précédents :
terminal_icon
[Astuce] Killer rapidement un processus sous Linux avec PIDOF [MAJ]

Bonsoir a tous, Voici un petit tip sur comment killer rapidement un processus sous linux. Généralement, lorsque l'on souhaite tuer un...

Fermer