logo_sommaire

Mise à jour : 24/12/2020 à 11H23

PREREQUIS

VERSION & VALIDATION

Debian 10 (BUSTER) - Validé le 26/12/2020
MySQL version : 10.3.27

Status : Fonctionnel - correction orthographique en attente.
NIVEAU TUTORIEL :

Habitué mysql/mariadb

NIVEAU REQUIS :

Connaissances en langage SQL
Habitué de la ligne de commandes
Habitué linux CLI

SOURCES LISTES

Debian 10 (BUSTER)
RaspBian

DURÉE D'EXÉCUTION

Lammers : Déconseillé
Novices : 1h/2h
Habitués de Linux: 10/15 minutes
Habitués MySQL/MariaDB : 5/10 minutes

Présentation

Présentation de la réplication de serveurs MySQL via la ligne de commande sous Debian 10. Deux méthodes présentées : Master to Master et le Master to Slave.

Introduction

Afin d'acquérir une méthode de travail correcte, il est recommandé d'effectuer tous les tutoriels proposés par BlackHat-Out sur des serveurs de tests. Il est évident que chaque système est différent, mêmes si ces tutoriels sont mis en pratique sur plusieurs OS, nous avons rencontré différentes difficultés selon les systèmes. Toutes les manipulations proposées se feront en tant qu'administrateur et nous ne pourrons garantir ou être tenus responsables d'une quelquonque manipulation rendant le système inopérant.

Base De Données (BDD) non existante

MASTER TO MASTER

Ici sera expliquer comment "synchroniser" deux serveurs MySQL ensemble. De manière à ce que dès que le serveur A ou B dispose d'une mise à jour, celle-ci est répliquée sur le second serveur. Dans cette partie du tutoriel, les deux serveurs sont vierges. Par conséquent, aucune base de données n'est encore existante.

Dans la méthode utilisée ici, on va passer les 2 serveurs en mode Maître/Esclave.


==> SUR SERVEUR MAITRE 1

						 $su
						 #nano /etc/mysql/my.cnf
						 ajouter les lignes suivantes:
						 [...]
						 [mysqld]
						 bind-address = [@IP de l'interface d'écoute]
						 server-id = 1
						 log_bin = /var/log/mysql/mysql-bin.log
						 binlog_do_db = [nom_bdd_a_repliquer]
						 [...]
						 ctrl+o ctrl+x
						#service mysql restart
						#mysql -u root -p
						>CREATE DATABASE [nom_bdd_a_repliquer]
						>CREATE USER '[user_replication1]'@'localhost' IDENTIFIED BY '[PASSWORD]'; 
						>GRANT ALL PRIVILEGES on [nom_bdd_a_repliquer.*] to '[user_replication1]'@'localhost';
						>GRANT REPLICATION SLAVE ON *.* TO '[user_replication2]'@'IP_MASTER_2' IDENTIFIED BY '[PASSWORD]';
						>FLUSH PRIVILEGES;
						>SHOW MASTER STATUS;
						+------------------+----------+--------------+------------------+
						| File 	     | Position | Binlog_Do_DB | Binlog_Ignore_DB |
						+------------------+----------+--------------+------------------+
						| mysql-bin.000001 | 340 	| nom_bdd      |		  |
						+------------------+----------+--------------+------------------+
						1 row in set (0.00 sec)
					

Explications des commandes

bind-address

La ligne bind-adress = est l'argument qui permet au serveur MySQL d'écouter sur une interface réseau spécifique. Si elle est commentée, le serveur écoutera sur toutes les interfaces. Par défaut, le serveur n'écoute que sur son interface 127.0.0.1 (=localhost)

NB : Il est possible que cette ligne soit aussi présente dans le fichier /etc/mysql/mariadb.conf.d/50-server.cnf

serveur id

La ligne server id =, permet de définir un identifiant pour reconnaître vos différents serveur.

log_bin

Permet d'indiquer où se situe le fichier de log du serveur.

binlog_do_db

Permet d'indiquer quelle base de données on veut répliquer.

service mysql restart

Permet de redémarrer l'application mysql.

CREATE DATABASE/USER

