Spec-Zone.ru › MySQL 8.4

25.7.8 Реализация резервного копирования с NDB Cluster Replication

В случае сбоя основного процесса репликации кластера можно переключиться на вторичный канал репликации. Следующая процедура описывает шаги, необходимые для этого.

  1. Получите время последней глобальной контрольной точки (GCP). То есть вам необходимо определить последнюю эпоху из таблицы ndb_apply_status в кластере реплик, что можно сделать с помощью следующего запроса:

    mysqlR'> 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:

    mysqlR'> SELECT @latest:=MAX(epoch)
          ->        FROM mysql.ndb_apply_status
          ->        WHERE server_id NOT IN (ignore_server_ids);
    

    В некоторых случаях может быть проще или эффективнее (или то и другое) использовать список идентификаторов серверов, которые нужно включить, и server_id IN server_id_list в условии WHERE предыдущего запроса.

  2. Используя информацию, полученную из запроса, показанного в шаге 1, получите соответствующие записи из таблицы ndb_binlog_index на источниковом кластере.

    Для получения необходимых записей из таблицы ndb_binlog_index на источнике можно использовать следующий запрос:

    mysqlS'> 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.

  3. Теперь можно синхронизировать вторичный канал, выполнив следующий запрос на вторичном сервере реплики:

    mysqlR'> 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 обычно пытается преобразовать строки в числа, в этом случае это исключение.

  4. Теперь можно запустить репликацию по вторичному каналу, выполнив соответствующую команду на вторичном реплицируемом mysqld:

    mysqlR'> START REPLICA;
    

После активации вторичного канала репликации можно исследовать причину сбоя основного канала и выполнить необходимые исправления. Точные действия зависят от причины сбоя основного канала.

Предупреждение

Вторичный канал репликации следует запускать только в случае и при условии сбоя основного канала репликации. Одновременный запуск нескольких каналов репликации может привести к созданию нежелательных дублирующих записей на репликах.

Если сбой ограничен одним сервером, теоретически должно быть возможно копировать с S на R' или с S' на R.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/mysql-cluster-replication-failover.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API