10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

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

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

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

循环复制的例子。在接下来的几段中,我们考虑一个复制设置的例子,其中包括编号为1、2和3的三个NDB集群,其中集群1作为集群2的复制源,集群2作为集群3的源,集群3作为集群1的源。每个集群有两个SQL节点,SQL节点A和B属于cluster 1, SQL节点C和D属于cluster 2, SQL节点E和F属于cluster 3。

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

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

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

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

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

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

在此场景中,集群1中的SQL节点A复制到集群2中的SQL节点C;集群3中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节点上创建二进制日志;为了创建二进制日志,您必须发出一个显示表语句;这应该在运行之前完成启动|副本slave.这是一个众所周知的问题。

多源故障转移的例子。在本节中,我们将讨论一个多源NDB集群复制设置中的故障转移,其中有三个NDB集群,服务器id分别为1、2和3。在此场景中,集群1复制到集群2和集群3;集群2也可以复制到集群3。这种关系如下所示:

图23.38 NDB集群三源多主复制

多源NDB集群复制设置,三个NDB集群的服务器id分别为1、2和3;集群1复制到集群2和集群3;集群2也可以复制到集群3。

换句话说,数据通过两条不同的路径从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系统变量对不作为副本运行的服务器没有影响。

当其中一个复制集群发生故障时,就需要进行故障转移。在本例中,我们考虑这样一种情况:Cluster 1丢失了服务,因此Cluster 3丢失了来自Cluster 1的2个更新源。由于NDB集群之间的复制是异步的,因此不能保证集群3直接从集群1发出的更新比从集群2接收的更新更近期。您可以通过确保Cluster 3在来自Cluster 1的更新方面赶上Cluster 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表格看到第23.6.4节“NDB集群复制模式和表”,以查询更多资料。

的值复制过来@file而且@pos手动从服务器C到服务器F(或让您的应用程序执行相同的操作)。然后,在服务器F上执行以下操作将复制源更改为语句(MySQL 8.0.23及更高版本)或改变主语句(MySQL 8.0.23之前):

mysqf > CHANGE MASTER TO -> MASTER_HOST =' serverC' -> MASTER_LOG_FILE='@file', -> MASTER_LOG_POS=@pos;

从MySQL 8.0.23开始,你也可以使用下面的语句:

mysqlF> CHANGE REPLICATION SOURCE TO -> SOURCE_HOST =' serverC' -> SOURCE_LOG_FILE='@file', -> SOURCE_LOG_POS=@pos;

完成此操作后,您可以发出启动|副本slaveMySQL server F;这将导致来自服务器B的任何丢失的更新被复制到服务器F。

将复制源更改为|改变主语句还支持IGNORE_SERVER_IDS选项,该选项接受一个以逗号分隔的服务器id列表,并导致来自相应服务器的事件被忽略。有关更多信息,请参见第13.4.2.1节“CHANGE MASTER TO Statement”,第13.7.7.36节,“SHOW SLAVE | REPLICA STATUS Statement”.有关此选项如何与ndb_log_apply_status变量,看到第23.6.8节“使用NDB集群复制实现故障转移”