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

Reconstruction d'un esclave de réplication MySQL 8.0 à l'aide d'un plugin de clonage

Avec MySQL 8.0, Oracle a adopté une nouvelle approche du développement. Au lieu de pousser les fonctionnalités avec les versions majeures, presque toutes les versions mineures de MySQL 8.0 sont livrées avec de nouvelles fonctionnalités ou améliorations. L'une de ces nouvelles fonctionnalités est ce sur quoi nous aimerions nous concentrer dans cet article de blog.

Historiquement, MySQL n'était pas fourni avec de bons outils de provisionnement. Bien sûr, vous aviez mysqldump, mais ce n'est qu'un outil de sauvegarde logique, pas vraiment adapté aux grands environnements. Les utilisateurs de MySQL Enterprise pourraient bénéficier de MySQL Enterprise Backup tandis que les utilisateurs de la communauté pourraient utiliser xtrabackup. Aucun de ceux-ci n'est venu avec un déploiement propre de la communauté MySQL. C'était assez ennuyeux car l'approvisionnement est une tâche que vous faites assez souvent. Vous devrez peut-être construire un nouvel esclave, reconstruire un esclave défaillant - tout cela nécessitera une sorte de transfert de données entre des nœuds séparés.

MySQL 8.0.17 a introduit une nouvelle façon de provisionner les données MySQL - le plugin clone. Il a été conçu avec MySQL Group Replication à l'esprit pour introduire un moyen de provisionnement et de reconstruction automatiques des nœuds défaillants, mais son utilité ne se limite pas à ce domaine. Nous pouvons également l'utiliser pour reconstruire un nœud esclave ou provisionner un nouveau serveur. Dans cet article de blog, nous aimerions vous montrer comment configurer le plug-in MySQL Clone et comment reconstruire un esclave de réplication.

Tout d'abord, le plugin doit être activé car il est désactivé par défaut. Une fois que vous faites cela, il restera activé pendant les redémarrages. Idéalement, vous le ferez sur tous les nœuds de la topologie de réplication.

mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';

Query OK, 0 rows affected (0.00 sec)

Le plugin Clone nécessite un utilisateur MySQL avec les privilèges appropriés. Sur le donneur, il doit avoir le privilège "BACKUP_ADMIN" tandis que sur le jointeur, il doit avoir le privilège "CLONE_ADMIN". En supposant que vous souhaitiez utiliser le plugin de clonage de manière intensive, vous pouvez simplement créer un utilisateur avec les deux privilèges. Faites-le sur le maître afin que l'utilisateur soit également créé sur tous les esclaves. Après tout, vous ne savez jamais quel nœud sera maître dans le futur, il est donc plus pratique de tout préparer à l'avance.

mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'clonepass';

Query OK, 0 rows affected (0.01 sec)

mysql> GRANT BACKUP_ADMIN, CLONE_ADMIN ON *.* to [email protected]'%';

Query OK, 0 rows affected (0.00 sec)

Le plug-in MySQL Clone a certaines conditions préalables, par conséquent, des vérifications d'intégrité doivent être effectuées. Vous devez vous assurer que le donateur et le participant auront les mêmes valeurs dans les variables de configuration suivantes :

mysql> SHOW VARIABLES LIKE 'innodb_page_size';

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| innodb_page_size | 16384 |

+------------------+-------+

1 row in set (0.01 sec)

mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';

+-----------------------+-------------------------+

| Variable_name         | Value   |

+-----------------------+-------------------------+

| innodb_data_file_path | ibdata1:100M:autoextend |

+-----------------------+-------------------------+

1 row in set (0.01 sec)

mysql> SHOW VARIABLES LIKE 'max_allowed_packet';

+--------------------+-----------+

| Variable_name      | Value |

+--------------------+-----------+

| max_allowed_packet | 536870912 |

+--------------------+-----------+

