NDB Cluster 8.0中的自动模式同步:第1部分
作者: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中自动模式同步的更多详细信息!
- ios textView跟随键盘的移动
- Android:屏保软件的开发
- CoordinatorLayout
- 从零开始的Spring Security Oauth2(二)
- 简化Swagger使用的自制Starter:spring-boot-starter-swagger,欢迎使用和吐槽
- demo3同通讯录展示的方式分组排序
- Android手势研究(textview及listview对比验证)
- demo2动态加载显示商品详情页
- demo1 动态显示view或弹框 动态隐藏view或弹框
- ios 继承UITableViewController,更改tableview样式
- demo1 动态显示view或弹框 动态隐藏view或弹框
- 从零开始的Spring Security Oauth2(一)
- 细说Android事件传递
- swift基础_ set get方法 理解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- keras和tensorflow使用fit_generator 批次训练操作
- php-fpm中max_children的配置
- python文件读取失败怎么处理
- PHP-FPM的配置与优化讲解
- python为什么会环境变量设置不成功
- keras自动编码器实现系列之卷积自动编码器操作
- PHP数字金额转换成中文大写显示
- 详解Python多线程下的list
- Python 字符串池化的前提
- PHP抽象类基本用法示例
- keras分类模型中的输入数据与标签的维度实例
- keras的三种模型实现与区别说明
- PHP智能识别收货地址信息实例
- Keras 在fit_generator训练方式中加入图像random_crop操作
- PHP面向对象程序设计继承用法简单示例