揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL

概述

X-Engine是阿里自研的数据库存储引擎,以插件的方式接入到MySQL生态,支持行锁,事务,MVCC等OLTP场景的核心功能。

X-Engine的核心优势是低成本,高性价比,尤其适用于历史库场景,目前阿里巴巴内部的核心交易历史库(原来是Hbase),钉钉消息历史库(原来是MySQL(InnoDB)),淘宝商家的图片空间等业务均通过X-Engine解决了成本问题。

同时,X-Engine也赋能阿里云数据库服务,作为云上RDS-MySQL的存储引擎,对外售卖,让更多的用户享受到新技术带来的红利,有关X-Engine的详细介绍,请移步2019年10月的数据库内核月报。本文主要介绍X-Engine引擎的一个核心功能,OnlineDDL

OnlineDDL毫无疑问是MySQL生态的一个重要的功能,想当初MySQL 5.6以前,DBA执行DDL变更时,为了保证7*24小时服务,只能采用最老土的主备切换的方式来进行。数据库存储引擎区别于NoSQL引擎的一种重要指标就是是否支持SQL,是否有schema(数据字典)。有了schema,还需灵活地支持在线变更,这样才能从容应对业务快速变化的需求。MySQL生态中这么多存储引擎只有InnoDB完整地支持了OnlineDDL,X-Engine作为MySQL生态的新成员,虽然采用了完全不同于InnoDB的存储架构,但OnlineDDL给用户的体验是一样的 。

整体流程

X-Engine采用类LSM的分层架构,数据按照时序逻辑分成多层,每一层数据有序,新数据在较高的层次,最老的历史数据在最底层。对于X-Engine来说,每个主表和二级索引数据都是一棵分层的LSM-tree结构,内部称之为Subtable。每个Subtable分为4层,Memtable,L0,L1和L2,每一层都保持有序,数据按新旧顺序依次往更深的层次迁移,其中Memtable在内存中,其它几层按需可以在不同的存储介质上。OnlineDDL功能实现充分利用了X-Engine的数据组织特点,将新build数据分为两部分,基线数据和增量数据。基线数据是指变更开始时,通过拿snapshot能遍历得到的数据;增量数据是指,变更开始后,用户写入的新数据。拿Snapshot过程需要短时间禁写,因为我们强依赖这个一致性位点,确保基线+增量数据的完整性。

OnlineDDL总共包括了4个阶段,包括Prepare阶段,Inplace-build阶段,Commit阶段和Post-ddl阶段。
1.Prepare阶段,这个阶段主要是准备数据字典,构建底层存储数据的Subtable,为后续的增量写入做准备。

2.Inplace-build阶段,这个阶段OnlineDDL的核心阶段,一方面通过Snapshot获取基线,另一方面还需要实时维护增量数据,利用X-Engine的数据组织的append-only特性,将基线和增量合并,即完成了OnlineDDL新数据构建的过程。这个过程的详细逻辑会在下一个小节详细介绍。

3.Commit阶段,这个阶段是OnlineDDL引擎层变更生效阶段,如果整个OnlineDDL过程中没有出现异常或错误,那么Commit阶段会生效新的数据字典,生效新的数据。

4.Post-ddl阶段,这个阶段是OnlineDDL真正生效阶段,这个阶段完成后,才会返回给用户DDL成功。这个阶段的引入,主要是因为MySQL通过Server层+引擎层这样的一个二层结构实现扩展,而每一层都有自己的数据字典,在Commit阶段只能保证引擎层的数据和数据字典是完整的,为了保证DDL变更的原子性(Server层和引擎层数据字典保持一致),引入Post-ddl阶段做清理和善后工作,有关DDL原子性的讨论会在下面的章节详细介绍。

核心逻辑

OnlineDDL的核心逻辑在于如何做到执行DDL变更时,不堵塞用户对该表的DML和SELECT操作。X-Engine实现OnlineDDL有两个关键点,第1,利用X-Engine的数据组织append-only特点,增量维护在Memtable,L0,L1中,而基线数据维护在L2中;第2,维护增量时,采用双写,同时维护old-table和new-table中的数据。与InnoDB引擎类似,根据DDL是否涉及到数据记录格式变更,将DDL变更分为Inplace-rebuild和Inplace-norebuild两种类型。对于X-Engine来说,两者本质是一样的,区别在于维护的索引个数。Inplace-rebuild类型的DDL需要同时维护new-table中所有索引;而Inplace-norebuild类型的DDL只需要维护new-table的新增的索引。
11.jpg

