25.7.2 NDB 集群复制的通用要求
一个复制通道需要两个MySQL服务器作为复制服务器(每个用于源和副本)。例如,在具有两个复制通道(以提供冗余)的复制设置中,这意味着总共有四个复制节点,两个属于每个集群。
如本节及后续章节所述,依赖于基于行的复制来进行NDB 集群的复制。这意味着源MySQL服务器必须以--binlog-format=ROW
或--binlog-format=MIXED
的形式运行,如第25.7.6节“启动NDB 集群复制(单个复制通道)”中所述。关于基于行的复制的一般信息,请参阅第19.2.1节“复制格式”。
如果您尝试使用--binlog-format=STATEMENT
与NDB集群复制,复制将无法正常工作,因为源集群中的ndb_
binlog_index
表和副本集群中ndb_apply_status
表的epoch
列不会被更新(请参阅第25.7.4节,“NDB集群复制架构和表格”)。相反,只有源集群中MySQL服务器上的更新会传播到副本,任何其他SQL节点的更新都不会被复制。
--binlog-format
选项的默认值是MIXED
。
在两个集群中的每个MySQL服务器上进行复制时,都必须对其进行唯一标识(您不能让源和副本集群中的复制服务器共享相同的ID)。这可以通过使用--server-id=
选项来实现,其中id
id
是一个唯一的整数。尽管这样做不是必需的,但出于讨论目的,我们假设所有NDB集群二进制文件都是相同版本的。
在MySQL复制中,通常情况下,参与复制的两个MySQL服务器(mysqld 进程)必须相互兼容,包括它们所使用的复制协议版本和支持的SQL功能集(参见第19.5.2节,“MySQL版本之间的复制兼容性”)。由于NDB集群和MySQL Server 8.4发行版之间的二进制差异,NDB集群复制有额外要求,即两个mysqld 二进制文件必须来自NDB集群发行版。确保mysqld 服务器兼容的最简单方法是为所有源和副本mysqld 二进制文件使用相同的NDB集群发行版。
我们假设副本服务器或集群专门用于源集群的复制,并且不存储其他数据。
所有被复制的 NDB
表都必须使用 MySQL 服务器和客户端创建。使用 NDB API (例如,通过Dictionary::createTable()
) 创建的表和其他数据库对象对 MySQL 服务器是不可见的,因此不会被复制。NDB API 应用程序对使用 MySQL 服务器创建的现有表进行的更新可以被复制。
可以使用语句级别的复制来复制 NDB 集群。但在这种情况下,以下限制适用:
-
所有针对源集群数据行的更新都必须指向单个 MySQL 服务器。
-
不能同时使用多个 MySQL 复制进程来复制一个集群。
-
只有 SQL 级别的更改才会被复制。
这些限制还包括语句级别复制与行级别复制相比的其他限制;请参阅第 19.2.1.1 节,“语句级别和行级别复制的优点和缺点”,以获取两种复制格式之间差异的具体信息。