Solutions

Exercice 1 : Configurer une réplication Master-Slave

Solution :

  1. Configurer le Master :

    • Éditez le fichier de configuration MySQL (my.cnf) sur le master et activez les logs binaires :

      bashCopier le code[mysqld]
      log-bin=/var/log/mysql/mysql-bin.log
      server-id=1
    • Redémarrez MySQL après avoir modifié le fichier de configuration :

      bashCopier le codesudo service mysql restart
    • Créez un utilisateur pour la réplication et donnez-lui les permissions nécessaires :

      sqlCopier le codeCREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
      GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
      FLUSH PRIVILEGES;
    • Obtenez l’état du master pour configurer le slave :

      sqlCopier le codeSHOW MASTER STATUS;

      Vous verrez quelque chose comme :

      diffCopier le code+------------------+----------+--------------+------------------+
      | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
      +------------------+----------+--------------+------------------+
      | mysql-bin.000001 |      120 |              |                  |
      +------------------+----------+--------------+------------------+
  2. Configurer le Slave :

    • Sur le slave, modifiez le fichier de configuration my.cnf :

      bashCopier le code[mysqld]
      server-id=2
    • Redémarrez MySQL sur le slave :

      bashCopier le codesudo service mysql restart
    • Connectez le slave au master avec la commande suivante (remplacez les valeurs par celles obtenues sur le master) :

      sqlCopier le codeCHANGE MASTER TO
      MASTER_HOST='ip_du_master',
      MASTER_USER='replicator',
      MASTER_PASSWORD='password',
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=120;
    • Démarrez la réplication sur le slave :

      sqlCopier le codeSTART SLAVE;
      SHOW SLAVE STATUS\G;
    • Si tout est configuré correctement, vous devriez voir Slave_IO_Running: Yes et Slave_SQL_Running: Yes dans la sortie de SHOW SLAVE STATUS\G.


Exercice 2 : Configurer une réplication Master-Master

Solution :

  1. Configurer le serveur Master 1 :

    • Éditez le fichier de configuration MySQL pour activer les logs binaires et définir un server-id unique.

      bashCopier le code[mysqld]
      log-bin=/var/log/mysql/mysql-bin.log
      server-id=1
    • Redémarrez MySQL :

      bashCopier le codesudo service mysql restart
    • Créez un utilisateur pour la réplication :

      sqlCopier le codeCREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
      GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
      FLUSH PRIVILEGES;
    • Obtenez l’état du master :

      sqlCopier le codeSHOW MASTER STATUS;
  2. Configurer le serveur Master 2 :

    • Répétez la même procédure sur le serveur Master 2 en utilisant un identifiant de serveur différent dans my.cnf :

      bashCopier le code[mysqld]
      log-bin=/var/log/mysql/mysql-bin.log
      server-id=2
    • Créez un utilisateur de réplication et redémarrez MySQL.

  3. Mettre en place la réplication bidirectionnelle :

    • Sur le Master 1, configurez la réplication en direction du Master 2 en utilisant les informations du SHOW MASTER STATUS du Master 2.

      sqlCopier le codeCHANGE MASTER TO
      MASTER_HOST='ip_du_master_2',
      MASTER_USER='replicator',
      MASTER_PASSWORD='password',
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=120;
    • Démarrez la réplication sur le Master 1 :

      sqlCopier le codeSTART SLAVE;
    • Sur le Master 2, configurez la réplication en direction du Master 1 :

      sqlCopier le codeCHANGE MASTER TO
      MASTER_HOST='ip_du_master_1',
      MASTER_USER='replicator',
      MASTER_PASSWORD='password',
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=120;
    • Démarrez la réplication sur le Master 2 :

      sqlCopier le codeSTART SLAVE;
  4. Test :

    • Effectuez une modification sur l’un des serveurs (par exemple, une insertion dans une table).

    • Vérifiez si cette modification a été répliquée sur l’autre serveur en exécutant une requête de sélection.


Exercice 3 : Implémenter un système de sharding rudimentaire

Solution :

Dans cet exemple, nous allons diviser une base de données de clients en deux shards, chaque shard étant sur un serveur MySQL différent. Le sharding sera effectué manuellement via une logique de répartition en fonction de l'ID du client (les clients avec un ID pair iront sur le Shard 1 et ceux avec un ID impair sur le Shard 2).

  1. Préparation des shards :

    • Créez deux instances MySQL sur différents serveurs.

    • Sur le Shard 1, créez une table clients :

      CREATE DATABASE shard1;
      USE shard1;
      CREATE TABLE clients (
        id INT PRIMARY KEY,
        nom VARCHAR(100),
        email VARCHAR(100)
      );
    • Sur le Shard 2, créez la même table clients :

      CREATE DATABASE shard2;
      USE shard2;
      CREATE TABLE clients (
        id INT PRIMARY KEY,
        nom VARCHAR(100),
        email VARCHAR(100)
      );
  2. Insérer des données dans les shards :

    • Définissez une logique au niveau de votre application pour répartir les données entre les shards. Voici un exemple en pseudo-code :

      def insert_client(client_id, nom, email):
          if client_id % 2 == 0:
              # Insérer dans Shard 1
              insert_into_shard_1(client_id, nom, email)
          else:
              # Insérer dans Shard 2
              insert_into_shard_2(client_id, nom, email)
      
      insert_client(1, 'Alice', '[email protected]')  # Shard 2
      insert_client(2, 'Bob', '[email protected]')      # Shard 1
  3. Requête sur les shards :

    • Pour interroger les données, utilisez la même logique pour rediriger les requêtes vers le shard approprié.

      def get_client(client_id):
          if client_id % 2 == 0:
              return select_from_shard_1(client_id)
          else:
              return select_from_shard_2(client_id)
      
      client = get_client(1)  # Récupérer Alice depuis Shard 2
    • Vous pouvez également gérer les requêtes globales en agrégeant les résultats des deux shards si nécessaire.

Last updated