Com o MySQL 8.0, a Oracle adotou uma nova abordagem de desenvolvimento. Em vez de empurrar recursos com versões principais, quase todas as versões secundárias do MySQL 8.0 vêm com novos recursos ou melhorias. Um desses novos recursos é o que gostaríamos de focar nesta postagem do blog.
Historicamente, o MySQL não vinha com boas ferramentas para provisionamento. Claro, você tinha o mysqldump, mas é apenas uma ferramenta de backup lógica, não muito adequada para ambientes maiores. Os usuários corporativos do MySQL podem se beneficiar do MySQL Enterprise Backup, enquanto os usuários da comunidade podem usar o xtrabackup. No entanto, nenhum deles veio com implantações limpas da comunidade MySQL. Foi bastante irritante, pois o provisionamento é uma tarefa que você faz com bastante frequência. Você pode precisar construir um novo escravo, reconstruir um com falha - tudo isso exigirá algum tipo de transferência de dados entre nós separados.
O MySQL 8.0.17 introduziu uma nova maneira de provisionar dados do MySQL - plug-in clone. Com o MySQL Group Replication em mente, pretendia-se introduzir uma forma de provisionamento e reconstrução automática de nós com falha, mas sua utilidade não se limita a essa área. Também podemos usá-lo para reconstruir um nó escravo ou provisionar um novo servidor. Nesta postagem do blog, gostaríamos de mostrar como configurar o plug-in MySQL Clone e como reconstruir um escravo de replicação.
Primeiro de tudo, o plugin deve estar habilitado, pois está desabilitado por padrão. Depois de fazer isso, ele permanecerá ativado por meio de reinicializações. Idealmente, você fará isso em todos os nós na topologia de replicação.
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.00 sec)
O plug-in de clone requer um usuário MySQL com privilégios apropriados. No doador, ele deve ter o privilégio “BACKUP_ADMIN” enquanto no joiner, ele deve ter o privilégio “CLONE_ADMIN”. Supondo que você queira usar o plug-in clone extensivamente, basta criar um usuário com ambos os privilégios. Faça isso no master para que o usuário seja criado também em todos os slaves. Afinal, você nunca sabe qual nó será um mestre em algum momento no futuro, portanto, é mais conveniente ter tudo preparado antecipadamente.
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)
O plugin MySQL Clone tem alguns pré-requisitos, portanto, verificações de integridade devem ser realizadas. Você deve garantir que o doador e o joiner tenham os mesmos valores nas seguintes variáveis de configuração:
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)
Então, no mestre, devemos verificar novamente se os tablespaces de undo têm nomes exclusivos:
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)
O nível de detalhamento padrão não mostra muitos dados sobre o processo de clonagem, portanto, recomendamos aumentá-lo para ter uma melhor visão do que está acontecendo:
mysql> SET GLOBAL log_error_verbosity=3;
Query OK, 0 rows affected (0.00 sec)
Para poder iniciar o processo em nosso joiner, temos que configurar um doador 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)
Uma vez que esteja no lugar, podemos usá-lo para copiar os dados de:
mysql> CLONE INSTANCE FROM 'clone_user'@'10.0.0.101':3306 IDENTIFIED BY 'clonepass';
Query OK, 0 rows affected (18.30 sec)
É isso, o progresso pode ser rastreado no log de erros do MySQL no joiner. Quando tudo estiver pronto, tudo o que você precisa fazer é configurar a replicação:
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, tenha em mente que o plugin Clone vem com um conjunto de limitações. Para começar, ele transfere apenas tabelas InnoDB, portanto, se você usar outros mecanismos de armazenamento, precisará convertê-los para InnoDB ou usar outro método de provisionamento. Também interfere na Linguagem de Definição de Dados - ALTERs bloquearão e serão bloqueados por operações de clonagem.
Por padrão, a clonagem não é criptografada, portanto só pode ser usada em um ambiente seguro. Se necessário, você pode configurar a criptografia SSL para o processo de clonagem, garantindo que o doador tenha SSL configurado e, em seguida, defina as seguintes variáveis no joiner:
clone_ssl_ca=/path/to/ca.pem
clone_ssl_cert=/path/to/client-cert.pem
clone_ssl_key=/path/to/client-key.pem
Então, você precisa adicionar “REQUIRE SSL;” no final do comando CLONE e o processo será executado com criptografia SSL. Lembre-se de que este é o único método para clonar bancos de dados com criptografia de dados em repouso habilitada.
Como mencionamos no início, a clonagem foi, provavelmente, projetada com o MySQL Group Replication/InnoDB Cluster em mente, mas, desde que as limitações não afetem um caso de uso específico, ela pode ser usada como uma forma nativa de provisionar qualquer instância MySQL. Veremos quão ampla será a adoção - as possibilidades são inúmeras. O que já é ótimo é que agora temos outro método independente de hardware que podemos usar para provisionar servidores além do Xtrabackup. A concorrência é sempre boa e estamos ansiosos para ver o que o futuro reserva.