如果主集群复制进程发生故障,则可以切换到辅助复制通道。以下步骤介绍了实现此切换所需的步骤。
获取最新的全局检查点 (GCP) 时间。也就是说,您需要从副本集群上的
ndb_apply_status
表中确定最新的纪元,可以使用以下查询找到它mysqlR'> SELECT @latest:=MAX(epoch) -> FROM mysql.ndb_apply_status;
在循环复制拓扑中,当您使用
ndb_log_apply_status=1
时,源和副本在每个主机上运行,NDB Cluster 纪元会写入副本的二进制日志。这意味着ndb_apply_status
表包含有关此主机上副本的信息,以及有关任何其他主机的信息,这些主机充当在此主机上运行的复制源服务器的副本。在这种情况下,您需要确定此副本的最新纪元,排除此副本二进制日志中任何其他副本的纪元,这些纪元未列在用于设置此副本的
CHANGE REPLICATION SOURCE TO
语句的IGNORE_SERVER_IDS
选项中。排除此类纪元的原因是,如果mysql.ndb_apply_status
表中的行在其服务器 ID 在用于准备此副本的源的CHANGE REPLICATION SOURCE TO
语句的IGNORE_SERVER_IDS
列表中存在匹配,则除了拥有副本自己的服务器 ID 之外,这些行还被认为来自本地服务器。您可以从SHOW REPLICA STATUS
的输出中检索此列表作为Replicate_Ignore_Server_Ids
。我们假设您已获得此列表,并将其替换为此处显示的查询中的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_list
WHERE
条件中可能更简单或更高效(或两者兼而有之)。使用从步骤 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 实例无法直接访问在另一个服务器实例上设置的用户变量。这些值必须通过手动或通过应用程序 “插入” 到第二个查询中。重要在执行
START REPLICA
之前,必须确保副本 mysqld 启动时带有--replica-skip-errors=ddl_exist_errors
。否则,复制可能会因重复 DDL 错误而停止。现在,可以通过在辅助副本服务器上运行以下查询来同步辅助通道
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 通常会尝试将字符串转换为数字,但本例是一个例外。您现在可以通过在辅助副本 mysqld 上发出适当的命令来启动辅助通道上的复制
mysqlR'> START REPLICA;
辅助复制通道激活后,您可以调查主通道的故障并进行修复。所需的确切操作取决于主通道故障的原因。
仅当主复制通道发生故障时,才应启动辅助复制通道。同时运行多个复制通道会导致副本上创建不必要的重复记录。
如果故障仅限于单个服务器,理论上应该可以从 S
到 R'
复制,或者从 S'
到 R
复制。