作者:Arnab Ray 译:徐轶韬
数据节点是MySQL NDB Cluster的分布式分片存储核心。MySQL服务器通常会访问其数据(在NDB中也称为SQL节点)。每个MySQL服务器都有自己的事务性数据字典(DD),其中存储了MySQL服务器需要使用的表,数据库,表空间,日志文件组,外键和其它对象的所有元数据。8.0版中的MySQL服务器的数据字典进行了改进,例如原子性和崩溃安全的DDL以及INFORMATION_SCHEMA
实现等。在存储引擎级别,NDB拥有自己的分布式数据字典,该字典描述了可以使用本机NdbApi直接修改的全部模式对象。
从NDB集群的角度来看,NDB数据字典被视为真实的来源,而每个MySQL服务器的数据字典相当于一个缓存的副本,其重叠部分的内容需要与NDB数据字典的内容保持同步。ndbcluster存储引擎插件通过以下三种机制来实现此同步:
- 模式同步:每当MySQL服务器重新连接到集群时,就会执行。模式同步机制可确保MySQL服务器未连接到群集时,使用任何更改的NDB元数据来更新MySQL服务器的数据字典。需要注意的是,在这个阶段,NDB字典中的元数据没有任何变化,在同步结束之前,NDB字典保持只读。
- 模式分发:当MySQL服务器连接到集群时,我们依靠模式分发机制来确保所有连接的MySQL服务器保持同步状态。这是通过确保所有涉及NDB元数据的DDL更改分布在所有连接的MySQL服务器上实现的。
- 用户触发的同步:与在后台自动执行的前两种机制不同,这要求用户采取措施来触发元数据同步。在NDB Cluster 7.x版本中,使用ndb_restore程序还原NDB字典中的元数据之后,该操作非常有效。此类更改必须反映在MySQL服务器的数据字典中,并要求用户手动触发同步,这可以通过执行
SHOW TABLES
查询或使用“表发现”机制在每个表的基础上进行更大范围的同步来完成。表发现可以通过任何涉及打开表的DML触发,例如:SELECT
或SHOW CREATE TABLE
。
MySQL 8.0中,重构了MySQL Server的数据字典,将模式信息存储在InnoDB表中,并使用InnoDB事务为MySQL Server数据字典的DDL操作提供事务行为。对于NDB来说,MySQL 8.0中事务性数据字典的引入,涉及对模式同步和分发的内部工作的重大更改,包括对各个协议的改进。大多数这种架构同步工作都是在后台自动完成的,对用户几乎没有影响,而用户触发的同步操作则明显不同,我们借此机会检查它的行为,并改变了它在NDB Cluster 8.0中的整体工作。
在NDB Cluster 7.x版本中,执行SHOW TABLES
命令等效于模式同步,将数据目录的内容与NDB字典的内容进行比较,并更正检测到的任何不匹配项。但由于以下原因,这不是一个理想的操作:
- 可用性:在将元数据恢复到NDB字典后,用户需要发出一个额外的查询,以确保在MySQL服务器中也可以看到元数据。由于必须在连接到集群的每个MySQL服务器上进行配置,对于较大的配置,这可能会变得非常繁琐。
- 全局锁:这需要获取并保持全局锁,以防止在同步期间发生其他元数据更改。
SHOW TABLES
的额外工作:SHOW TABLES
本来是一个简单的读查询,但它执行了其它的元数据更改,并使用了比预期更多的资源。- 设计关注点:用户线程执行同步,这主要是NDB事件处理组件的职责。
NDB Cluster 7.x版本中的此功能依赖于.frm文件的存在,随着MySQL 8.0中的数据字典的改变,该文件已被删除。这让我们有机会在NDB集群8.0中从头再来,看看如何处理这个问题。阅读后续文章,以获取有关NDB Cluster 8.0中自动模式同步的更多详细信息!