• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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 epoch ASC 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群集复制实现故障转移”。