- La commande CREATE est ce qui permet, lorsqu'elle est suivi d'un argument du type USER/DATABASE, de créer un ou plusieurs élements - qui d'ailleurs se nomme "objet" en base de données (à vérifier).
- L'ensemble CREATE USER '[userdb]'@'localhost' IDENTIFIED BY '[PASSWORD]'; permet, dans l'ordre, de "créer l'utilisateur [nom_utilisateur_voulut] à l'emplacement [localhost]". Tous les élements entre crochets dans le terminal sont des élements arbitraires que vous pouvez définir à votre guise.

GRANT ALL PRIVILEGES

Cette commande permet de donnée tous les prévilèges sur la base [nom_bdd_a_repliquer.*] pour l'utilisateur [user_replication1] stocké en localhost.

GRANT REPLICATION SLAVE ON

Donne tous les droits pour la réplication sur le serveur escalve à l'utilisateur [user_replication2] stocké sur IP_MASTER2 identifié par le mot de passe [PASSWORD].

FLUSH PRIVILEGES

Permet de rafraichir les droits.

SHOW MASTER STATUS

Montre le fichier qui devra être indiqué sur le serveur de réplication ainsi que la position concernant la base de donnée voulu.


==> SUR SERVEUR MAITRE 2

						 $su
						 #nano etc/mysql/my.cnf
						 ajouter les lignes suivantes:
						 [...]
						 [mysqld]
						 bind-address = [@IP de l'interface d'écoute]
						 server-id = 2
						 log_bin = /var/log/mysql/mysql-bin.log
						 binlog_do_db = [nom_bdd_a_repliquer]
						 [...]
						 ctrl+o ctrl+x
						service mysql restart
						#mysql -u root -p
						>CREATE DATABASE [nom_bdd_a_repliquer];
						>CREATE USER '[user_replication2]'@'localhost' IDENTIFIED BY '[PASSWORD]'; 
						>GRANT ALL PRIVILEGES on [nom_bdd_a_repliquer.*] to '[user_replication2]'@'localhost';
						>GRANT REPLICATION SLAVE ON *.* TO '[user_replication1]'@'IP_MASTER_1' IDENTIFIED BY '[PASSWORD]';
						>FLUSH PRIVILEGES;
						>SHOW MASTER STATUS;
						+------------------+----------+--------------+------------------+
						| File 	     | Position | Binlog_Do_DB | Binlog_Ignore_DB |
						+------------------+----------+--------------+------------------+
						| mysql-bin.000004 | 344 	| nextcloud    |		  |
						+------------------+----------+--------------+------------------+
						1 row in set (0.00 sec)
						>
						>CHANGE MASTER TO MASTER_HOST='IP_MASTER_1',MASTER_USER='[user_replication2]', MASTER_PASSWORD='[PASSWORD]', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 340;  
						>START SLAVE;
						>SHOW SLAVE STATUS\G
						> c'est mort je code pas le résultat de cette commande. x_x Si vous avez l'erreur 111 commentez la ligne bind_address
					

CHANGE MASTER TO

La commande permet d'indiqué au serveur escalve qui est le serveur maître, en lui spécifiant l'identifiant et le mot qui doit utiliser pour y accéder ainsi que le fichier de log et la position.


SHOW SLAVE STATUS

Permet d'afficher l'état de la connexion entre le serveur esclave et maître.


==> SUR SERVEUR MAITRE 1

							>CHANGE MASTER TO MASTER_HOST='IP_MASTER_2',MASTER_USER='[user_replication1]', MASTER_PASSWORD='[PASSWORD]', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS= 344;  
							>START SLAVE;
							>SHOW SLAVE STATUS\G
							> Si vous avez une erreur connection refused, vous avez mal configuré les utilisateurs. Si autres.. go google.
						

==> TEST

Effectuer la création de la table sur l'un des deux serveurs, elle devrait être repliquée sur le second

							 >USE [nom_bdd_a_repliquer];
							 >CREATE TABLE test_repli
							 >(
							 >nom VARCHAR(100)
							 >);
							 Query OK, 0 rows affected (0.01 sec)
							 ## Sur le second serveur ## 
							 >USE [nom_bdd_a_repliquer];
							 >SHOW TABLES;
							## Si tout OK la table devrait apparaît automatiquement
							## Si problème se référer à la commande "SHOW SLAVE STATUS\G" ## 
						

