Documentation Home
MySQL 8.0 参考手册  / 第 23 章 MySQL NDB Cluster 8.0  / 23.7 NDB 集群复制  /  21.7.8 使用 NDB Cluster 复制实现故障转移

21.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 MASTER TO排除此类时期的原因是,除了那些具有副本自己的服务器 ID 的行之外,表中的行的服务器 ID 与用于准备此副本源的语句的列表中 mysql.ndb_apply_status 的匹配 项也被认为来自本地服务器。您可以 从输出中检索此列表IGNORE_SERVER_IDSCHANGE MASTER TOReplicate_Ignore_Server_IdsSHOW SLAVE STATUS. 我们假设您已获得此列表并将其替换为 ignore_server_ids此处显示的查询,与之前版本的查询一样,将最大纪元选择到名为 的变量中 @latest

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

    在某些情况下,在 前面的查询条件中 使用要包含的服务器 ID 列表可能更简单或更有效(或两者兼而有之) 。server_id IN server_id_listWHERE

  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;

    这些是自主复制通道发生故障后保存在源上的记录。我们在这里使用了一个用户变量来表示在步骤1中获得的值。当然,一个mysqld实例@latest不可能直接访问在另一个服务器实例上设置的用户变量。这些值必须手动或通过应用程序 插入”到第二个查询。

    重要的

    您必须确保副本mysqld--slave-skip-errors=ddl_exist_errors 在执行之前 已启动 START SLAVE。否则,复制可能会因重复的 DDL 错误而停止。

  3. 现在可以通过在辅助副本服务器上运行以下查询来同步辅助通道:

    mysqlR'> 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 通常会尝试将字符串转换为数字,但这种情况是一个例外。

  4. 您现在可以通过在辅助副本 mysqld上发出适当的语句来启动辅助通道上的复制:

    mysqlR'> START SLAVE;

一旦辅助复制通道处于活动状态,您就可以调查主要故障和影响修复。执行此操作所需的精确操作取决于主通道失败的原因。

警告

仅当主复制通道发生故障时才启动辅助复制通道。同时运行多个复制通道可能会导致在副本上创建不需要的重复记录。

如果故障仅限于单个服务器,理论上应该可以从复制SR',或从 复制S'R