可以使用NDB集群在两个集群之间进行双向复制,也可以在任意数量的集群之间进行循环复制。
循环复制的示例。在接下来的几段中,我们将考虑一个涉及编号为1、2和3的三个NDB集群的复制设置示例,其中集群1充当集群2的复制源,集群2充当集群3的源,集群3充当集群1的源。每个集群有两个SQL节点,其中SQL节点A和B属于集群1,SQL节点C和D属于集群2,SQL节点E和F属于集群3。
只要满足以下条件,就支持使用这些集群进行循环复制:
所有源和副本上的SQL节点都是相同的。
作为源和副本的所有SQL节点都以
log_slave_updates
系统变量已启用。
这种类型的循环复制设置如下图所示:
在此场景中,集群1中的SQL节点A复制到集群2中的SQL节点C;SQL节点C复制到集群3中的SQL节点E;SQL节点E复制到SQL节点a,换句话说,复制线(图中曲线箭头所示)直接连接所有用作复制源和副本的SQL节点。
也可以设置循环复制,这样不是所有源SQL节点都是副本,如下所示:
在这种情况下,每个集群中的不同SQL节点被用作复制源和副本。你必须不启动任何SQL节点log_slave_updates
系统变量已启用。对于新开发银行集群来说,这种循环复制方案应该是可能的,其中复制线(再次由图中的曲线箭头表示)是不连续的,但应该注意的是,它还没有经过彻底的测试,因此必须仍被视为实验性的。
使用NDB-native备份和恢复初始化复制集群。在设置循环复制时,可以使用管理客户端初始化复制集群开始备份
命令在一个NDB集群上创建备份,然后在另一个NDB集群上应用此备份ndb_restore.这不会自动在第二个NDB集群的SQL节点上创建二进制日志作为副本;为了创建二进制日志,必须发出一个命令显示表
语句;这应该在运行之前完成开始的奴隶
.这是一个众所周知的问题。
多源故障转移示例。在本节中,我们将讨论多源NDB集群复制设置中的故障转移,其中三个NDB集群的服务器id分别为1、2和3。在这个场景中,集群1复制到集群2和集群3;集群2也复制到集群3。如下图所示:
图18.29 NDB Cluster Multi-Master Replication With 3 Sources . (NDB Cluster Multi-Master Replication With 3 Sources .
换句话说,数据通过两种不同的路径从集群1复制到集群3:直接复制和通过集群2复制。
并非所有参与多源复制的MySQL服务器都必须同时充当源和副本,并且给定的NDB集群可能为不同的复制通道使用不同的SQL节点。如下图所示:
作为副本的MySQL服务器必须使用log_slave_updates
系统变量已启用。哪一个mysqld需要此选项的流程也显示在前面的图表中。
使用log_slave_updates
系统变量对不作为副本运行的服务器没有影响。
当其中一个复制集群出现故障时,就需要进行故障转移。在本例中,我们考虑集群1丢失给服务的情况,因此集群3失去了来自集群1的2个更新源。由于NDB集群之间的复制是异步的,因此不能保证集群3直接来自集群1的更新比通过集群2接收的更新更新更近。您可以通过确保集群3在集群1的更新方面赶上集群2来处理这个问题。就MySQL服务器而言,这意味着您需要从MySQL服务器C复制任何未完成的更新到服务器F。
在服务器C上执行以下查询:
mysqlC> SELECT @latest:=MAX(epoch) -> FROM mysql。ndb_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
表格看到第18.6.4节,“NDB集群复制模式和表”,以获取更多资料。
复制的值@file
而且@pos
手动从服务器C到服务器F(或让应用程序执行相同的操作)。然后,在服务器F上执行以下命令将master更改为
声明:
mysqlF> CHANGE MASTER TO -> MASTER_HOST =' serverC' -> MASTER_LOG_FILE='@file', -> MASTER_LOG_POS=@pos;
完成此操作后,您可以发出开始的奴隶
MySQL服务器F语句这将导致来自服务器B的任何缺失的更新被复制到服务器F。
的将master更改为
语句还支持IGNORE_SERVER_IDS
选项,该选项接受一个以逗号分隔的服务器id列表,并导致来自相应服务器的事件被忽略。有关更多信息,请参见第13.4.2.1节,“CHANGE MASTER TO语句”,第13.7.5.35节,“SHOW SLAVE STATUS语句”.属性的交互方式的信息ndb_log_apply_status
变量,看到18.6.8节,“使用NDB集群复制实现故障转移”.