Как мастер 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