Spec-Zone.ru › MySQL 9.2

25.7.8 Реализация переключения при сбое репликации NDB Cluster

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

  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-9.2-en/mysql-cluster-replication-failover.html

Spec-Zone.ru

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