Mysql
 sql >> база данни >  >> RDS >> Mysql

Мигрирайте от традиционна репликация към GTID

В тази статия ще разгледаме мигрирането от традиционна репликация към GTID,

ще обсъдим как да го направим напълно онлайн. Първо, нека обсъдим някои опции за конфигурация, свързани с GTID. Режимът на GTID определя дали сървърът използва GTID или не, това засяга не само двоичното влизане на репликация, тъй като двоичните регистрационни файлове ще имат GTID в тях. Опцията за прилагане на GTID последователност гарантира, че сървърът позволява само изрази, които са безопасни за изпълнение в GTID режим. Изявленията, които не са безопасни за изпълнение, са като създаване на таблица като избрано, има още няколко, най-вече наоколо, за gtid_owned ценното, те могат да наблюдават GTID при транзакции по време на полет. Това е много полезно, когато изключват GTID онлайн.

Нека обсъдим някои и по-точно, това е само една свързана с GTID променлива на състоянието. ONGOING_ANONYMOUS_TRANSACTION_ COUNT е аналогът на притежавания GTID, но в случай на миграция, като за ONGOING_ANONYMOUS_TRANSACTION_COUNT, се нарича анонимна транзакция, защото няма идентификатор, който е GTID.

Всички операции трябва да се извършват на един от възлите в топологията на репликация и евентуално на всички възли. Най-добрата практика е първо да се направи подчинен и главен, но в случай на много операции редът всъщност няма значение, стига те да се изпълняват във всеки екземпляр от топологията на репликация.

В тази среда имам три виртуални машини, две от които са бази данни и една от тях е sysbench машина за генериране на трафик, така че нека започнем.

Главен:192.168.66.5

Подчинен:  192.168.66.7

На възела sysbench нека изпълним подготвената команда за създаване на база данни на sysbench, можете просто да я копирате и поставите отдолу.

sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password= password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
/usr/share/sysbench/oltp_read_write.lua prepare

На възела sysbench изпълнява известно натоварване срещу главния, който изпълнявахме по време на изпълнението на задачата.

sysbench \
--db-driver=mysql \
--mysql-user=sbtest_user \
--mysql_password=password \
--mysql-db=sbtest \
--mysql-host=192.168.66.5 \
--mysql-port=3306 \
--tables=16 \
--table-size=10000 \
--threads=4 \
--time=0 \
--events=0 \
--rate=10 \
--report-interval=1 \
/usr/share/sysbench/oltp_read_write.lua run

Нека стартираме MySQL клиент на всички възли, всички възли на базата данни. Нека проверим списъка с показване на процесите на главния, за да можете да видите, че това се изпълнява тук.

mysql> show processlist;
+----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User            | Host               | db     | Command     | Time | State                                                         | Info             |
+----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
|  5 | event_scheduler | localhost          | NULL   | Daemon      | 2350 | Waiting on empty queue                                        | NULL             |
|  8 | root            | localhost          | sbtest | Query       |    0 | starting                                                      | show processlist |
| 15 | syncstndby      | 192.168.66.7:47894 | NULL   | Binlog Dump |  156 | Master has sent all binlog to slave; waiting for more updates | NULL             |
| 17 | sbtest_user     | 192.168.66.6:38130 | sbtest | Sleep       |    0 |                                                               | NULL             |
| 18 | sbtest_user     | 192.168.66.6:38132 | sbtest | Sleep       |    1 |                                                               | NULL             |
| 19 | sbtest_user     | 192.168.66.6:38134 | sbtest | Sleep       |    0 |                                                               | NULL             |
| 20 | sbtest_user     | 192.168.66.6:38136 | sbtest | Sleep       |    0 |                                                               | NULL             |
+----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
7 rows in set (0.00 sec)

Добре, оттук нататък ще работим първо с мехлема и майстора.

Така че първо ще зададем enforce_gtid_consistency =‘предупреждение’ на подчинен, на подчинен главен.

Slave 192.168.66.7

set global enforce_gtid_consistency = 'warn';

Master 192.168.66.5

set global enforce_gtid_consistency = 'warn';

приключихме тук и ще проверим грешката в MySQL, вижте регистъра на грешките, това трябва да е добре; няма да видите грешка в регистъра на грешките. Следващите стъпки е да стартирате set global enforce_gtid_consistency=’on’ навсякъде и след това да проверите отново стрелката.

Slave 192.168.66.7

set global enforce_gtid_consistency='on';

Master 192.168.66.5

set global enforce_gtid_consistency='on';

И така, следващата стъпка е задаване на глобален gtid_mode=’off_permissive’; така че отново ще стартирам MySQL клиента и ще го настроя. След това проверяваме регистъра на грешките

Slave 192.168.66.7

set global gtid_mode='off_permissive';

Главен  192.168.66.5

set global gtid_mode='off_permissive';

На всеки сървър ще зададем gtid_mode=’on_permissive’; така че да генерираме GTID транзакции в този момент.

Slave 192.168.66.7

set global gtid_mode='on_permissive';

Главен  192.168.66.5

set global gtid_mode='on_permissive';

Така че е настроен навсякъде. Нека проверим регистрационните файлове за грешки

Добре, така че сега ще проверим дали някой от възлите има текущи анонимни транзакции, защото ако има, тогава, когато зададем gtid_mode=’on’, сървърът вече не приема анонимни транзакции и ще получаваме грешки.

Slave 192.168.66.7

mysql> show status like 'ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0     |
+-------------------------------------+-------+
1 row in set (0.22 sec)

Master 192.168.66.5

mysql> show status like 'ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0     |
+-------------------------------------+-------+
1 row in set (0.04 sec)

Така че и двата сървъра нямат, което означава, че сме готови да включим GTID. Ще активирам gtid_mode =on.

Master 192.168.66.5

mysql> set global gtid_mode='on';

Query OK, 0 rows affected (0.03 sec)

Slave 192.168.66.7

mysql> set global gtid_mode='on';

Query OK, 0 rows affected (0.03 sec)

Сега на подчинените трябва да инициализираме повторно репликацията, за да използваме master-auto-position=1

Slave 192.168.66.7

stop slave;
change master to master_auto_position=1;
start slave;

И така, какво прави това, този „главен за промяна“ тук, ако нишката за спасяване вече е конфигурирана, тогава ако някой параметър не бъде докоснат от командата change master, той просто ще бъде оставен на текущата стойност.

Нека проверим показване на състоянието на подчинените на подчинените и показване на състоянието на главната на главната. всичко би трябвало да работи добре.

mysql> show salve status\G;

mysql> show master status;

Сега миграцията е извършена:

Тъй като знаем, че надстройката не е успешна, ако нямате план за връщане назад, моля, щракнете върху връзката по-долу, за да прочетете следващата статия.

Върнете се към традиционната репликация от GTID


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се свържа с MySQL на Amazon EC2 от Linux / Mac?

  2. Как да предоставим всички привилегии на root потребител в MySQL 8.0

  3. Импортирайте SQL файл в mysql

  4. MySQL еквивалент на функцията DECODE в Oracle

  5. Грешка в MySql 150 - Външни ключове