MASTER TO SLAVE


==> SUR SERVEUR MASTER

						 $su
						 #nano etc/mysql/my.cnf
						 ajouter les lignes suivantes:
						 [...]
						 [mysqld]
						 bind-address = [@IP de l'interface d'écoute]
						 server-id = 1
						 log_bin = /var/log/mysql/mysql-bin.log
						 binlog_do_db = [nom_bdd_a_repliquer]
						 [...]
						 ctrl+o ctrl+x
						#service mysql restart
						#mysql -u root -p
						>CREATE DATABASE [nom_bdd_a_repliquer]
						>GRANT REPLICATION SLAVE ON *.* TO '[user_replication]'@'IP_SLAVE' IDENTIFIED BY '[PASSWORD]';
						>FLUSH PRIVILEGES;
						>SHOW MASTER STATUS;
						+------------------+----------+--------------+------------------+
						| File 	     | Position | Binlog_Do_DB | Binlog_Ignore_DB |
						+------------------+----------+--------------+------------------+
						| mysql-bin.000001 | 340 	| nextcloud    |		  |
						+------------------+----------+--------------+------------------+
						1 row in set (0.00 sec)
					

==> SUR SERVEUR SLAVE

						 $su
						 #nano etc/mysql/my.cnf
						 ajouter les lignes suivantes:
						 [...]
						 [mysqld]
						 bind-address = [@IP de l'interface d'écoute]
						 server-id = 2
						 log_bin = /var/log/mysql/mysql-bin.log
						 binlog_do_db = [nom_bdd_a_repliquer]
						 [...]
						 ctrl+o ctrl+x
						#service mysql restart
						#mysql -u root -p
						>CREATE DATABASE [nom_bdd_a_repliquer]
						CREATE USER '[user_replication]'@'localhost' IDENTIFIED BY '[PASSWORD]';
						GRANT ALL PRIVILEGES on [bdd_cible.*] to '[user_replication]'@'localhost';
						>FLUSH PRIVILEGES;
						>CHANGE MASTER TO MASTER_HOST='IP_MASTER',MASTER_USER='[user_replication]', MASTER_PASSWORD='[PASSWORD]', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 340;  
						>SHOW SLAVE STATUS\G
					

BDD Existante

Dans le cas, où le serveur maître dispose déjà d'une base de données configurée, il sera nécessaire d'effectuer un dump de celle-ci et de l'exporter vers le serveur esclave afin de l'importer dans la base MySQL du second serveur.

==> SERVEUR MASTER

							 $su
							 #mysql -u root -p
							 >USE [nom_bdd];
							 >FLUSH TABLES WITH READ LOCK;
							 >exit
							 #mysqldump -u root -p [nom_bdd] > [nom_bdd].sql
							 #mysql -u root -p
							 >use [nom_bdd];
							 >UNLOCK TABLES;
							>exit
							#scp [nom_bdd].sql [USER_SSH]@[SERVEUR_SLAVE]:/[REPERTOIRE_CIBLE]
						

==> SERVEUR SLAVE

							$su
							## mysql -u root -p replication < /[REPERTOIRE_CIBLE]/[nom_bdd_a_repliquer].sql
						

Une fois l'export/import effectué, se reférer à la méthode de réplication voulu indiquée ci-dessus.


Explications des commandes

FLUSH TABLES WITH READ LOCK

Permet de passé les tables de la base de données en lecture seule.

mysqldump

Permet de faire un dump (sauvegarde) de la base de données séléctionnée, en tant qu'utilisateur root dans un fichier nommé "[nom_bdd].sql"

UNLOCK TABLES

Permet de passé la base de données en lecture/écriture.

SCP

Effectue une copie via le protocole SSH du fichier [nom_bdd.sql] vers le serveur esclave avec un utilisateur ssh présent et autorisé sur le serveur distant sur le répertoire cible voulu.


FIN DU TUTORIEL

Ce tutoriel se termine ici, pour toute question ou rectification, vous pouvez nous contacter par mail à contact@blackhat-out.fr.