Mysql
 sql >> Database >  >> RDS >> Mysql

Ricostruzione di uno slave di replica MySQL 8.0 utilizzando un plug-in clone

Con MySQL 8.0 Oracle ha adottato un nuovo approccio allo sviluppo. Invece di spingere le funzionalità con le versioni principali, quasi tutte le versioni minori di MySQL 8.0 sono dotate di nuove funzionalità o miglioramenti. Una di queste nuove funzionalità è ciò su cui vorremmo concentrarci in questo post del blog.

Storicamente MySQL non disponeva di buoni strumenti per il provisioning. Certo, avevi mysqldump, ma è solo uno strumento di backup logico, non proprio adatto ad ambienti più grandi. Gli utenti aziendali di MySQL potrebbero trarre vantaggio da MySQL Enterprise Backup mentre gli utenti della comunità potrebbero utilizzare xtrabackup. Nessuno di questi è arrivato con una distribuzione pulita della community MySQL. È stato piuttosto fastidioso poiché il provisioning è un'attività che svolgi abbastanza spesso. Potrebbe essere necessario creare un nuovo slave, ricostruirne uno guasto:tutto ciò richiederà una sorta di trasferimento di dati tra nodi separati.

MySQL 8.0.17 ha introdotto un nuovo modo di eseguire il provisioning dei dati MySQL:il plug-in clone. Era inteso con MySQL Group Replication in mente per introdurre un modo per il provisioning automatico e la ricostruzione dei nodi guasti, ma la sua utilità non si limita a quell'area. Possiamo anche usarlo per ricostruire un nodo slave o eseguire il provisioning di un nuovo server. In questo post del blog vorremmo mostrarti come configurare il plugin MySQL Clone e come ricostruire uno slave di replica.

Prima di tutto, il plugin deve essere abilitato in quanto è disabilitato per impostazione predefinita. Una volta fatto, rimarrà abilitato durante i riavvii. Idealmente, lo farai su tutti i nodi nella topologia di replica.

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

Query OK, 0 rows affected (0.00 sec)

Il plug-in clone richiede all'utente MySQL i privilegi appropriati. Sul donatore deve avere il privilegio "BACKUP_ADMIN" mentre sul joiner deve avere il privilegio "CLONE_ADMIN". Supponendo che tu voglia utilizzare ampiamente il plug-in clone, puoi semplicemente creare un utente con entrambi i privilegi. Fallo sul master in modo che l'utente venga creato anche su tutti gli slave. Dopotutto, non sai mai quale nodo sarà un master in futuro, quindi è più conveniente avere tutto preparato in anticipo.

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)

Il plug-in MySQL Clone ha alcuni prerequisiti, quindi è necessario eseguire controlli di integrità. Dovresti assicurarti che sia il donatore che il partecipante abbiano gli stessi valori nelle seguenti variabili di configurazione:

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)

Quindi, sul master, dovremmo ricontrollare che i tablespace di annullamento abbiano nomi univoci:

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)

Il livello di dettaglio predefinito non mostra troppi dati relativi al processo di clonazione, pertanto consigliamo di aumentarlo per avere una visione migliore di ciò che sta accadendo:

mysql> SET GLOBAL log_error_verbosity=3;

Query OK, 0 rows affected (0.00 sec)

Per poter avviare il processo sul nostro joiner, dobbiamo configurare un donatore valido:

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 volta che è a posto, possiamo usarlo per copiare i dati da:

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

Query OK, 0 rows affected (18.30 sec)

Ecco fatto, i progressi possono essere monitorati nel registro degli errori MySQL sul joiner. Una volta che tutto è pronto, non devi fare altro che impostare la replica:

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)

Tieni presente che il plugin Clone ha una serie di limitazioni. Per cominciare, trasferisce solo tabelle InnoDB, quindi se ti capita di utilizzare altri motori di archiviazione, dovresti convertirli in InnoDB o utilizzare un altro metodo di provisioning. Interferisce anche con il linguaggio di definizione dei dati:gli ALTER si bloccheranno e verranno bloccati dalle operazioni di clonazione.

Per impostazione predefinita, la clonazione non è crittografata, quindi potrebbe essere utilizzata solo in un ambiente sicuro. Se necessario, puoi impostare la crittografia SSL per il processo di clonazione assicurandoti che il donatore abbia configurato SSL e quindi definire le seguenti variabili sul joiner:

clone_ssl_ca=/path/to/ca.pem

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

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

Quindi, devi aggiungere "RICHIEDI SSL;" al termine del comando CLONE e il processo verrà eseguito con crittografia SSL. Tieni presente che questo è l'unico metodo per clonare i database con la crittografia dei dati inattivi abilitata.

Come accennato all'inizio, la clonazione è stata, molto probabilmente, progettata pensando a MySQL Group Replication/InnoDB Cluster ma, purché le limitazioni non influiscano su casi d'uso particolari, può essere utilizzata come un modo nativo per eseguire il provisioning di qualsiasi istanza MySQL. Vedremo quanto ampia avrà l'adozione:le possibilità sono numerose. La cosa già fantastica è che ora abbiamo un altro metodo indipendente dall'hardware che possiamo utilizzare per eseguire il provisioning dei server oltre a Xtrabackup. La concorrenza è sempre buona e non vediamo l'ora di vedere cosa ci riserva il futuro.