LeMySQL est un système de gestion de base de données relationnelle qui est l'un des projets open source les plus populaires. Bien que connu pour sa stabilité, MySQL est encore plus fiable si la réplication source-réplica est configurée. Dans la réplication, un serveur MySQL est généralement désigné comme la source . Une source envoie toutes les modifications de la base de données et les mises à jour des données à une ou plusieurs réplique serveurs de bases de données. La procédure de réplication de données de MySQL est flexible et les serveurs de réplique n'ont pas besoin d'être connectés en permanence à la source. Ce guide explique comment configurer la réplication de données source-réplica dans MySQL.
Comment fonctionne la réplication de données MySQL
Le processus de réplication stocke d'abord les données dans la base de données source, puis les copie sur toutes les répliques. Après avoir traité l'instruction, le serveur de base de données source suit la modification dans un journal binaire. Le journal sert d'enregistrement séquentiel de toutes les modifications apportées à la structure et au contenu de la base de données. SELECT
les déclarations ne sont pas enregistrées car elles ne modifient pas le contenu de la base de données.
Les mises à jour se produisent de manière asynchrone, de sorte que les répliques n'ont pas besoin d'être connectées en permanence. Cela contraste avec les architectures synchrones des systèmes à haute fiabilité. Si une synchronisation en temps réel est requise, MySQL recommande d'utiliser le cluster NDB .
Chaque réplica extrait les données de la source en demandant le contenu du journal binaire de la source. Le réplica applique ensuite les instructions dans l'ordre, rejouant efficacement les événements qui se sont produits sur la source. Chaque réplique est indépendante et garde une trace de sa position actuelle avec le journal binaire source. De plus, chaque réplique peut se synchroniser avec la source selon son propre calendrier. Les données peuvent être lues à partir de n'importe quel serveur, y compris les répliques.
MySQL permet un degré élevé de granularité. Il est possible de répliquer sur certaines bases de données ou même sur des tables spécifiques au sein d'une base de données. Le format de réplication par défaut est Réplication basée sur les instructions (SBR), dans lequel l'intégralité de l'instruction SQL est répliquée. Cependant, la réplication basée sur les lignes (RBR) est également disponible. Ce format réplique les lignes qui ont été modifiées. Il est également possible de configurer des configurations plusieurs à plusieurs plus complexes. Consultez la documentation MySQL pour plus d'informations sur les différentes options de réplication.
Remarque MySQL faisait auparavant référence à la réplication source-réplica sous le nom de « réplication maître-esclave ». L'organisation MySQL a récemment changé la terminologie, expliquant son raisonnement dans une mise à jour terminologique. L'ancien terme « maître » a été remplacé par « source », tandis qu'un « esclave » est désormais appelé « réplique ». Les anciens termes peuvent encore apparaître dans certaines commandes et affichages de sortie pendant que MySQL met à jour sa base de code. Ce guide utilise les termes préférés de MySQL tout au long des instructions.
Avantages de la réplication de données MySQL
L'activation de la réplication source-réplica offre de nombreux avantages significatifs par rapport à un système non redondant. La liste ci-dessous donne un aperçu de certains avantages :
-
Il est facile de créer une copie de sauvegarde en direct à tout moment. Étant donné que le processus de réplication est asynchrone, la réplication peut se produire selon n'importe quel calendrier. Les répliques n'ont pas besoin d'être synchronisées avec la source pour fonctionner de manière fiable.
-
L'ajout d'une réplique peut augmenter la disponibilité et la fiabilité de l'ensemble du système. Le contrôle principal peut basculer vers le réplica si une maintenance est nécessaire ou si la base de données source n'est pas disponible.
-
Chaque réplique fournit une autre instance lisible de la base de données. Cela permet aux programmes d'exploration de données ou d'analyse d'interroger le réplica sans placer de charge supplémentaire sur la base de données source d'origine.
-
Cette architecture augmente l'évolutivité et les performances. La base de données lit et
SELECT
les instructions peuvent être équilibrées entre les serveurs, ce qui réduit la latence. -
Les tiers peuvent obtenir un accès en lecture seule à une base de données via une réplique et n'ont plus besoin d'accéder à la source. Une base de données répliquée peut être créée à la demande lorsqu'elle est requise et détruite lorsqu'elle n'est plus nécessaire. Cette technique améliore la sécurité et garantit qu'il est impossible de falsifier les données d'origine.
Avant de commencer
-
Si vous ne l'avez pas déjà fait, créez un compte Linode et une instance de calcul. Consultez nos guides Premiers pas avec Linode et Création d'une instance de calcul.
-
Suivez notre guide Configuration et sécurisation d'une instance de calcul pour mettre à jour votre système. Vous pouvez également définir le fuseau horaire, configurer votre nom d'hôte, créer un compte utilisateur limité et renforcer l'accès SSH.
-
Vous devez disposer d'au moins deux Linodes distincts pour configurer la réplication MySQL source-réplica. Un Linode héberge la base de données source, tandis qu'un autre nœud est nécessaire pour le serveur réplique.
Remarque Les étapes de ce guide sont écrites pour un utilisateur non root. Les commandes qui nécessitent des privilèges élevés sont préfixées parsudo
. Si vous n'êtes pas familier avec lesudo
commande, consultez le guide Linux Users and Groups.
Configurer la réplication source-réplica dans MySQL
Pour configurer la réplication source-réplica, MySQL doit être installé sur deux serveurs distincts pouvant communiquer entre eux. Ces instructions sont destinées à la distribution Ubuntu mais sont généralement applicables à toutes les distributions Linux. Le processus comprend les étapes suivantes :
- Installez MySQL.
- Configurer la base de données source MySQL.
- Configurer un nouvel utilisateur MySQL pour le réplica.
- Préparez les données MySQL pour la réplication.
- Configurer la base de données dupliquée MySQL.
- Importer les données MySQL répliquées et activer la réplication.
Installer MySQL
Si MySQL n'est pas déjà disponible sur les deux Linodes, installez-le en procédant comme suit :
-
Améliorez les Linodes.
sudo apt-get update && sudo apt-get upgrade
-
Installez le serveur MySQL et les applications clientes sur les serveurs source et réplica.
sudo apt-get install mysql-server mysql-client -y
-
Configurez les options de sécurité, y compris le mot de passe root, à l'aide de
mysql_secure_installation
commande.sudo mysql_secure_installation
-
Si vous utilisez un pare-feu tel que
ufw
, assurez-vous qu'il autorise le trafic MySQL. Ajoutez la règle suivante pour ouvrir le port3306
sur le pare-feu.ufw allow mysql
Configurer la base de données source MySQL
Pour activer la réplication MySQL, modifiez certaines variables dans le fichier de configuration MySQL principal. Apportez les modifications suivantes à la configuration de la base de données source.
-
Localisez le fichier de configuration MySQL principal sur le serveur de base de données source. Ce fichier se trouve généralement dans
/etc/mysql/mysql.conf.d/mysqld.cnf
. Cependant, dans les installations antérieures, il peut se trouver dans/etc/my.cnf
ou/etc/mysql/my.cnf
. Il peut également être référencé à partir de l'un des fichiers via unincludedir
directives. -
Ouvrez le fichier de configuration MySQL et modifiez le
bind-address
à l'adresse IP du serveur source.- Fichier :/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = <source_ip_address>
-
Décommentez ou ajoutez les lignes pour
server-id
etlog-bin
. Définissez leserver-id
à1
, etlog-bin
vers/var/log/mysql/mysql-bin.log
.Remarque Assurez-vous que le
skip_networking
la variable n'est déclarée nulle part. Commentez-le s'il apparaît dans ce fichier. Pour répliquer une seule base de données, ajoutez la lignebinlog_do_db = <database_name>
au fichier.- Fichier :/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Redémarrez le service MySQL.
sudo systemctl restart mysql
-
Vérifiez l'état de MySQL et assurez-vous qu'il est
active
.sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago
Configurer un nouvel utilisateur MySQL pour le réplica
Vous devez créer un nouvel utilisateur sur le serveur source pour représenter la réplique. Les nouveaux utilisateurs sont créés dans le shell MySQL.
-
Entrez dans le shell MySQL.
sudo mysql -u root -p
-
Ajoutez un utilisateur pour le compte répliqué à l'aide de MySQL
CREATE USER
syntaxe. Le nom d'utilisateur doit être composé du nom du compte répliqué, un@
symbole et l'adresse IP du serveur de réplique. Choisissez un mot de passe plus sécurisé pour le compte à la place deREPLICA_PASSWORD
.CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
Remarque Pour permettre au réplica de se connecter à partir de n'importe quelle adresse, spécifiez l'utilisateur en tant que
'replica_account_name'@'%'
. Le%
symbole représente n'importe quelle adresse ou domaine. Cela offre une flexibilité supplémentaire au détriment d'une certaine sécurité. -
Accordez des droits de réplication à l'utilisateur du réplica distant.
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
Préparer les données MySQL pour la réplication
À ce stade, il est nécessaire de vider et de verrouiller la base de données source pour préparer les données pour la réplication.
-
Restez dans le shell MySQL et videz les privilèges pour recharger les tables de droits sans redémarrer la base de données.
FLUSH PRIVILEGES;
-
Verrouillez la base de données pour figer la base de données à un point stable à partir duquel exporter les données. Laissez le client MySQL en cours d'exécution jusqu'à ce que vous exportiez la base de données. La saisie d'une commande d'écriture ou la sortie du shell MySQL libère le verrou.
FLUSH TABLES WITH READ LOCK;
Attention Cette commande bloque tous les commits dans la base de données source. Exportez les données avant d'autoriser la source à traiter d'autres commits. Sinon, la base de données répliquée pourrait être corrompue ou incohérente avec la base de données source. Effectuez les deux étapes restantes de cette section dès que possible.
-
Vérifiez l'état de la base de données à l'aide de la commande suivante. Cette commande affiche le fichier journal actuel ainsi que la position du dernier enregistrement dans ce fichier. Enregistrez ces informations car elles sont nécessaires pour lancer la réplication sur le réplica ultérieurement.
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1301 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
À l'aide du shell Linux à partir d'une console différente, exportez la base de données à l'aide de
mysqldump
outil. Sélectionnez un nom mémorable pour le fichier de destination. Inclure le–master-data
option pour ajouter des informations sur le fichier journal et la position de l'enregistrement en cours dans le journal.sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
Remarque Pour exporter une seule base de données, incluez le
--opt <database_name>
plutôt que-–all-databases
. -
De retour dans le shell MySQL d'origine, déverrouillez la base de données source.
UNLOCK TABLES;
-
Quittez le shell MySQL.
QUIT;
-
Copiez le fichier de base de données exporté sur le serveur de base de données répliqué, en utilisant
ftp
,scp
, ou une autre méthode de transfert du fichier.scp databasecopy.sql [email protected]<replica_ip_address>
Configurer la base de données MySQL Replica
La configuration suivante doit être appliquée à la configuration de la base de données répliquée. Pour installer MySQL sur le serveur réplica, consultez la section Installer MySQL.
-
Ouvrez le fichier MySQL principal, généralement situé dans
/etc/mysql/mysql.conf.d/mysqld.cnf
, et modifiez lebind-address
pour correspondre à l'adresse IP du serveur réplica.- Fichier :/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = xx.xx.xx.xx
-
Décommentez ou ajoutez les lignes pour
server-id
etlog-bin
. Leserver-id
doit être défini sur2
sur le réplica, tandis que lelog-bin
la variable doit être définie sur/var/log/mysql/mysql-bin.log
. Ajouter une variable pourrelay-log
et définissez-le sur/var/log/mysql/mysql-relay-bin.log
.Remarque Assurez-vous que le
skip_networking
La variable n'est définie nulle part dans ce fichier. Pour répliquer une seule base de données, ajoutez la directive suivante au fichierbinlog_do_db = database_name
. Pour configurer plusieurs répliques, numérotez leserver-id
valeurs de manière séquentielle croissante. Par exemple, un deuxième réplica aurait unserver-id
de3
.- Fichier :/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3 4
server-id = 2 log_bin = /var/log/mysql/mysql-bin.log relay-log = /var/log/mysql/mysql-relay-bin.log
-
Redémarrez le service MySQL pour intégrer les modifications.
sudo systemctl restart mysql
-
Vérifiez l'état de MySQL et assurez-vous qu'il est
active
.sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
-
(Facultatif ) MySQL recommande d'utiliser SSL pour se connecter à la source pour plus de sécurité. Vous trouverez plus d'informations sur la configuration de SSL dans la documentation MySQL SSL. L'outil de configuration RSA peut être utilisé pour accélérer ce processus.
Importer les données MySQL répliquées et activer la réplication
L'étape suivante consiste à importer la copie des données de la base de données, à définir la source de réplication et à redémarrer le serveur de base de données répliqué. La réplique devrait alors être synchronisée et prête à être utilisée.
-
Entrez la commande suivante à partir du shell Linux pour importer la base de données source. Spécifiez le nom de la base de données utilisée pour exporter les données plus tôt.
sudo mysql -u root -p < databasecopy.sql
-
Connectez-vous au shell MySQL.
sudo mysql -u root -p
-
Arrêtez la réplique.
STOP REPLICA;
-
Saisissez le
CHANGE REPLICATION SOURCE
commande, ainsi que les détails suivants. Remplacez l'adresse IP du serveur de base de données source à la place desource_ip_address
. PourSOURCE_USER
etSOURCE_PASSWORD
, entrez le nom d'utilisateur et le mot de passe du réplica dans la section Configurer un nouvel utilisateur MySQL pour le réplica. Pour leSOURCE_LOG_FILE
etSOURCE_LOG_POS
valeurs, entrez les informations que vous avez enregistrées à partir duSHOW MASTER STATUS;
commande.CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
Remarque Pour utiliser SSL pour la connexion, ce que MySQL recommande, ajoutez l'attribut
SOURCE_SSL=1
à la commande. Vous trouverez plus d'informations sur l'utilisation de SSL dans un contexte de réplication source-réplica dans la documentation MySQL. -
Redémarrez la réplique.
START REPLICA;
-
Vérifiez l'état de la réplique. Le réplica doit attendre des événements et il ne doit pas y avoir de
Last_IO_Error
ouLast_Error
événements. LeSlave_SQL_Running_State
l'entrée doit indiquer que le réplica a lu le journal de relais.SHOW REPLICA STATUS\G
Slave_IO_State: Waiting for master to send event Master_Host: 178.79.153.39 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 156 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 371 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes .. Last_Errno: 0 Last_Error: .. Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Tester la réplication source-réplica MySQL
Si la base de données source était déjà remplie avant l'instanciation du réplica, des tests supplémentaires sont requis. Dans ce cas, vérifiez que les bases de données et les tables qui existent sur la source sont présentes sur le réplica après l'importation des données. Dans le champ SHOW REPLICA STATUS
afficher, le Slave_SQL_Running_State
l'entrée doit indiquer Slave has read all relay log
.
Pour vérifier que la réplication se déroule correctement, créez une nouvelle base de données ou table sur la source. Après quelques secondes, la nouvelle entrée devrait être présente sur la réplique. Validez la présence de la base de données à l'aide du SHOW DATABASES;
commande. Pour confirmer la présence d'une table, passez à la base de données en utilisant USE databasename;
, et saisissez SHOW TABLES;
. C'est aussi une bonne idée d'exécuter le SHOW REPLICA STATUS
commande et examinez la sortie pour toute erreur. La Last_Error
et Last_IO_Error
les champs doivent être vides et le réplica doit rester connecté.
En savoir plus sur la réplication source-réplica MySQL
La meilleure source d'informations sur la réplication source-réplica est la documentation officielle de MySQL. La section sur la réplication contient des informations plus détaillées sur l'architecture et le processus d'installation. Les forums MySQL peuvent également être utiles.
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.
- Documentation MySQL