Как мастер MariaDB может получить транзакции от другого мастера после восстановления резервной копии?

Я установил репликацию Master-Master с MariaDB 10.3.11 с включенными GTID и master_use_gtid=Slave_Pos, Два хоста (master1 и master2) имеют разные идентификаторы доменов и разные идентификаторы сервера. Резервное копирование настроено на master2.

Теперь у меня есть ситуация, когда репликация становится непоследовательной, когда я восстанавливаю master2 из ее резервной копии, если после создания резервной копии были транзакции на master2. Транзакция между получением резервной копии и ее восстановлением теряется на master2, хотя GTID говорит мне об обратном. Интересно, может ли master2 каким-то образом получить их от master1, что на самом деле было моим пониманием концепции GTID: ведомый сообщает мастеру локально известные GTID и возвращает недостающие группы событий. Однако мне это не удалось. я думал log_slave_updates=ON может сделать трюк.

Фактическим фоном является разработка надежного сценария резервного копирования и восстановления.

Кто-нибудь может помочь решить проблему использования резервного копирования / восстановления правильно?

В деталях:

Оба сервера БД настроены, и репликация находится в согласованном состоянии.

Теперь я создаю резервную копию на master2, используя mariabackup:

mariabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --slave-info --safe-slave-backup --safe-slave-backup-timeout=120 --history --kill-long-queries-timeout=60 --kill-long-query-type=all --target-dir $TARGET_FOLDER

Допустим, резервная копия содержит GTID 1-1-216,2-2-25 (как прочитано из xtrabackup_binlog_info).

Выполните несколько операторов вставки на master2.

Теперь у меня есть согласованный набор GTID для обоих мастеров:

master1> select @@gtid_binlog_pos, @@gtid_current_pos, @@gtid_slave_pos;
+-------------------+--------------------+------------------+
| @@gtid_binlog_pos | @@gtid_current_pos | @@gtid_slave_pos |
+-------------------+--------------------+------------------+
| 1-1-217,2-2-29    | 1-1-217,2-2-29     | 1-1-217,2-2-29   |
+-------------------+--------------------+------------------+

master2> select @@gtid_binlog_pos, @@gtid_current_pos, @@gtid_slave_pos;
+-------------------+--------------------+------------------+
| @@gtid_binlog_pos | @@gtid_current_pos | @@gtid_slave_pos |
+-------------------+--------------------+------------------+
| 1-1-217,2-2-29    | 1-1-217,2-2-29     | 1-1-217,2-2-29   |
+-------------------+--------------------+------------------+

В фиктивном сценарии я симулирую полный крах master2 и удаляю /var/lib/mysql, зная, что у меня есть резервная копия.

Итак, я восстановил свою резервную копию:

mariabackup --copy-back --target-dir $backupFolder && chown -R mysql:mysql $mysqlDataDir

Сбросьте ведомое устройство, установите GTID, известные в резервной копии, и перезапустите репликацию:

mysql -u$mysqlSuperUser --password="$mysqlSuperPassword" -e "RESET SLAVE;"
SET GLOBAL gtid_slave_pos = '1-1-216,2-2-25';
change master to master_host='master1', master_user='replication_user', 
master_password='bigs3cret', master_use_gtid=Slave_Pos;
START SLAVE;

Сейчас show slave status\G говорит мне, что у меня запущенная репликация. Когда я сравниваю GTID, у меня складывается впечатление, что оба сервера должны иметь одинаковое состояние:

master1> select @@gtid_binlog_pos, @@gtid_current_pos, @@gtid_slave_pos;
+-------------------+--------------------+------------------+
| @@gtid_binlog_pos | @@gtid_current_pos | @@gtid_slave_pos |
+-------------------+--------------------+------------------+
| 1-1-217,2-2-29    | 1-1-217,2-2-29     | 1-1-217,2-2-29   |
+-------------------+--------------------+------------------+

master2> select @@gtid_binlog_pos, @@gtid_current_pos, @@gtid_slave_pos;
+-------------------+--------------------+------------------+
| @@gtid_binlog_pos | @@gtid_current_pos | @@gtid_slave_pos |
+-------------------+--------------------+------------------+
| 1-1-217           | 1-1-217,2-2-29     | 1-1-217,2-2-29   |
+-------------------+--------------------+------------------+

Однако транзакции, которые я выполнил между резервным копированием и восстановлением, потеряны.

Как это можно решить? Спасибо за любую помощь.

Конфигурация master1:

[mariadb]
log-bin
server_id=1
log-basename=master1
gtid-domain-id=1
binlog_format                  = ROW
log_slave_updates=ON
relay_log_recovery=ON
relay_log_info_repository=TABLE
master_info_repository=TABLE
slave_exec_mode=IDEMPOTENT
auto-increment-increment = 2 
auto-increment-offset = 1

Конфигурация master2:

[mariadb]
log-bin
server_id=2
log-basename=sdc1-lx-maria2
gtid-domain-id=2
binlog_format                  = ROW
log_slave_updates=ON
relay_log_recovery=ON
relay_log_info_repository=TABLE
master_info_repository=TABLE
slave_exec_mode=IDEMPOTENT
auto-increment-increment = 2 
auto-increment-offset = 2

0 ответов

Другие вопросы по тегам