1 row in set (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE '%character%';

+--------------------------+--------------------------------+

| Variable_name            | Value       |

+--------------------------+--------------------------------+

| character_set_client     | utf8mb4       |

| character_set_connection | utf8mb4                        |

| character_set_database   | utf8mb4       |

| character_set_filesystem | binary                         |

| character_set_results    | utf8mb4       |

| character_set_server     | utf8mb4       |

| character_set_system     | utf8       |

| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |

+--------------------------+--------------------------------+

8 rows in set (0.00 sec)



mysql> SHOW GLOBAL VARIABLES LIKE '%collation%';

+-------------------------------+--------------------+

| Variable_name                 | Value |

+-------------------------------+--------------------+

| collation_connection          | utf8mb4_0900_ai_ci |

| collation_database            | utf8mb4_0900_ai_ci |

| collation_server              | utf8mb4_0900_ai_ci |

| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |

+-------------------------------+--------------------+

4 rows in set (0.00 sec)

Ensuite, sur le maître, nous devrions revérifier que les tablespaces d'annulation ont des noms uniques :

mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES

    ->        WHERE FILE_TYPE LIKE 'UNDO LOG';

+-----------------+------------+

| TABLESPACE_NAME | FILE_NAME  |

+-----------------+------------+

| innodb_undo_001 | ./undo_001 |

| innodb_undo_002 | ./undo_002 |

+-----------------+------------+

2 rows in set (0.12 sec)

Le niveau de verbosité par défaut ne montre pas trop de données concernant le processus de clonage, nous vous recommandons donc de l'augmenter pour avoir un meilleur aperçu de ce qui se passe :

mysql> SET GLOBAL log_error_verbosity=3;

Query OK, 0 rows affected (0.00 sec)

Pour pouvoir démarrer le processus sur notre menuisier, nous devons configurer un donneur valide :

mysql> SET GLOBAL clone_valid_donor_list ='10.0.0.101:3306';

Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'clone_valid_donor_list';

+------------------------+-----------------+

| Variable_name          | Value |

+------------------------+-----------------+

| clone_valid_donor_list | 10.0.0.101:3306 |

+------------------------+-----------------+

1 row in set (0.00 sec)

Une fois qu'il est en place, nous pouvons l'utiliser pour copier les données depuis :

mysql> CLONE INSTANCE FROM 'clone_user'@'10.0.0.101':3306 IDENTIFIED BY 'clonepass';

Query OK, 0 rows affected (18.30 sec)

Ça y est, la progression peut être suivie dans le journal des erreurs MySQL sur le jointeur. Une fois que tout est prêt, il ne vous reste plus qu'à configurer la réplication :

mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.101', MASTER_AUTO_POSITION=1;

Query OK, 0 rows affected (0.05 sec)

mysql> START SLAVE USER='rpl_user' PASSWORD='afXGK2Wk8l';

Query OK, 0 rows affected, 1 warning (0.01 sec)

Veuillez garder à l'esprit que le plugin Clone est livré avec un ensemble de limitations. Pour commencer, il transfère uniquement les tables InnoDB, donc si vous utilisez d'autres moteurs de stockage, vous devrez soit les convertir en InnoDB, soit utiliser une autre méthode de provisionnement. Cela interfère également avec le langage de définition de données - les ALTER bloqueront et seront bloqués par les opérations de clonage.

Par défaut, le clonage n'est pas crypté, il ne peut donc être utilisé que dans un environnement sécurisé. Si nécessaire, vous pouvez configurer le cryptage SSL pour le processus de clonage en vous assurant que SSL est configuré pour le donneur, puis définir les variables suivantes sur le jointeur :

clone_ssl_ca=/path/to/ca.pem

clone_ssl_cert=/path/to/client-cert.pem

clone_ssl_key=/path/to/client-key.pem

Ensuite, vous devez ajouter "REQUIRE SSL ;" à la fin de la commande CLONE et le processus sera exécuté avec le cryptage SSL. Veuillez garder à l'esprit qu'il s'agit de la seule méthode pour cloner des bases de données avec le chiffrement des données au repos activé.

Comme nous l'avons mentionné au début, le clonage a très probablement été conçu avec MySQL Group Replication/InnoDB Cluster à l'esprit mais, tant que les limitations n'affectent pas un cas d'utilisation particulier, il peut être utilisé comme une manière native de provisionner n'importe quelle instance MySQL. Nous verrons à quel point il sera adopté - les possibilités sont nombreuses. Ce qui est déjà formidable, c'est que nous avons maintenant une autre méthode indépendante du matériel que nous pouvons utiliser pour provisionner des serveurs en plus de Xtrabackup. La concurrence est toujours bonne et nous sommes impatients de voir ce que l'avenir nous réserve.