25.7.8 Реализация резервного копирования с NDB Cluster Replication
В случае сбоя основного процесса репликации кластера можно переключиться на вторичный канал репликации. Следующая процедура описывает шаги, необходимые для этого.
-
Получите время последней глобальной контрольной точки (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.