MySQL集群NDB 8.0/NDB集群复制/ NDB集群复制:双向和循环复制

7.10 NDB集群复制:双向和循环复制

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

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

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

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

  • 所有SQL节点作为源和副本开始与系统变量log_replica_updates(从MySQL 8.0.26)或log_slave_updates启用(MySQL 8.0.26之前)。

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

图7.6 NDB集群循环与所有来源复制副本

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

在这个场景中,SQL节点在集群1复制到SQL节点在集群2 C;SQL节点集群3 C复制到SQL节点E;SQL复制节点E SQL节点a。换句话说,复制行(弯曲的箭头在图中所示)直接连接所有SQL节点用作复制源和副本。

还可以设置循环复制以这样一种方式,并不是所有SQL源节点也是复制品,如下所示:

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

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

在这种情况下,不同的SQL节点在每个集群用作复制源和副本。你必须开始的任何SQL节点与系统变量log_replica_updates(从MySQL 8.0.26)或log_slave_updates启用(MySQL 8.0.26之前)。这种类型的循环复制方案NDB集群,复制的行(同样由弯曲的箭头在图中显示)是不连续的,应该是有可能的,但应该注意的是,它还没有彻底测试,因此还必须考虑实验。

使用NDB-native备份和恢复初始化一个集群复制。当设置循环复制,可以初始化复制集群通过管理客户端开始备份命令在一个NDB集群应用此备份创建一个备份,然后在另一个NDB集群使用ndb_restore。这并不自动创建二进制日志第二NDB集群的SQL节点作为副本;为了使创建二进制日志,你必须发出显示表声明的SQL节点;这应该是运行之前完成开始复制。这是一个已知的问题。

多源故障转移的例子。在本节中,我们讨论在多源NDB故障转移集群复制设置有三个NDB集群服务器id 1, 2, 3。在这种情况下,集群1复制到集群2和3;集群2也复制到集群3。这种关系如图所示:

图7.8 NDB集群多主机复制3来源

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

换句话说,从集群1到集群复制的数据通过两个不同路线3:直接,通过集群2。

并不是所有MySQL服务器参与多源复制必须作为源和复制品,和给定NDB集群可能使用不同的SQL节点不同的复制通道。这种情况下所示:

图7.9 NDB集群多源复制,MySQL服务器

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

MySQL服务器作为副本必须运行与系统变量log_replica_updates(从MySQL 8.0.26)或log_slave_updates启用(MySQL 8.0.26之前)。哪一个mysqld流程需要这个选项也前图所示。

请注意

使用log_replica_updateslog_slave_updates系统变量对服务器没有运行没有影响副本。

需要故障转移发生当一个集群复制。在这个例子中,我们考虑的情况下集群1是输给了服务,所以集群3失去2从集群的来源更新1。因为复制NDB集群之间是异步的,也不能保证集群3更新原始直接从集群1通过集群比收到最近的2。你可以处理这个问题,确保集群3赶上集群2关于集群更新1。MySQL服务器,这意味着您需要复制任何杰出的从服务器更新MySQL服务器C F。

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

mysqlC >选择@latest: = MAX(时代)- >从mysql。ndb_apply_status - > server_id = 1;mysqlC >选择- > @file: = SUBSTRING_INDEX(文件,' / ',1),- > @pos: =位置- >从mysql。ndb_binlog_index-> WHERE orig_epoch >= @latest -> AND orig_server_id = 1 -> ORDER BY epoch ASC LIMIT 1;
请注意

你可以改进这个查询的性能,因此有可能加快故障转移*值得注意的是,通过添加适当的索引ndb_binlog_index表。看到7.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服务器F;这将导致任何丢失更新来自服务器B F被复制到服务器。

改变复制源|改变主声明还支持一个IGNORE_SERVER_IDS选择以一个以逗号分隔的服务器id和原因事件来自相应的服务器被忽略。有关更多信息,请参见改变主声明,显示奴隶|复制状态的声明。信息关于这个选项的台ndb_log_apply_status变量,看到7.8节,“用NDB实现故障转移集群复制”