25.7.8 Реализация переключения при сбое репликации NDB 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 REPLICATION SOURCE TO, используемой для настройки этой реплики. Причина исключения таких эпох заключается в том, что строки в таблицеmysql.ndb_apply_status, идентификаторы серверов которых совпадают в спискеIGNORE_SERVER_IDSиз инструкцииCHANGE REPLICATION SOURCE TO, используемой для подготовки источника этой реплики, также считаются локальными серверами, в дополнение к серверу реплики. Вы можете получить этот список какReplicate_Ignore_Server_Idsиз вывода инструкцииSHOW REPLICA 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 запущена с
--replica-skip-errors=ddl_exist_errorsперед выполнениемSTART REPLICA. В противном случае репликация может остановиться с ошибками дублирования DDL. -
Теперь можно синхронизировать вторичный канал, выполнив следующий запрос на сервере вторичной реплики:
mysql
R'>CHANGE REPLICATION SOURCE TO->SOURCE_LOG_FILE='@file',->SOURCE_LOG_POS=@pos;Опять же, мы использовали переменные пользователей (в данном случае
@fileи@pos) для представления значений, полученных на шаге 2 и применённых на шаге 3; на практике эти значения должны быть вставлены вручную или с помощью приложения, имеющего доступ к обоим серверам.Примечание@file— это строковое значение, например,'/var/log/mysql/replication-source-bin.00001', поэтому его необходимо заключать в кавычки при использовании в SQL или коде приложения. Однако, значение, представляемое@pos, не должно быть заключено в кавычки. Хотя MySQL обычно пытается преобразовать строки в числа, в этом случае это исключение. -
Теперь вы можете запустить репликацию на вторичном канале, выполнив соответствующую команду на вторичном сервере реплики mysqld:
mysql
R'>START REPLICA;
После активации вторичного канала репликации, можно исследовать причину сбоя основного канала и выполнить необходимые исправления. Точные действия зависят от причин сбоя основного канала.
Вторичный канал репликации следует запускать только в случае сбоя основного канала репликации. Одновременный запуск нескольких каналов репликации может привести к созданию нежелательных дубликатов записей на репликах.
Если сбой ограничен одним сервером, в теории возможно выполнять репликацию с S на R' или с S' на R.
© 2025 Oracle
Licensed under the GPLv2 License.