Con MySQL 8.0, Oracle adoptó un nuevo enfoque de desarrollo. En lugar de impulsar las funciones con las versiones principales, casi todas las versiones menores de MySQL 8.0 vienen con nuevas funciones o mejoras. Una de estas nuevas características es en lo que nos gustaría centrarnos en esta publicación de blog.
Históricamente, MySQL no venía con buenas herramientas para el aprovisionamiento. Claro, tenía mysqldump, pero es solo una herramienta de copia de seguridad lógica, no muy adecuada para entornos más grandes. Los usuarios empresariales de MySQL podrían beneficiarse de MySQL Enterprise Backup, mientras que los usuarios de la comunidad podrían usar xtrabackup. Sin embargo, ninguno de ellos vino con implementaciones limpias de MySQL Community. Fue bastante molesto ya que el aprovisionamiento es una tarea que realiza con bastante frecuencia. Es posible que deba construir un nuevo esclavo, reconstruir uno fallido; todo esto requerirá algún tipo de transferencia de datos entre nodos separados.
MySQL 8.0.17 introdujo una nueva forma de aprovisionar datos de MySQL:complemento de clonación. Se pensó con MySQL Group Replication en mente para introducir una forma de aprovisionamiento automático y reconstrucción de nodos fallidos, pero su utilidad no se limita a esa área. También podemos usarlo para reconstruir un nodo esclavo o aprovisionar un nuevo servidor. En esta publicación de blog, nos gustaría mostrarle cómo configurar el complemento MySQL Clone y cómo reconstruir un esclavo de replicación.
En primer lugar, el complemento debe estar habilitado ya que está deshabilitado de manera predeterminada. Una vez que haga esto, permanecerá habilitado durante los reinicios. Idealmente, lo hará en todos los nodos de la topología de replicación.
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.00 sec)
El complemento de clonación requiere un usuario de MySQL con los privilegios adecuados. En el donante debe tener el privilegio "BACKUP_ADMIN", mientras que en el ensamblador debe tener el privilegio "CLONE_ADMIN". Suponiendo que desea utilizar el complemento de clonación de forma extensiva, puede crear un usuario con ambos privilegios. Hágalo en el maestro para que el usuario se cree también en todos los esclavos. Después de todo, nunca se sabe qué nodo será el maestro en el futuro, por lo que es más conveniente tener todo preparado por adelantado.
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)
El complemento MySQL Clone tiene algunos requisitos previos, por lo que se deben realizar verificaciones de cordura. Debe asegurarse de que tanto el donante como el carpintero tengan los mismos valores en las siguientes variables de configuración:
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)
Luego, en el maestro, debemos verificar que los espacios de tablas de deshacer tengan nombres únicos:
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)
El nivel de detalle predeterminado no muestra demasiados datos sobre el proceso de clonación, por lo que recomendamos aumentarlo para tener una mejor idea de lo que está sucediendo:
mysql> SET GLOBAL log_error_verbosity=3;
Query OK, 0 rows affected (0.00 sec)
Para poder iniciar el proceso en nuestro ensamblador, tenemos que configurar un donante válido:
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)
Una vez que esté en su lugar, podemos usarlo para copiar los datos de:
mysql> CLONE INSTANCE FROM 'clone_user'@'10.0.0.101':3306 IDENTIFIED BY 'clonepass';
Query OK, 0 rows affected (18.30 sec)
Eso es todo, el progreso se puede rastrear en el registro de errores de MySQL en el carpintero. Una vez que todo esté listo, todo lo que tiene que hacer es configurar la replicación:
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)
Por favor, tenga en cuenta que el complemento Clone viene con un conjunto de limitaciones. Para empezar, solo transfiere tablas de InnoDB, por lo que si utiliza otros motores de almacenamiento, deberá convertirlos a InnoDB o utilizar otro método de aprovisionamiento. También interfiere con el lenguaje de definición de datos:los ALTER se bloquearán y serán bloqueados por las operaciones de clonación.
De forma predeterminada, la clonación no está cifrada, por lo que solo se puede usar en un entorno seguro. Si es necesario, puede configurar el cifrado SSL para el proceso de clonación asegurándose de que el donante tenga SSL configurado y luego defina las siguientes variables en el ensamblador:
clone_ssl_ca=/path/to/ca.pem
clone_ssl_cert=/path/to/client-cert.pem
clone_ssl_key=/path/to/client-key.pem
Luego, debe agregar “REQUIERE SSL;” al final del comando CLONE y el proceso se ejecutará con encriptación SSL. Tenga en cuenta que este es el único método para clonar bases de datos con el cifrado de datos en reposo habilitado.
Como mencionamos al principio, lo más probable es que la clonación se haya diseñado pensando en MySQL Group Replication/InnoDB Cluster pero, siempre que las limitaciones no afecten un caso de uso particular, se puede usar como una forma nativa de aprovisionar cualquier instancia de MySQL. Veremos qué tan amplia será la adopción:las posibilidades son numerosas. Lo que ya es genial es que ahora tenemos otro método independiente del hardware que podemos usar para aprovisionar servidores además de Xtrabackup. La competencia siempre es buena y esperamos ver qué nos depara el futuro.