Mise à jour : 24/12/2020 à 11H23
Debian 10 (BUSTER) - Validé le 26/12/2020
MySQL version : 10.3.27
Habitué mysql/mariadb
Connaissances en langage SQL
Habitué de la ligne de commandes
Habitué linux CLI
Lammers : Déconseillé
Novices : 1h/2h
Habitués de Linux: 10/15 minutes
Habitués MySQL/MariaDB : 5/10 minutes
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.
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)
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
La ligne server id =, permet de définir un identifiant pour reconnaître vos différents serveur.
Permet d'indiquer où se situe le fichier de log du serveur.
Permet d'indiquer quelle base de données on veut répliquer.
Permet de redémarrer l'application mysql.
- 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.
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.
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].
Permet de rafraichir les droits.
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
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.
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" ##
==> 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
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.
Permet de passé les tables de la base de données en lecture seule.
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"
Permet de passé la base de données en lecture/écriture.
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.
Ce tutoriel se termine ici, pour toute question ou rectification, vous pouvez nous contacter par mail à contact@blackhat-out.fr.