Qu'est-ce que la réplication maître-maître MySQL ?
La réplication MySQL Master-Master ajoute de la vitesse et de la redondance pour les sites Web actifs. Avec la réplication, deux serveurs MySQL distincts agissent comme un cluster. La mise en cluster de bases de données est particulièrement utile pour les configurations de sites Web à haute disponibilité. Utilisez deux Linodes distincts pour configurer la réplication de la base de données, chacun avec des adresses IPv4 privées.
RemarqueCe guide est écrit pour un utilisateur non root. Les commandes qui nécessitent des privilèges élevés sont préfixées par
sudo
. Si vous n'êtes pas familier avec lesudo
commande, vous pouvez consulter notreGuide des utilisateurs et des groupes.Ce guide est écrit pour Debian 9, Ubuntu 18.04 et Ubuntu 20.04.
Si vous ne savez pas quelle version de MySQL a été installée sur votre système lorsque vous suivez les étapes ci-dessous, saisissez la commande suivante :
mysql --version
Installer MySQL
-
Utilisez les commandes suivantes pour installer MySQL sur chacun des Linodes :
sudo apt-get update sudo apt-get upgrade -y sudo apt-get install mysql-server mysql-client
-
Exécutez la commande d'installation sécurisée MySQL. Il vous sera demandé de créer un mot de passe root. Il est recommandé de sélectionner oui à toutes les questions :
mysql_secure_installation
Modifier la configuration de MySQL
-
Modifiez le
/etc/mysql/my.cnf
fichier sur chacun des Linodes. Ajoutez ou modifiez les valeurs suivantes :Serveur 1 :
- Fichier :/ etc/mysql/mon.cnf
1 2 3 4 5 6 7 8 9 10 11
[mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 1
Remarque Si vous utilisez MySQL 8.0.25 ou une version antérieure, remplacez
log_replica_updates
aveclog_slave_updates
(dans les deux serveurs 1 et 2). Voir la documentation MySQL pour plus de détails.Serveur 2 :
- Fichier :/ etc/mysql/mon.cnf
1 2 3 4 5 6 7 8 9 10 11
[mysqld] server_id = 2 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 2
Remarque Si vous utilisez MySQL 8.0.25 ou une version antérieure, remplacez
log_replica_updates
aveclog_slave_updates
(dans les deux serveurs 1 et 2). Voir la documentation MySQL pour plus de détails. -
Modifiez l'
bind-address
configuration afin d'utiliser les adresses IP privées, pour chacun des Linodes.- Fichier :/ etc/mysql/mon.cnf
1
bind-address = x.x.x.x
-
Une fois terminé, redémarrez l'application MySQL :
sudo systemctl restart mysql
Créer des utilisateurs de réplication
-
Connectez-vous à MySQL sur chacun des Linodes :
mysql -u root -p
-
Configurez les utilisateurs de réplication sur chaque Linode. Remplacer
x.x.x.x
avec l'adresse IP privée du Linode adverse, etpassword
avec un mot de passe fort :MySQL8 et supérieur
CREATE USER 'replication'@'x.x.x.x' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x';
Sous MySQL8
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x' IDENTIFIED BY 'password';
-
Exécutez la commande suivante pour tester la configuration. Utilisez l'adresse IP privée du Linode adverse :
mysql -u replication -p -h x.x.x.x -P 3306
Cette commande devrait vous connecter à l'instance MySQL du serveur distant.
Configurer la réplication de la base de données
-
Une fois connecté à MySQL sur le serveur 1, interrogez le statut du maître :
SHOW MASTER STATUS;
Notez les valeurs de fichier et de position qui sont affichées :
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 277 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
-
Sur le serveur 2, à l'invite MySQL, configurez la fonctionnalité de réplique pour cette base de données. Remplacer
x.x.x.x
avec l'adresse IP privée du premier serveur. Remplacez également la valeur desource_log_file
avec la valeur du fichier de l'étape précédente et la valeur desource_log_pos
avec la valeur de la position.MySQL 8.0.22 ou supérieur :
STOP REPLICA; CHANGE REPLICATION SOURCE TO source_host='x.x.x.x', source_port=3306, source_user='replication', source_password='password', source_log_file='mysql-bin.000001', source_log_pos=106; START REPLICA;
MySQL 8.0.22 ou version antérieure :
STOP SLAVE; CHANGE MASTER TO master_host='x.x.x.x', master_port=3306, master_user='replication', master_password='password', master_log_file='mysql-bin.000001', master_log_pos=106; START SLAVE;
-
Sur le serveur 2, interrogez l'état du maître. Notez à nouveau les valeurs de fichier et de position.
SHOW MASTER STATUS;
-
Définissez l'état de la base de données répliquée sur le serveur 1, en utilisant des commandes similaires à celles de l'étape 2. Lors de la saisie des commandes, utilisez l'adresse IP du serveur 2 et les valeurs de fichier et de position que vous venez de collecter à l'étape précédente.
-
Testez en créant une base de données et en insérant une ligne :
Serveur 1 :
create database test; create table test.flowers (`id` varchar(10));
Serveur 2 :
show tables in test;
Une fois interrogé, vous devriez voir les tables du serveur 1 répliquées sur le serveur 2. Félicitations, vous avez maintenant un cluster MySQL Master-Master !
Plus d'informations
Vous pouvez consulter les ressources suivantes pour plus d'informations sur ce sujet. Bien que ceux-ci soient fournis dans l'espoir qu'ils seront utiles, veuillez noter que nous ne pouvons pas garantir l'exactitude ou l'actualité des documents hébergés en externe.
- Manuels de référence MySQL