Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment configurer la réplication source-réplica dans MySQL

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

  1. 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.

  2. 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.

  3. 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 par sudo . Si vous n'êtes pas familier avec le sudo 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 :

  1. Installez MySQL.
  2. Configurer la base de données source MySQL.
  3. Configurer un nouvel utilisateur MySQL pour le réplica.
  4. Préparez les données MySQL pour la réplication.
  5. Configurer la base de données dupliquée MySQL.
  6. 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 :

  1. Améliorez les Linodes.

     sudo apt-get update && sudo apt-get upgrade
    
  2. Installez le serveur MySQL et les applications clientes sur les serveurs source et réplica.

     sudo apt-get install mysql-server mysql-client -y
    
  3. Configurez les options de sécurité, y compris le mot de passe root, à l'aide de mysql_secure_installation commande.

     sudo mysql_secure_installation
    
  4. 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 port 3306 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.

  1. 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 un includedir directives.

  2. 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>
        
  3. Décommentez ou ajoutez les lignes pour server-id et log-bin . Définissez le server-id à 1 , et log-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 ligne binlog_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
        
  4. Redémarrez le service MySQL.

     sudo systemctl restart mysql
    
  5. 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.

  1. Entrez dans le shell MySQL.

     sudo mysql -u root -p
    
  2. 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 de REPLICA_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é.
  3. 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.

  1. 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;
    
  2. 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.
  3. 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)
  4. À 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 .
  5. De retour dans le shell MySQL d'origine, déverrouillez la base de données source.

     UNLOCK TABLES;
    
  6. Quittez le shell MySQL.

     QUIT;
    
  7. 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.

  1. Ouvrez le fichier MySQL principal, généralement situé dans /etc/mysql/mysql.conf.d/mysqld.cnf , et modifiez le bind-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
        
  2. Décommentez ou ajoutez les lignes pour server-id et log-bin . Le server-id doit être défini sur 2 sur le réplica, tandis que le log-bin la variable doit être définie sur /var/log/mysql/mysql-bin.log . Ajouter une variable pour relay-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 fichier binlog_do_db = database_name . Pour configurer plusieurs répliques, numérotez le server-id valeurs de manière séquentielle croissante. Par exemple, un deuxième réplica aurait un server-id de 3 .
    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
        
  3. Redémarrez le service MySQL pour intégrer les modifications.

     sudo systemctl restart mysql
    
  4. 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
  5. (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.

  1. 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
    
  2. Connectez-vous au shell MySQL.

     sudo mysql -u root -p
    
  3. Arrêtez la réplique.

     STOP REPLICA;
    
  4. 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 de source_ip_address . Pour SOURCE_USER et SOURCE_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 le SOURCE_LOG_FILE et SOURCE_LOG_POS valeurs, entrez les informations que vous avez enregistrées à partir du SHOW 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.
  5. Redémarrez la réplique.

     START REPLICA;
    
  6. 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 ou Last_Error événements. Le Slave_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