21.7.8 Реализация переключения при сбое репликации NDB Cluster
В случае сбоя первичного процесса репликации Cluster можно переключиться на вторичный канал репликации. Следующая процедура описывает шаги, необходимые для этого.
-
Получите время последней глобальной контрольной точки (GCP). То есть, вам необходимо определить последнее значение эпохи из таблицы
ndb_apply_statusна кластере реплик, что можно сделать с помощью следующего запроса:mysql
R'>SELECT @latest:=MAX(epoch)->FROM mysql.ndb_apply_status;В топологии циклической репликации, с источником и репликой, работающими на каждом узле, при использовании
ndb_log_apply_status=1, эпохи NDB Cluster записываются в бинарные логи реплик. Это означает, что таблицаndb_apply_statusсодержит информацию для реплики на этом узле, а также для любого другого узла, который выступает в качестве реплики сервера источника репликации, работающего на этом узле.В этом случае вам необходимо определить последнюю эпоху на этой реплике, исключая любые эпохи от других реплик в бинарном логе этой реплики, которые не были перечислены в параметрах
IGNORE_SERVER_IDSв инструкцииCHANGE MASTER TO, используемой для настройки этой реплики. Причина исключения таких эпох заключается в том, что строки в таблицеmysql.ndb_apply_status, идентификаторы серверов которых совпадают в спискеIGNORE_SERVER_IDSиз инструкцииCHANGE MASTER TO, используемой для подготовки источника этой реплики, также считаются исходящими от локальных серверов, помимо тех, у которых указан идентификатор собственного сервера реплики. Этот список можно получить какReplicate_Ignore_Server_Idsиз выводаSHOW SLAVE STATUS. Предполагается, что вы получили этот список и подставили его вместоignore_server_idsв представленном запросе, который, как и предыдущая версия запроса, выбирает наибольшую эпоху в переменную, названную@latest:mysql
R'>SELECT @latest:=MAX(epoch)->FROM mysql.ndb_apply_status->WHERE server_id NOT IN (ignore_server_ids);В некоторых случаях использование списка идентификаторов серверов для включения и
server_id INв условииserver_id_listWHEREпредыдущего запроса может быть проще или эффективнее (или и то, и другое). -
Используя информацию, полученную из запроса, показанного в шаге 1, получите соответствующие записи из таблицы
ndb_binlog_indexна кластере источника.Вы можете использовать следующий запрос для получения необходимых записей из таблицы
ndb_binlog_indexна источнике:mysql
S'>SELECT->@file:=SUBSTRING_INDEX(next_file, '/', -1),->@pos:=next_position->FROM mysql.ndb_binlog_index->WHERE epoch = @latest;Это записи, сохранённые на источнике с момента сбоя первичного канала репликации. Здесь используется пользовательская переменная
@latestдля представления значения, полученного на шаге 1. Конечно, один экземпляр mysqld не может напрямую получить доступ к пользовательским переменным, установленным на другом экземпляре сервера. Эти значения должны быть “вставлены” во второй запрос вручную или с помощью приложения.ВажноНеобходимо убедиться, что реплика mysqld запущена с
--slave-skip-errors=ddl_exist_errorsперед выполнениемSTART SLAVE. В противном случае репликация может остановиться с ошибками дублирования DDL. -
Теперь можно синхронизировать вторичный канал, выполнив следующий запрос на сервере вторичной реплики:
mysql
R'>CHANGE MASTER TO->MASTER_LOG_FILE='@file',->MASTER_LOG_POS=@pos;Здесь также используются пользовательские переменные (в данном случае
@fileи@pos) для представления значений, полученных на шаге 2 и применённых на шаге 3; на практике эти значения должны быть вставлены вручную или с помощью приложения, имеющего доступ к обоим серверам.Примечание@fileимеет строковое значение, такое как'/var/log/mysql/replication-source-bin.00001', и поэтому должно быть заключено в кавычки при использовании в SQL или коде приложения. Однако значение, представленное@pos, не должно быть заключено в кавычки. Хотя MySQL обычно пытается преобразовать строки в числа, в этом случае это исключение. -
Теперь можно инициировать репликацию по вторичному каналу, выдав соответствующую инструкцию на вторичном сервере реплики mysqld:
mysql
R'>START SLAVE;
После активации вторичного канала репликации можно исследовать причину сбоя первичного канала и произвести ремонт. Точные действия зависят от причин сбоя первичного канала.
Вторичный канал репликации следует запускать только тогда, когда первичный канал репликации вышел из строя. Одновременный запуск нескольких каналов репликации может привести к созданию нежелательных дубликатов записей на репликах.
Если сбой ограничен одним сервером, теоретически должно быть возможно выполнить репликацию от S до R' или от S' до R.
© 2025 Oracle
Licensed under the GPLv2 License.