10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 从本手册中摘录

MySQL 8.0参考手册/....../ NDB集群复制:双向循环复制

23.6.10 NDB集群复制:双向循环复制

可以使用NDB集群在两个集群之间进行双向复制,以及任何数量的群集之间的循环复制。

循环复制示例。在接下来的文章中,我们考虑一个复制的例子设置涉及三个NDB集群编号1、2和3,在集群1充当集群复制源2、集群2充当集群源3,和集群3作为集群的源代码1。每个集群有两个SQL节点,SQL节点A和B属于集群1,SQL节点C和D属于集群2,SQL节点E和F属于集群3。

只要满足以下条件,就支持使用这些集群进行循环复制:

  • 所有源和副本上的SQL节点都是相同的。

  • 控件启动作为源和副本的所有SQL节点log_slave_updates系统变量启用。

这种类型的循环复制设置如下图所示:

图23.36所有源作为副本的NDB集群循环复制

一些内容在周围的文本中描述。该图显示了三个集群,每个集群有两个节点。连接不同集群中的SQL节点的箭头说明,所有源也是副本。

在这种情况下,Cluster 1中的SQL节点A在群集中复制到SQL节点C;SQL节点C在群集中复制到SQL节点E;SQL节点E复制到SQL节点A.换句话说,复制行(由图中的曲线指示)直接连接用作复制源和副本的所有SQL节点。

也可以通过这种方式设置循环复制,使并非所有源SQL节点都是副本,如下所示:

图23.37并非所有源都是副本的NDB集群循环复制

一些内容在周围的文本中描述。该图显示了三个集群,每个集群有两个节点。连接不同集群中的SQL节点的箭头说明并非所有源都是副本。

在这种情况下,每个群集中的不同SQL节点用作复制源和副本。你必须不是使用该系统启动任何SQL节点log_slave_updates系统变量启用。这种类型的NDB集群类型的循环复制方案,其中复制行(通过图中的弯曲箭头再次指示)是不连续的,但应该注意它尚未彻底测试,因此必须仍被认为是实验性的。

使用ndb本地备份和恢复来初始化副本集群。设置循环复制时,可以使用管理客户端初始化副本集群开始备份在一个NDB集群上命令创建备份,然后在另一个NDB群集上应用此备份ndb_restore.这不会自动在第二个NDB群集的SQL节点上创建二进制日志作为副本;要导致要创建的二进制日志,必须发出a显示表关于该SQL节点的语句;这应该在运行前完成开始副本|奴隶.这是一个众所周知的问题。

多源故障转移的例子。在本节中,我们在多源NDB群集复制设置中讨论故障转移,其中包含具有服务器ID 1,2和3的三个NDB群集。在此方案中,群集1重新复制到集群2和3;群集2还复制到群集3.此关系如图所示:

图23.38 NDB集群与3个源的多主复制

多源NDB集群复制设置,三个NDB集群拥有服务器id 1、2和3;集群1复制到集群2和集群3;集群2也复制到集群3。

换句话说,数据通过2种不同的路径从Cluster 1复制到Cluster 3:直接复制和通过Cluster 2复制。

并非所有占用多源复制的MySQL服务器都必须充当源和副本,并且给定的NDB群集可能使用不同的SQL节点进行不同的复制通道。此处显示了这种情况:

图23.39 NDB集群多源复制,使用MySQL服务器

概念在周围的文本中描述。显示三个节点:集群1中的SQL节点A复制到集群3中的SQL节点F;集群1中的SQL节点B复制到集群2中的SQL节点C;集群3中的SQL节点E复制到集群3中的SQL节点G。集群1中的SQL节点A和B有——log-slave-updates=0;集群2中的SQL节点C,以及集群3中的SQL节点F和G有——log-slave-updates=1;集群2中的SQL节点D和E有——log-slave-updates=0。

作为副本的MySQL服务器必须使用log_slave_updates系统变量启用。哪一个mysqld需要此选项的流程也显示在前面的图表中。

请注意

使用log_slave_updates系统变量对不作为副本运行的服务器没有影响。

当其中一个复制群集下降时,会出现对故障转移的需求。在此示例中,我们考虑群集1丢失到服务的情况,因此群集3从群集中失去了2个更新源。因为NDB集群之间的复制是异步的,因此无法保证群集3源自群集1的更新比通过群集收到的更近二。您可以通过确保群集3在群集中捕获到群集2的群集1来处理此问题。根据MySQL服务器,这意味着您需要复制来自MySQL的任何未完成的更新服务器C到服务器F.

在服务器c上,执行以下查询:

mysqlC> SELECT @latest:=MAX(epoch) -> FROM mysqlndb_apply_status -> WHERE server_id=1;mysqlC> SELECT -> @file:=SUBSTRING_INDEX(File, '/', -1), -> @pos:=Position -> FROM mysql。ndb_binlog_index-> WHERE orig_epoch >= @latest -> AND orig_server_id = 1 -> ORDER BY epoch ASC LIMIT 1;
请注意

属性中添加适当的索引,可以提高此查询的性能,从而可能显著加快故障转移时间ndb_binlog_index表格看到第23.6.4节“NDB集群复制架构和表”,以获取更多信息。

复制的值@file@pos从服务器C手动到服务器F(或让您的应用程序执行等效)。然后,在服务器f上,执行以下内容将复制源更改为语句(从MySQL 8.0.23)或改变大师声明(在MySQL 8.0.23之前):

MySQLF>更改大师到 - > master_host ='serverc' - > master_log_file ='@ file', - > master_log_pos = @ pos;或者来自MySQL 8.0.23:MySQLF>更改复制源到 - > source_host ='serverc' - > source_log_file ='@ file', - > source_log_pos = @ pos;

一旦完成了,你就可以发出一个开始副本|奴隶MySQL server F;这将导致任何来自服务器B的缺失更新被复制到服务器F。

将复制源更改为|改变大师语句也支持IGNORE_SERVER_IDS选项采用逗号分隔的服务器ID列表并导致源自相应服务器的事件被忽略。有关更多信息,请参阅第13.4.2.1节“更改大师致陈述”,第13.7.7.36节,“展示奴隶|副本状态声明“.有关此选项如何与之交换的信息ndb_log_apply_status变量,看到第23.6.8节,“使用NDB集群复制实现故障转移”