Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Neuerstellung eines MySQL 8.0-Replikations-Slaves mit einem Clone-Plugin

Mit MySQL 8.0 hat Oracle einen neuen Entwicklungsansatz gewählt. Anstatt Funktionen mit Hauptversionen zu pushen, enthält fast jede kleinere Version von MySQL 8.0 neue Funktionen oder Verbesserungen. Auf eine dieser neuen Funktionen möchten wir uns in diesem Blogbeitrag konzentrieren.

In der Vergangenheit war MySQL nicht mit guten Tools für die Bereitstellung ausgestattet. Sicher, Sie hatten mysqldump, aber es ist nur ein logisches Backup-Tool, nicht wirklich geeignet für größere Umgebungen. MySQL-Unternehmensbenutzer könnten von MySQL Enterprise Backup profitieren, während Community-Benutzer xtrabackup verwenden könnten. Keines davon kam jedoch mit einer sauberen MySQL Community-Bereitstellung. Es war ziemlich ärgerlich, da die Bereitstellung eine Aufgabe ist, die Sie ziemlich oft erledigen. Möglicherweise müssen Sie einen neuen Slave erstellen oder einen ausgefallenen wiederherstellen – all dies erfordert eine Art Datenübertragung zwischen separaten Knoten.

MySQL 8.0.17 hat eine neue Art der Bereitstellung von MySQL-Daten eingeführt - das Clone-Plugin. Es war im Hinblick auf die MySQL-Gruppenreplikation beabsichtigt, eine Methode zur automatischen Bereitstellung und Wiederherstellung ausgefallener Knoten einzuführen, aber seine Nützlichkeit ist nicht auf diesen Bereich beschränkt. Wir können es auch verwenden, um einen Slave-Knoten neu aufzubauen oder einen neuen Server bereitzustellen. In diesem Blogbeitrag möchten wir Ihnen zeigen, wie Sie das MySQL Clone-Plugin einrichten und einen Replikations-Slave neu erstellen.

Zunächst muss das Plugin aktiviert werden, da es standardmäßig deaktiviert ist. Sobald Sie dies tun, bleibt es durch Neustarts aktiviert. Idealerweise tun Sie dies auf allen Knoten in der Replikationstopologie.

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

Query OK, 0 rows affected (0.00 sec)

Clone-Plugin erfordert einen MySQL-Benutzer mit entsprechenden Rechten. Auf dem Spender muss es das „BACKUP_ADMIN“-Privileg haben, während es auf dem Joiner das „CLONE_ADMIN“-Privileg haben muss. Angenommen, Sie möchten das Clone-Plugin ausgiebig verwenden, können Sie einfach Benutzer mit beiden Rechten erstellen. Tun Sie dies auf dem Master, damit der Benutzer auch auf allen Slaves erstellt wird. Schließlich wissen Sie nie, welcher Knoten irgendwann in der Zukunft ein Master sein wird, daher ist es bequemer, alles im Voraus vorzubereiten.

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)

Das MySQL Clone-Plug-in hat einige Voraussetzungen, daher sollten Plausibilitätsprüfungen durchgeführt werden. Sie sollten sicherstellen, dass Spender und Joiner die gleichen Werte in den folgenden Konfigurationsvariablen haben:

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)

Dann sollten wir auf dem Master noch einmal überprüfen, ob Undo-Tablespaces eindeutige Namen haben:

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)

Die standardmäßige Ausführlichkeitsstufe zeigt nicht zu viele Daten zum Klonprozess an, daher empfehlen wir, sie zu erhöhen, um einen besseren Einblick in das Geschehen zu erhalten:

mysql> SET GLOBAL log_error_verbosity=3;

Query OK, 0 rows affected (0.00 sec)

Um den Prozess auf unserem Joiner starten zu können, müssen wir einen gültigen Spender konfigurieren:

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)

Sobald es vorhanden ist, können wir es verwenden, um die Daten zu kopieren von:

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

Query OK, 0 rows affected (18.30 sec)

Fertig, der Fortschritt kann im MySQL-Fehlerprotokoll auf dem Joiner nachverfolgt werden. Sobald alles fertig ist, müssen Sie nur noch die Replikation einrichten:

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)

Bitte denken Sie daran, dass das Clone-Plugin mit einer Reihe von Einschränkungen verbunden ist. Für den Anfang werden nur InnoDB-Tabellen übertragen. Wenn Sie also andere Speicher-Engines verwenden, müssen Sie diese entweder in InnoDB konvertieren oder eine andere Bereitstellungsmethode verwenden. Es stört auch die Data Definition Language - ALTERs werden blockiert und durch Klonvorgänge blockiert.

Standardmäßig ist das Klonen nicht verschlüsselt, sodass es nur in einer sicheren Umgebung verwendet werden kann. Bei Bedarf können Sie die SSL-Verschlüsselung für den Klonprozess einrichten, indem Sie sicherstellen, dass der Spender SSL konfiguriert hat, und dann die folgenden Variablen auf dem Joiner definieren:

clone_ssl_ca=/path/to/ca.pem

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

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

Dann müssen Sie „REQUIRE SSL;“ hinzufügen. am Ende des CLONE-Befehls und der Prozess wird mit SSL-Verschlüsselung ausgeführt. Bitte beachten Sie, dass dies die einzige Methode zum Klonen von Datenbanken mit aktivierter Data-at-Rest-Verschlüsselung ist.

Wie wir eingangs erwähnt haben, wurde das Klonen höchstwahrscheinlich mit Blick auf die MySQL-Gruppenreplikation/InnoDB-Cluster entwickelt, aber solange die Einschränkungen keinen bestimmten Anwendungsfall betreffen, kann es so verwendet werden eine native Methode zur Bereitstellung beliebiger MySQL-Instanzen. Wir werden sehen, wie breit es angenommen wird – die Möglichkeiten sind zahlreich. Was bereits großartig ist, ist, dass wir jetzt eine weitere hardwareunabhängige Methode haben, die wir verwenden können, um Server zusätzlich zu Xtrabackup bereitzustellen. Wettbewerb ist immer gut und wir freuen uns auf die Zukunft.