Table des matières

Les réplications MySQL/Mariadb

Admettons que nous avons qu'une seule machine sur laquelle on met une réplication pour que la seconde instance soit utilisé pour des tests ou des backups qui viendront pas déranger l'instance principale utilisé en production.

Créer une instance

Désactiver l'instance par défaut

Il y a d'abord besoin de se séparer de l'instance principale si elle existe car elle ne doit pas utiliser le bon compte utilisateur :

systemctl stop mysqld
systemctl disable --now mariadb
sed -i 's/user = mysql//' /etc/mysql/my.cn

On utilisera un nouveau compte utilisateur avec son environnement :

cat /etc/mysql/conf.d/50-multi.cnf <<EOF
[mysqld_multi]
user = mysqladmin (pourquoi pas mysqld1 ?)
EOF

Créer la 1ère instance

useradd mysqld1
mkdir -vp /srv/mysqld_instances/mysqld1 /home/mysqld1-tmp
touch /var/log/mysqld1.log
chmod 755 /srv /srv/mysqld_instances
chown -R mysqld1:mysqld1 /srv/mysqld_instances/mysqld1 /home/mysqld1-tmp /var/log/mysqld1.log

On déclare quelques informations à propos de la nouvelle instance :

cat /etc/mysql/mariadb.conf.d/zzz_mysqld1.cnf <<EOF
[mysqld1]
user = mysqld1
port = 3307
tmpdir = /home/mysqld1-tmp/
socket = /var/run/mysqld1/mysqld1.sock
pid-file = /var/run/mysqld1/mysqld1.pid
datadir = /srv/mysqld_instances/mysqld1
log_error = /var/log/mysqld1.log

# Désactivation de l'héritage des valeurs présent dans l'instance par défaut :
skip-slave-start
log_bin = 0
slow_query_log = 0
EOF
chmod 644 /etc/mysql/mariadb.conf.d/zzz_mysqld1.cnf

Il reste a créer le dossier qui contiendra l'ensemble du contenu des bases :

mysql_install_db --user=mysqld1 --datadir=/srv/mysqld_instances/mysqld1 --defaults-file=/etc/mysql/mariadb.conf.d/zzz_mysqld1.cnf
chmod 700 /srv/mysqld_instances/mysqld1

Cette instance sera géré via une unité systemd :

[Unit]
Description=MySQL Multi Server for instance %i
After=syslog.target
After=network.target

[Service]
PIDFile=/var/run/mysqld%i/mysqld%i.pid
User=mysqld%i
Group=mysqld%i
Type=forking
ExecStart=/usr/bin/mysqld_multi start %i
ExecStop=/usr/bin/mysqld_multi stop %i
Restart=always
PrivateTmp=true
RuntimeDirectory=mysqld%i

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start mysqld@1

Par sécurité, il y a besoin d'un compte d'administration au lieu de root qui a un mot de passe vide :

mysql -P3307 –socket=/var/run/mysqld1/mysqld1.sock -u root -p

GRANT USAGE ON *.* TO 'mysqladmin'@'localhost' IDENTIFIED BY 'XXXXXXXXX';
GRANT ALL PRIVILEGES ON *.* TO 'mysqladmin'@'localhost';
DROP USER 'root'@localhost;

On active ensuite les binlogs qui seront lu par la 2ème instance en ajoutant ces directives dans la 1ère instance sous la section [mysql]:

log_bin          = /var/log/mysql/mysql-bin.log
expire_logs_days  = 10
max_binlog_size   = 100M
#binlog_do_db     = include_database_name
#binlog_ignore_db = include_database_name
binlog_format     = mixed

Créer la 2ème instance

On créer ensuite la 2ème instance mysql dont la procédure est pratiquement similaire avec la 1ère instance :

useradd mysqld2
mkdir -vp /srv/mysqld_instances/mysqld2 /home/mysqld2-tmp
touch /var/log/mysqld2.log
chmod 755 /srv /srv/mysqld_instances
chown -R mysqld2:mysqld2 /srv/mysqld_instances/mysqld2 /home/mysqld2-tmp /var/log/mysqld2.log

On déclare quelques informations à propos de la nouvelle instance :

cat /etc/mysql/mariadb.conf.d/zzz_mysqld2.cnf <<EOF
[mysqld2]
user = mysqld2
port = 3307
tmpdir = /home/mysqld2-tmp/
socket = /var/run/mysqld2/mysqld2.sock
pid-file = /var/run/mysqld2/mysqld2.pid
datadir = /srv/mysqld_instances/mysqld2
log_error = /var/log/mysqld2.log

# Désactivation de l'héritage des valeurs présent dans l'instance par défaut :
skip-slave-start
log_bin = 0
slow_query_log = 0
EOF
chmod 644 /etc/mysql/mariadb.conf.d/zzz_mysqld2.cnf

Il reste a créer le dossier qui contiendra l'ensemble du contenu des bases :

mysql_install_db --user=mysqld2 --datadir=/srv/mysqld_instances/mysqld2 --defaults-file=/etc/mysql/mariadb.conf.d/zzz_mysqld2.cnf
chmod 700 /srv/mysqld_instances/mysqld2
systemctl daemon-reload
systemctl start mysqld@2

Par sécurité, il y a besoin d'un compte d'administration au lieu de root qui a un mot de passe vide :

mysql -P3307 –socket=/var/run/mysqld2/mysqld2.sock -u root -p

GRANT USAGE ON *.* TO 'mysqladmin'@'localhost' IDENTIFIED BY 'XXXXXXXXX';
GRANT ALL PRIVILEGES ON *.* TO 'mysqladmin'@'localhost';
DROP USER 'root'@localhost;

Exporter et importer la base de donnée sur la 2ème instance

Activer la réplication

Ancienne méthode

Avant de commencer, il faudra qu'il y ait la même base de donnée des deux côtés.

On commence par le master en indiquant ces options :

nano /etc/mysql/mariadb.conf.d/50-server.cnf
log_bin          = /var/log/mysql/mysql-bin.log
bind-address = 0.0.0.0
server-id = 1
binlog_format     = mixed
  1. On spécifie l'emplacement du binlog
  2. On dit que le master écoutera tous toutes les IPs pour que le slave puisse s'y connecter
  3. Chaque serveur doit avoir un id différent
  4. On définis ce format pour de meilleurs performances.

/etc/init.d/mysql restart

Puis on passe au serveur slave :

nano /etc/mysql/mariadb.conf.d/50-server.cnf
server-id = 2
<code>

/etc/init.d/mysql restart

On créer sur les deux machines un utilisateur dédié à cette réplication :

<code mysql>
GRANT REPLICATION SLAVE ON *.* TO user@'%' IDENTIFIED BY 'password';

En restant sur le slave, on déclare la machine master :

CHANGE MASTER TO MASTER_HOST='IP-SERVER-MASTER', MASTER_USER='user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.NNNNN', MASTER_LOG_POS=XXX;

Pour avoir les informations liée au valeur MASTER_LOG_FILE et MASTER_LOG_POS, il suffira de tapez sur le master ceci :

show master status;

Un fois cela fait, il reste plus qu'a démarrer la réplication avec les infos que l'on peut obtenir :

START SLAVE;
SHOW SLAVE STATUS\G;