整个Inplace-Build按照时间序有3个关键节点,t0时刻是获取快照的时间点,t1时刻是build基线完成的时间点,t2时刻是唯一约束检查完成的时间点。那么两个阶段的主要逻辑如下:t0-->t1主要工作是在build新表的基线,通过将old-table的数据结合new-table的数据字典生成新的记录,最终写入新表对应的L2层;在build新表基线的过程中,产生的增量写入到新表的(Mem,L0,L1)。DDL过程中,需要对后台的Compaction任务做一定的控制,确保不执行合并到L2的Compaction任务。t1-->t2是唯一性校验阶段,确保新增的主键或者唯一索引的唯一性,t2时刻将(Mem,L0,L1,L2)中的数据合并,最终得到new-table的全量数据。记录转换的过程如下:
12.jpg

其中,DDL事务表示DDL线程,它的任务是扫描基线,生成新表的基线数据;DML事务表示DDL过程中,并发的DML事务,它们的任务是,通过双写机制同时维护新表和老表的增量。

对比InnoDB实现逻辑

虽然X-Engine与InnoDB的OnlineDDL都是采用基线+增量的方式实现,但具体逻辑是不同的,主要是因为InnoDB采用的的是原地更新操作并且通过row-log机制来维护增量,而X-Engine是一个append-only的存储引擎,天然地支持数据的多版本存储,可以实时维护增量数据,在基线建立完成后只需要将基线与增量数据合并,即使基线中的数据在增量中被修改,但增量中数据的版本比基线数据版本更新,从而在合并时会覆盖基线中老版本的数据。下图是InnoDB引擎OnlineDDL过程。
13.jpg

可以看到InnoDB引擎的OnlineDDL也包括3个关键时间点,与X-Engine引擎的区别在于,t1-->t2 是InnoDB追row-log过程,而对应X-Engine是唯一约束检查的过程。当然对于X-Engine来说,t1-->t2不是必需的,因为DDL变更可能并不涉及唯一索引操作。

Instant-DDL

与MySQL8.0(InnoDB)类似,X-Engine同样也支持Instant-DDL。在所有支持的OnlineDDL中,若DDL操作只涉及修改表的属性信息,或只是做了加列操作,不需要修改记录格式,也不需要新增索引,那么这些OnlineDDL操作可以优化成Instant-DDL。这些DDL操作可以“极速”完成,用户基本无感知。由于Instant-DDL执行时,并没有真正涉及引擎数据的修改,为了后续查询结果和DDL操作的正确性,需要对于引擎的记录格式做一定的调整,加一些控制元信息。新增一个1字节来标示生成这个记录时,表是否执行过instant-ddl。同时,生成记录时,还需要记录有多少个列是已有的,以及有多少个null列等;在读取解析记录时,根据字典信息,就能知道有多少个列是需要根据instant列信息来补充,确保instant-DDL后,返回查询结果的正确性。

DDL原子性保证

从OnlineDDL的整体流程中我们了解到,OnlineDDL最后一个阶段是Post-ddl阶段。MySQL8.0以前,Server层的元数据都是通过文件来存储,比如frm文件,par文件以及trg文件等。一个DDL操作修改,涉及到文件修改,引擎数据修改以及引擎字典的修改,这些操作无法做成一个事务,必然导致整个DDL操作无法做到原子性。若DDL过程中出现异常,就可能会导致Server层和引擎层数据不一致,以及残余的垃圾没有清理等问题。MySQL8.0将Server层的所有字典信息统一存储在DD(DataDictionary)中,并且通过InnoDB引擎存储,那么DDL过程中,我们只要保证Server层数据字典的修改,以及引擎层数据字典的修改封装成一个事务即可。

对于InnoDB引擎而言,DD数据字典操作,InnoDB引擎数据字典操作都是通过InnoDB引擎存储,通过InnoDB事务特征来保证原子性。对于X-Engine引擎而言,DD数据字典操作,X-Engine引擎数据字典操作分别采用InnoDB引擎和X-Engine引擎,除了依赖于InnoDB和X-Engine自身是事务引擎特征,还需要借助于内部的2PC协议来保证整个事务的原子性。如果MySQL开启了binlog,那么就是binlog,X-Engine,InnoDB三者一起通过2PC协议保证事务的原子性。而Post-ddl阶段就是做善后和清理工作,如果最终整个事务提交,Post-ddl阶段负责真正清理old-table数据;如果最终整个事务回滚,那么Post-ddl阶段负责清理临时产生的new-table数据,确保DDL变更前后,数据库的状态是一致的。
14.jpg

使用体验

