meta données pour cette page
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
- Stratégie Master → Slave :
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
- On spécifie l'emplacement du binlog
- On dit que le master écoutera tous toutes les IPs pour que le slave puisse s'y connecter
- Chaque serveur doit avoir un id différent
- 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;