Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Odbudowa niewolnika replikacji MySQL 8.0 za pomocą wtyczki do klonowania

Dzięki MySQL 8.0 firma Oracle przyjęła nowe podejście do rozwoju. Zamiast wypychania funkcji z głównymi wersjami, prawie każda mniejsza wersja MySQL 8.0 zawiera nowe funkcje lub ulepszenia. Jedną z tych nowych funkcji jest to, na czym chcielibyśmy się skupić w tym poście na blogu.

Historycznie MySQL nie zawierał dobrych narzędzi do udostępniania. Jasne, miałeś mysqldump, ale jest to tylko logiczne narzędzie do tworzenia kopii zapasowych, które nie jest odpowiednie dla większych środowisk. Użytkownicy MySQL Enterprise mogą korzystać z MySQL Enterprise Backup, podczas gdy użytkownicy społeczności mogą korzystać z xtrabackup. Żaden z nich nie został jednak dostarczony z czystymi wdrożeniami społeczności MySQL. Było to dość denerwujące, ponieważ udostępnianie to zadanie, które wykonujesz dość często. Może zajść potrzeba zbudowania nowego urządzenia podrzędnego, odbudowania uszkodzonego - wszystko to będzie wymagało pewnego rodzaju transferu danych między oddzielnymi węzłami.

MySQL 8.0.17 wprowadził nowy sposób udostępniania danych MySQL - wtyczkę klonującą. Został on pomyślany z myślą o MySQL Group Replication, aby wprowadzić sposób automatycznego przydzielania i odbudowy uszkodzonych węzłów, ale jego użyteczność nie ogranicza się do tego obszaru. Równie dobrze możemy go użyć do odbudowania węzła podrzędnego lub udostępnienia nowego serwera. W tym poście na blogu chcielibyśmy pokazać, jak skonfigurować wtyczkę MySQL Clone i jak odbudować niewolnika replikacji.

Przede wszystkim wtyczka musi być włączona, ponieważ jest domyślnie wyłączona. Gdy to zrobisz, pozostanie włączony przez ponowne uruchomienie. Idealnie zrobisz to na wszystkich węzłach w topologii replikacji.

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

Query OK, 0 rows affected (0.00 sec)

Wtyczka Clone wymaga użytkownika MySQL z odpowiednimi uprawnieniami. Na dawcy musi mieć uprawnienie „BACKUP_ADMIN”, podczas gdy na dołączającym musi mieć uprawnienie „CLONE_ADMIN”. Zakładając, że chcesz intensywnie korzystać z wtyczki klonowania, możesz po prostu utworzyć użytkownika z obydwoma uprawnieniami. Zrób to na urządzeniu głównym, aby użytkownik został utworzony również na wszystkich urządzeniach podrzędnych. W końcu nigdy nie wiadomo, który węzeł będzie masterem w przyszłości, dlatego wygodniej jest mieć wszystko przygotowane z góry.

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)

Wtyczka MySQL Clone ma pewne wymagania wstępne, dlatego należy przeprowadzić kontrolę poprawności. Powinieneś upewnić się, że zarówno dawca, jak i łącznik będą mieć te same wartości w następujących zmiennych konfiguracyjnych:

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)

Następnie na wzorcu powinniśmy dokładnie sprawdzić, czy obszary tabel cofania mają unikalne nazwy:

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)

Domyślny poziom szczegółowości nie pokazuje zbyt wielu danych dotyczących procesu klonowania, dlatego zalecamy jego zwiększenie, aby mieć lepszy wgląd w to, co się dzieje:

mysql> SET GLOBAL log_error_verbosity=3;

Query OK, 0 rows affected (0.00 sec)

Aby móc rozpocząć proces na naszym dołączającym, musimy skonfigurować prawidłowego dawcę:

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)

Gdy jest już na miejscu, możemy go użyć do skopiowania danych z:

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

Query OK, 0 rows affected (18.30 sec)

To wszystko, postęp można śledzić w dzienniku błędów MySQL na dołączającym. Gdy wszystko będzie gotowe, wszystko, co musisz zrobić, to skonfigurować replikację:

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)

Pamiętaj, że wtyczka Clone zawiera zestaw ograniczeń. Na początek przesyła tylko tabele InnoDB, więc jeśli zdarzy ci się użyć innych silników pamięci masowej, będziesz musiał przekonwertować je na InnoDB lub użyć innej metody udostępniania. Koliduje również z językiem definicji danych - ALTER będą blokowane i blokowane przez operacje klonowania.

Domyślnie klonowanie nie jest szyfrowane, więc może być używane tylko w bezpiecznym środowisku. W razie potrzeby możesz skonfigurować szyfrowanie SSL dla procesu klonowania, upewniając się, że dawca ma skonfigurowany SSL, a następnie zdefiniuj następujące zmienne w dołączającym:

clone_ssl_ca=/path/to/ca.pem

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

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

Następnie musisz dodać „REQUIRE SSL;” na końcu polecenia CLONE, a proces zostanie wykonany z szyfrowaniem SSL. Pamiętaj, że jest to jedyna metoda klonowania baz danych z włączonym szyfrowaniem danych w spoczynku.

Jak wspomnieliśmy na początku, klonowanie zostało najprawdopodobniej zaprojektowane z myślą o MySQL Group Replication/InnoDB Cluster, ale o ile ograniczenia nie dotyczą konkretnego przypadku użycia, może być używane jako natywny sposób udostępniania dowolnej instancji MySQL. Zobaczymy, jak szerokie będzie zastosowanie - możliwości jest wiele. Wspaniałe jest to, że mamy teraz inną metodę niezależną od sprzętu, której możemy użyć do udostępniania serwerów oprócz Xtrabackup. Konkurencja jest zawsze dobra i nie możemy się doczekać, aby zobaczyć, co przyniesie przyszłość.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak znaleźć wszystkie tabele, które mają klucze obce, które odwołują się do konkretnej table.column i mają wartości dla tych kluczy obcych?

  2. Przyznaj uprawnienia użytkownikowi MySQL w systemie Linux za pomocą wiersza poleceń

  3. Czy MySQL łamie standard, pozwalając na wybieranie kolumn, które nie są częścią klauzuli group by?

  4. Przewodnik po projektowaniu bazy danych dla systemu sieci społecznościowych w MySQL

  5. 'IF' w instrukcji 'SELECT' - wybierz wartość wyjściową na podstawie wartości kolumn