X-Engine作为MySQL的一个新引擎,在语法使用层面完全与MySQL(InnoDB)相同,通过algorithm_option指定Online类型,通过lock_option指定DDL过程中,是否允许其它并发的DML和SELECT操作。通常情况下,这两个选项都不用特别指定,采用默认值即可,MySQL内部会优先选择Instant类型和Inplace类型,对于不支持Online的DDL操作,选择Copy类型。在功能层面也与MySQL(InnoDB)相同,目前X-Engine暂时还不支持全文索引,虚拟列,外键等功能,因此与这些功能相关的DDL操作会不支持,其它DDL操作与MySQL(InnoDB)相同。常用的DDL操作分类如下:
15.jpg

后续工作

X-Engine作为一个新的数据库存储引擎,通过集团业务场景的打磨,已经体现了它的价值,我们希望通过云上RDS场景,让更多用户享受到新技术带来的红利。当然,目前X-Engine还有一些不足,尤其是相对于传统成熟的MySQL(InnoDB)和Oracle,所以X-Engine引擎在优化自身的稳定性和性能同时,会持续不断地丰富数据库功能,包括支持外键,全文索引,虚拟列等。除了公有云的RDS输出,基于X-Engine的一体化分布式数据库PolarDB-X也是一个重要方向,我们会以专有云形式输出,服务更多对分布式数据库有强需求的用户。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业微信_获取access_token

文章目录一、快速入门1. 开发文档2. 管控台3. 接口文档4. 参数获取5. api调试二、java实战2.1. 入口2.2. 核心方法2.3. 核心配置2.3. RestUtils 工具类2.5. token缓存策略三、源码分享3.1. 后端源码3.2. 前端源码一、快速入门 1. 开发文档 企业内部开发文档: http…

荷兰政府用大数据预测天气预防自然灾害,他们是怎么做的?

作者 | 乔治娜乌斯蒂克翻译 | Katie责编 | 晋兆雨头图 | CSDN付费下载于视觉中国你是否对天气预报电视报道的背后的运作感到好奇?是谁在管理政府卫星?也许你会思考关于传感器的一个问题——数据会流向何处? 在荷兰,这些数据是由KN…

Excel VBA Sql 操作Access数据库

目录 1. 文件创建2. 数据库连接2.1 前期和后期绑定2.2 通过判断 Excel 的不同版本,给出不同的连接字符串2.3 Excel 自连接3. 应用:增、删、改3.1 增加数据的语法3.2 删除数据的语法3.3 修改数据的语法4. 结语1. 文件创建 首先,我们需要在预先设置的路径下新建Excel工作簿。…

企业微信小程序_小程序开发工具及真机调试_host配置及代理

文章目录一、开发前准备1. 开发文档2. 工具安装3. 安装插件4. 调整编译模式5. 选择企业6. PC 调试前端7. PC 调试后端二、甄姬调试前端2.1. 预览小程序2.2. 手机企微扫码2.3. 手机企微调试2.4. 多场景调试2.5. 手机企微调试前后端一、开发前准备 1. 开发文档 小程序开发文档&…

别再盲目学Python了!

如果你想问最近这些年什么编程语言最值得学习,我会毫不犹豫的告诉你是Python。无论是刚入门的程序员,还是年薪BATJ的技术大牛,都无可否认现在Python对于一个程序员职业发展的重要性。所以不仅是开发小白,甚至很多开发老手&#xf…

VBA 网页提取特定内容 - 网抓实践总结

目录 前言1. 常用代码和自定义函数1.1 文本 to 剪贴板1.2 获取网页主体源代码1.2.1 方法一:`InternetExplorer.Application`1.2.2 方法二:`MSXML2.XMLHTTP`1.2.3 方法三:`Msxml2.ServerXMLHTTP`1.2.4 方法四:WinHttp.WinHttpRequest.5.11.2.5 方法五:Microsoft.XMLHTTP1.3…

企业微信_Windows版本调试

文章目录1. 调试文档2. 下载插件3. 插件放置4. 开启调试模式5. 效果图6. 关闭调试模式1. 调试文档 客户端调试文档: https://developer.work.weixin.qq.com/document/path/95384 2. 下载插件 3. 插件放置 把 devtools_resources.pak 放到企业微信的安装目录下&am…

如果千百年前有视觉AI算法,世界将会是什么样的光景呢?

视觉AI算法在近些年取得了一定的突破,被应用在了越来越多的地方,我相信距离真正的AI普及这个大目标也越来越近了。我时常在想假如古代也有视觉AI算法,那是不是很多故事的结局都将被改写?《伯乐相马》、《皇帝批红》、《木兰从军》…

