可以使用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之前)。
这种类型的循环复制设置如下图所示:
在这个场景中,SQL节点在集群1复制到SQL节点在集群2 C;SQL节点集群3 C复制到SQL节点E;SQL复制节点E SQL节点a。换句话说,复制行(弯曲的箭头在图中所示)直接连接所有SQL节点用作复制源和副本。
还可以设置循环复制以这样一种方式,并不是所有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。这种关系如图所示:
换句话说,从集群1到集群复制的数据通过两个不同路线3:直接,通过集群2。
并不是所有MySQL服务器参与多源复制必须作为源和复制品,和给定NDB集群可能使用不同的SQL节点不同的复制通道。这种情况下所示:
MySQL服务器作为副本必须运行与系统变量log_replica_updates
(从MySQL 8.0.26)或log_slave_updates
启用(MySQL 8.0.26之前)。哪一个mysqld流程需要这个选项也前图所示。
使用log_replica_updates
或log_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实现故障转移集群复制”。