NDB群集复制:多主复制和循环复制
可以在多主复制中使用NDB群集,包括在多个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节点都相同。
- 在
log_slave_updates
启用系统变量的情况下启动所有充当复制主服务器和从服务器的SQL节点。
下图显示了这种类型的循环复制设置:
NDB群集循环复制,所有主服务器为从服务器
换句话说,数据是通过2条不同的路径从群集1复制到群集3的:直接地,以及通过群集2的方式。
并非所有参与多主复制的MySQL服务器都必须同时充当主复制和从复制,并且给定的NDB群集可能将不同的SQL节点用于不同的复制通道。这样的情况如下所示:
使用MySQL服务器的NDB群集多主复制

充当复制从站的MySQL服务器必须在log_slave_updates
启用系统变量的情况下运行。上图还显示了哪些mysqld进程需要此选项。
注意使用
log_slave_updates
系统变量对不作为复制从属服务器运行的服务器没有影响。
当复制群集之一出现故障时,就需要进行故障转移。在此示例中,我们考虑了群集1失去服务,因此群集3丢失了群集1的2个更新源的情况。由于NDB群集之间的复制是异步的,因此无法保证群集3的更新直接源自群集1。的更新要比通过群集2接收的更新的更新。要解决此问题,可以确保在群集1的更新方面,群集3赶上群集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 epochASC LIMIT 1;
注意通过向
ndb_binlog_index
表中添加适当的索引,可以提高此查询的性能,从而可以显着加快故障转移时间。有关更多信息,请参见“ NDB群集复制架构和表”。
将服务器C 的值复制@file
并@pos
手动从服务器C 复制到服务器F(或让您的应用程序执行等效操作)。然后,在服务器F上,执行以下CHANGE MASTER TO
语句:
mysqlF>CHANGE MASTER TO ->MASTER_HOST = 'serverC' ->MASTER_LOG_FILE ='@file', ->MASTER_LOG_POS =@pos;
完成此操作后,您可以START SLAVE
在MySQL服务器F上发出一条语句,并且源自服务器B的所有缺失更新都将被复制到服务器F。
该CHANGE MASTER TO
语句还支持一个IGNORE_SERVER_IDS
选项,该选项采用逗号分隔的服务器ID列表,并使源自相应服务器的事件被忽略。有关更多信息,请参见“ALTER TABLE语句”和“ SHOW SLAVE STATUS语句”。有关此选项如何与ndb_log_apply_status
变量交互的信息,请参见“使用NDB群集复制实现故障转移”。