困境实现飞跃,梦想照进现实《安防视频监控数据存储蓝皮书》发布

前言 近年来,随着云计算、5G、AI 技术的不断兴起与发展,安防行业正在发生数字化转型,作为安防行业重要的数据采集与管理中枢,视频监控设备在数量上不断增加,在科技强有力的支撑之下,庞大的图片、视频数据组…

企业微信小程序_获取准确定位的方法及解决定位不准确的问题

文章目录一、经验分享1. 微信api现状2. 解决方案3. 适用场景二、小程序集成腾讯定位服务2.1. 注册腾讯开发者2.2. 创建应用2.3. 添加key2.4. 下载sdk2.5. 合法域名三、开发实战3.1. sdk拷贝3.2. 页面引用3.3. 页面部分3.4. 数据部分3.5. 方法部分四、真机调试4.1. 项目运行4.2.…

深度揭秘:腾讯存储技术发展史

采访嘉宾 | 腾讯云副总裁谢明等图源 | 视觉中国来源 | CSDN(ID:CSDNnews)在腾讯内部,负责腾讯存储技术研发的部门,一直被认为是生产技术专家的“黄埔军校”。腾讯不少技术方向的负责人,最早也都出自这个团队。这或许可…

常见字典用法集锦及代码详解

目录前言字典的简介1. 字典对象1.1 Add 方法1.2 Exists 方法1.3 Keys 方法1.4 Items 方法1.5 Remove 方法1.6 RemoveAll 方法2. 实例2.1 实例1. 普通常见的求不重复值问题2.1.1 问题2.1.2 实例代码2.1.3 代码详解2.2 实例2 求多表的不重复值问题2.2.1 问题2.2.2 代码2.2.3 代码…

企业微信小程序_集成腾讯地图实现精准定位考勤打卡

开源项目地址:https://gitee.com/gblfy/tx-position-check-in 关于微信小程序集成腾讯地图详情,可以参考:https://blog.csdn.net/weixin_40816738/article/details/122519497

18个PPT,29个提问解答,都在这儿啦!

4月25-26日,全球首个 Apache 顶级项目在线盛会 Flink Forward 中文精华版重磅开播,聚焦 Alibaba、 Google、AWS、Uber、Netflix、DellEMC、微博、滴滴等各大互联网公司实时计算的经典场景和业务故事,由 Flink 核心贡献者们对 19 个优质 talk …

CSDN公众号新功能上线,居然还能搜出小姐姐???(文末有福利)

为了给各位打工人更好的搜索体验CSDN总是在学习新技能这次CSDN公众号又给大家带来了一项全新的搜索技能在CSDN旗下的公众号内回复消息就能自动回复想搜索的内容啦小编来给大家演示一下,在公众号内输入“mysql安装教程”,就能得到CSDN全站内关于mysql安装…

如何在SQL Server 2019中添加数据敏感度分类的命令

作者 | Jordan Sanders翻译 | 火火酱。责编 | 晋兆雨头图 | CSDN付费下载于视觉中国为了确保数据库安全性和完整性,数据库管理员日常需要运行多种操作。因此,无论在何种情况下,我们都不能忽视数据库中敏感数据的重要性。在本文中,…

支撑数千家天猫商家CRM业务,数云高弹性数据库如何做

“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来”。-----麦肯锡 基于互联网和大数据和时代背景,用户在互联网上留下更多的印记…

全国高速恢复收费!阿里云:自由流“3大特色能力”使能智慧之路

5月6日,全国高速公路正式恢复收费。ETC普及优化程度、高速自由流收费模式等成为热点话题。随着取消省界高速公路收费站和全国ETC的普及,极大提升高速公路网通行效率,有效降低物流运输成本,减少收费站“堵车”现象,高速…

移动云11.11,钜惠High不停!

一年一度的双十一又来啦全民购物车已开起来!然而复杂的优惠规则催生一大批通宵达旦看直播的定金人和尾款人对这些套路,移动云统统Say NO作为一朵有服务温度的“云”,让优惠简单点让用户买想买的东西,省该省的钱五重惊喜&#xff0…

使用Blink CEP实现差值聚合计算

使用Blink SQLUDAF实现差值聚合计算介绍了如何使用Blink SQLUDAF实现实时流上的差值聚合计算,后来在与付典就业务需求和具体实现方式进行探讨时,付典提出通过CEP实现的思路和方法。 本文介绍通过CEP实现实时流上的差值聚合计算。 感谢付典在实现过程中的…