Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  NDB Cluster Replication: Bidirectional and Circular Replication

25.7.10 NDB 集群复制:双向和环形复制

可以使用 NDB 集群进行双向复制和环形复制。

环形复制示例。 下面,我们考虑一个涉及三个 NDB 集群(编号 1、2 和 3)的复制设置,Cluster 1 作为 Cluster 2 的复制源,Cluster 2 作为 Cluster 3 的复制源,Cluster 3 作为 Cluster 1 的复制源。每个集群都有两个 SQL 节点,SQL 节点 A 和 B 属于 Cluster 1,SQL 节点 C 和 D 属于 Cluster 2,SQL 节点 E 和 F 属于 Cluster 3。

只要满足以下条件,环形复制就支持这些集群:

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

  • 所有源和副本的 SQL 节点都启用了系统变量 log_replica_updates

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

图 25.14 NDB 集群环形复制,所有源作为副本

Some content is described in the surrounding text. The diagram shows three clusters, each with two nodes. Arrows connecting SQL nodes in different clusters illustrate that all sources are also replicas.

在这种情况下,SQL 节点 A 在 Cluster 1 复制到 SQL 节点 C 在 Cluster 2;SQL 节点 C 复制到 SQL 节点 E 在 Cluster 3;SQL 节点 E 复制到 SQL 节点 A。在其他 words,复制线(图中的弯曲箭头)直接连接所有 SQL 节点,用于作为复制源和副本。

也可以设置环形复制,使得不所有源 SQL 节点都是副本,如下所示:

图 25.15 NDB 集群环形复制,源不都是副本

Some content is described in the surrounding text. The diagram shows three clusters, each with two nodes. Arrows connecting SQL nodes in different clusters illustrate that not all sources are replicas.

在这种情况下,每个集群中的不同 SQL 节点用于复制源和副本。您 不能 启动任何 SQL 节点时启用系统变量 log_replica_updates。这种 NDB 集群环形复制方案,复制线(图中的弯曲箭头)是断开的,尚未经过彻底测试,因此仍然是实验性的。

使用 NDB 本机备份和还原来初始化副本集群。  设置环形复制时,可以使用管理客户端 START BACKUP 命令在一个 NDB 集群上创建备份,然后在另一个 NDB 集群上应用该备份使用 ndb_restore。这不会自动在第二个 NDB 集群的 SQL 节点上创建二进制日志;为了创建二进制日志,必须在该 SQL 节点上发出 SHOW TABLES 语句;这应该在运行 START REPLICA 之前完成。这是一个已知的问题。

多源失效转移示例。  在本节中,我们讨论了多源 NDB 集群复制设置中的失效转移,具有服务器 ID 1、2 和 3 的三个 NDB 集群。在这种情况下,Cluster 1 复制到 Cluster 2 和 Cluster 3;Cluster 2 也复制到 Cluster 3。这种关系如下所示:

图 25.16 NDB 集群多源复制,3 个源

Multi-source NDB Cluster replication setup with three NDB Clusters having server IDs 1, 2, and 3; Cluster 1 replicates to Clusters 2 and 3; Cluster 2 also replicates to Cluster 3.

换言之,数据从 Cluster 1 复制到 Cluster 3 通过 2 个不同的路由:直接和通过 Cluster 2。

并不是所有参与多源复制的 MySQL 服务器都必须同时作为源和副本,一个 NDB 集群可能使用不同的 SQL 节点 для不同的复制通道。这种情况如下所示:

图 25.17 NDB 集群多源复制,MySQL 服务器

Concepts are described in the surrounding text. Shows three nodes: SQL node A in Cluster 1 replicates to SQL node F in Cluster 3; SQL node B in Cluster 1 replicates to SQL node C in Cluster 2; SQL node E in Cluster 3 replicates to SQL node G in Cluster 3. SQL nodes A and B in cluster 1 have --log-replica-updates=0; SQL nodes C in Cluster 2, and SQL nodes F and G in Cluster 3 have --log-replica-updates=1; and SQL nodes D and E in Cluster 2 have --log-replica-updates=0.

作为副本的 MySQL 服务器必须运行时启用系统变量 log_replica_updates。哪些 mysqld 进程需要这个选项也显示在前面的图中。

Note

使用 log_replica_updates 系统变量对不作为副本的服务器没有影响。

当一个复制集群崩溃时,需要故障转移。在这个例子中,我们考虑 Cluster 1 不可用,Cluster 3 将失去来自 Cluster 1 的 2 个更新源。由于 NDB 集群之间的复制是异步的,因此无法保证 Cluster 3 直接来自 Cluster 1 的更新比通过 Cluster 2 收到的更新更新。你可以通过确保 Cluster 3赶上 Cluster 2 的更新来处理这个问题。在 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;
Note

你可以通过添加适当的索引到 ndb_binlog_index 表来提高该查询的性能,从而可能大大加快故障转移时间。请参阅 第 25.7.4 节,“NDB 集群复制模式和表”,以获取更多信息。

手动从服务器 C 复制 @file@pos 的值到服务器 F(或让应用程序执行等效操作)。然后,在服务器 F 上执行以下 CHANGE REPLICATION SOURCE TO 语句:

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

完成后,你可以在 MySQL 服务器 F 上发出 START REPLICA 语句;这将导致来自服务器 B 的任何缺失更新被复制到服务器 F。

CHANGE REPLICATION SOURCE TO 语句还支持一个 IGNORE_SERVER_IDS 选项,该选项采用逗号分隔的服务器 ID 列表,并导致来自相应服务器的事件被忽略。请参阅该语句的文档,以获取更多信息,以及 第 15.7.7.37 节,“SHOW REPLICA STATUS 语句”。关于该选项如何与 ndb_log_apply_status 变量交互,请参阅 第 25.7.8 节,“使用 NDB 集群复制实现故障转移”