OceanBase V4 技术解读:从Alter Table 看DDL的支持

背景

数据库类型可以划分为两大类:关系型数据库和非关系型数据库。而关系型数据库以表格形式进行数据组织,同时遵循表关系的约束,例如创建一张表,表里面包含多个列,不同的列可以有不同的类型。当需要改表结构,如创建索引、修改主键、加减列操作、重分区等,这些操作统称为 DDL。OceanBase 支持多种DDL操作,以满足用户在实际生产环境中的需求。那么 DDL 的具体表现形式是什么,其实现的原理是什么?

这篇文章将从执行 alter table 的视角,来剖析OceanBase  DDL 语句的背后原理。特此说明,以下内容仅针对 OceanBase 4.x 发行版本。

DDL 流程

我们以一条修改列类型的 SQL 来开启 DDL 原理的探索,一起看下这条 SQL 语句的背后到底发生了什么,假设我们的表名为 t1,表结构里有 c1 列,原列类型为 int,我们执行如下的 DDL 操作。

alter table t1 modify column c1 bigint;

当用户执行了上述 SQL 后,如果我们部署了 OBProxy 的集群,SQL 指令会先发送到 OBProxy 中处理,然后 OBProxy 经过简单的解析,路由计算,把这条 SQL 发送到集群中的一台 OBserver,我们称为中控 OBServer。中控 OBServer 在收到消息后,经过 SQL 语法语义解析,发现这是一条 alter table 的 DDL 语句,在经过优化器、执行器以及生成物理计划后,通过 RPC 转发给另外一台 RootService(RS) 所在的 OBServer 节点来处理。当 RS 接收到来自中控 OBServer 的 RPC 请求后,从请求包里解析出需要修改的 Schema 表结构信息,并把这些信息更新到对应的内部表,然后再发起一个 DDL Task 任务,最后任务会被相关的 OBServer 节点执行。当任务执行完后,RS 会把任务状态发送回中控 OBServer 节点。特别的,对于执行时间可能比较长的 DDL 操作,RS 会识别出来并在任务创建后,返回任务 ID 给中控 OBServer,然后中控 OBServer 通过轮询任务状态,来决定什么时候结束返回。最后中控 OBServer 会把任务状态回给 OBProxy,OBProxy 再返回给客户端,结束本次 DDL 操作。我们来看下流程:

1698134937

Alter table

了解了 DDL 的执行流程之后,我们再来看下 alter table 内部触发了哪些具体操作。

当 RS 收到中控 OBServer 发送的请求包后,就已经知道这是一条修改列类型的 DDL。RS 经过一番计算后,发现这个修改列类型的 DDL 是 Offline DDL,需要对目标表的数据进行重整,于是 RS 结合解析出来的信息,创建出一个 DDL Task,并把这个 Task 放入到一个任务队列,我们叫 DDL Task Queue。后续会通过 DDL 任务调度(DDL Scheduler )从任务队列中得到这个 Task,执行完成后,把执行结果记录到内部表,最后中控 OBServer 从内部表中获取实时的执行状态,判断是否需要结束。我们看下简易流程:

1698134974

这里面的 DDL Scheduler 调度器工作最为繁重,因为要不停的从 DDL Task Queue 里取出任务并执行。

可能就有同学会问,如果我的一个 DDL 任务耗时很长,会不会阻塞调度器对其他任务的执行呢?答案是不会。这里我补充说明下,首先,DDL Scheduler 执行线程不止一个。其次,每一个 DDL 任务会被切分为多个任务状态来分段执行,DDL Scheduler 每调度一次,完成一次状态切换。DDL Scheduler 依赖这些状态的切换来推进任务,直到成功走到最后 Succ 成功的状态。

那如果在某个任务状态卡住了怎么办?这个问题问得太好了,我们会通过 DDL 重试机制来容错,一般一个 DDL 任务会设定 72h 的超时时间,如果确实是因为数据量比较大,在 DDL 补数据阶段需要的时间比较长,这种只能等待补数据结束,其他场景如获取 Table Entry 失败,或者获取锁冲突等异常,我们会做重试,根据经验 72 个小时足够容错。

那如果正在执行 DDL 的 RS 发生切主了,旧主的任务队列内存信息没有了,要怎么恢复呢?这很好解决,我们已经考虑到故障重启/切主等场景,RS 在创建 DDL Task 任务的同时,我们会把 DDL 任务状态持久化到内部表,切主后从内部表恢复任务状态,继续从上一个状态执行。

DDL 任务状态及演进

好了,既然 OceanBase 是根据状态机来推进 DDL 任务的,那么我们一起来看下修改列类型时,主要的任务状态含义以及演进过程吧:

1698135001

Wait_trans_end

等事务结束。这里补充说明下,OceanBase 在做列类型转换的 DDL 时,是通过双表双写的方式进行的,即按照 DDL 后的表结构 Schema 创建一张新的隐藏表,并把旧表的数据全部切换到新隐藏表里。但因为创建表之后可能还有一些 DDL 操作前的事务还没结束,因此需要等待这些事务结束,并获取一个全局快照点,来做后续的操作。

Obtain_snapshot

获取快照点。在上面等事务结束后,我们获取一个全局快照点,这个快照点是新表从旧表中重写数据的依据。此时,只要对快照点之前的数据进行补全就能保证新表的数据是完整的。需要进一步说明的是,在快照点之前也有一些事务已经往新表里插入过数据,但根据幂等性,我们可以保证读出来的数据没有问题。

Redefinition

补数据。在上面的状态结束后,我们得到了一个全局快照点,并且因为这是一个修改列类型的 DDL,我们假设修改的列非主键列,不涉及分区键的变更,因此修改后的列相关的宏块是不需要重新排序的。这里应该很好理解,分区键未变化,修改后新表的分区和原表的分区规则相同,在分区键不变的情况下,新表数据分区位置不变。为了会更好的理解补数据的逻辑,下面稍微展开介绍下补数据的类别。

补全数据分为三类:

  • 第一类是需要分区排序,但源表和目的表分区规则不同,如创建全局索引。排序是指将主表分区之间的数据做排序后,填充到全局索引表。
  • 第二类是需要分区排序,但源表和目的表分区规则相同,如修改主键、创建局部索引。这个应该很好理解,修改主键和创建局部索引不会变更新旧表的分区方式,但会影响分区内数据的顺序,排序是指数据重新排列后,填充到新表分区。
  • 第三类是分区内不需要排序,例如,修改列类型(假设是未修改主键列的列类型)。这就更好理解了,因为主键(rowkey)不变,修改列类型不会影响数据在存储中的顺序,因此不需要重新排序。

为了更加直观查看数据的分区排序,我们举例创建全局索引的补数据过程吧:

1698135021

Copy_table_dependent_object

重建与原表相关的对象以及约束。例如索引表,在上面的例子中,我们修改了列类型,假设这个列是索引表中的列,那么索引表同样需要被重建,也需要 RS 创建一个重建任务,主体流程和主表 DDL 类似。

Take_effect

新表生效。在做完上面的补数据流程后,我们认为新表已经具备了完整的数据,并且可以对外提供服务了。由于在整个补数据阶段我们是锁表的,也就是屏蔽了 DML/DDL 的并发干扰,因此只需要把新表的名字直接切换成旧表的名字即可。在这之后还会做一些收尾的动作,例如恢复分区读写、删除原表、清理临时数据等。

Online 和 Offline

上面提到 Online 和 Offline 这些个字样,我在这里简单补充说明一下。由于 OceanBase 采用 Offline DDL 双表双写方式,涉及隐藏表的创建以及对主表数据的重整,即需要把数据写入到新表,表数据越多,执行时间越长。Offline 的意思是说,在执行 DDL 的同时,会阻塞其他 DML 的操作。实现的原理其实也简单,给需要做 DDL 的表加上一把表锁,当 DML 执行需要获取这把锁时,发现已经被其他事务持有,那么就会等待重试直至超时退出。与之相对应的是 Online DDL,也就是在 DDL 的同时,允许 DML 操作。实现上是 DDL 只修改表 Schema 原数据信息,例如修改表名,加列等操作,表结构完成修改后,其他事务可以立刻操作新表,源表数据不需要立刻做重整。

对于我们支持的 Online DDL 类型,同学们可以参考这篇文章:OceanBase 4.0解读:兼顾高效与透明,我们对DDL的设计与思考

写在最后

经过上面的介绍,相信同学们的心里已经对 OceanBase 的 alter table 流程有了大概的认识。当然,DDL 的场景还有很多,上面只是列举了列类型变更一种,或说一类操作吧(Offline DDL),希望能让同学们有个感性的认识。另外,OceanBase 的 DDL 的整体流程相对并不复杂,但因为往往需要和事务、RS、复制迁移等交互,以及需要控制 DDL 任务执行对 CPU、磁盘 IO 的影响,细节很多,内容还是相当丰富的。有兴趣的同学可以看下代码的具体实现细节,也欢迎在评论区和我们一起探讨。

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

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

相关文章

数学建模赛前备赛——模拟退火算法

一.什么是智能优化算法 智能优化算法本质上是一个优化算法,它通过不断优化模型的参数,使得系统表现达到最优,常见的只能优化算法有很多,比如说蚁群算法,遗传算法以及我们今天的主角——模拟退火算法。 二.模拟算法的前身——爬山算法 爬山算法是一种简…

开放大世界的碰撞与物理

众所周知,物理开销一直是 CPU 的一个大头,而且还很容易出问题。对于开放世界,该如何进行物理运算,以及采用什么方案计算碰撞。 本文针对这个问题做了一些细微的研究,算是对 Unity 下的解决方案有了一个大致的方向。 1、…

Gartner报告解读:如何帮助企业完善数据分析与治理路线图

Gartner服务于全球100多个国家和地区的14,000余家机构,是一家深受客户信赖、观点客观的研究顾问公司。Garnter洞察、建议和工具可帮助您发现创新机遇,完成关键优先任务,助您成为企业不可或缺的战略专家和价值创造者。该公司是标普 500 指数成…

手把手教在Linux系统服务器下运行HM编码

先在SVN上下载HM文件包,可以看到文件中有linux文件夹,如果在windows下运行直接打开sln后缀的项目。不清楚的看这个: 一、准备工作 1、删除linux文件加下makefile.base中-Werror,文件路径如下: 打开文件,c…

自制深度学习推理框架之表达式层的设计与实现

文章目录 一、表达式Expression二、词法解析2.1 词法定义2.2 词法解析 三、语法解析3.1 语法树的定义3.2 语法树构建3.3 语法树的转换(逆波兰式) 四、表达式层4.1 ExpressionLayer和ExpressionParser类4.2 表达式层的注册4.3 表达式层的输入处理4.4 表达式层的计算过程 五、计算…

插入排序的动画展示与实现

排序学习思路:先实现单趟逻辑,在实现整体逻辑;先解决普遍情况,再解决特殊情况。 什么是插入排序 回忆下自己玩扑克牌的时候是怎么把手上的牌理顺的吧!其实那就是插入排序,从左边往右边,把一张张…

Profinet 从站转 EtherNet/IP 从站网关

产品用途 本产品是 PN(Profinet) 和 EtherNet/IP 网关,使用数据映射方式工作。 本产品在 PN 侧作为 PN IO 从站,接 PN 主站设备,比如西门子 PLC 等;在EtherNet/IP 侧做为 EtherNet/IP 从站,接 EtherNet…

C++:继承用法详解~

在学完C的类和对象,并掌握了类的核心语法与基本用法之后;我们就得去学习一下继承的语法,与继承的用法。简单概括一下,继承是C中一种代码复用的手段,它允许我们,对已有的类,增添新的成员函数或变…

opencv实战项目十六:kmeans图像颜色聚类:

文章目录 前言K-means介绍效果 前言 在数字化时代,图像处理技术已成为计算机视觉领域的重要组成部分。其中,图像颜色聚类作为一项关键技术在众多应用场景中发挥着重要作用,如图像分割、物体识别、色彩调整等。K-means算法作为一种经典的聚类…

【云游戏】点量云流赋能大型游戏新体验

点量小刘发现近期国产化大型3A游戏《黑神话:悟空》的发售,可谓是赢得了一波好评。从场景内容来说深厚的文化底蕴支撑和高质量精美的特效及画面制作令人眼前一亮,作为备受瞩目的一款游戏,从技术层面来说,该游戏也离不开…

【DSP+FPGA】基于DSP+FPGA XC7K325T与TMS320C6678的通用信号处理平台

DSP FPGA 协同处理架构板载 1 个TMS320C6678 多核DSP处理节点板载 1 片 XC7K325T FPGA处理节点板载 1 个FMC 接口板载4路SFP光纤接口FPGA 与 DSP 之间采用高速Rapid IO互联 基于FPGA与DSP协同处理架构的通用高性能实时信号处理平台,该平台采用1片TI的KeyStone系列多…

制造企业如何启用BI工具,并构建自助式BI业务模式?

在制造业的数字化转型浪潮中,商业智能BI工具正逐渐成为推动企业增长的“加速引擎”。随着数据量的爆炸性增长,如何高效地分析和利用数据,已成为制造业提升竞争力的关键。本文将基于BI工具在制造业中的优势,深入探讨一种创新的BI分…

[Meachines] [Insane] Bankrobber XSS-MDOG+SQLI+XSRF+Local-RCE+Bankv2转账模拟应用缓冲区溢出

信息收集 IP AddressOpening Ports10.10.10.154TCP:80,443,445,3306 $ nmap -p- 10.10.10.154 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http …

jenkins安装k8s插件发布服务

1、安装k8s插件 登录 Jenkins,系统管理→ 插件管理 → 搜索 kubernetes,选择第二个 Kubernetes,点击 安装,安装完成后重启 Jenkins 。 2、对接k8s集群、申请k8s凭据 因为 Jenkins 服务器在 kubernetes 集群之外,所以…

JVM垃圾回收算法:标记-清除算法 、复制算法、 标记-整理算法、 分代收集算法

文章目录 引言I 标记回收算法(Mark-Sweep)算法不足II 复制算法(Copying)III 标记整理算法(Mark-Compact)IV 分代收集(以上三种算法的集合体)内存划分新生代算法:Minor GC老年代算法V 查看JVM堆分配引言 垃圾回收(Garbage Collection,GC) Java支持内存动态分配、…

机器学习/数据分析案例---糖尿病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 这是一篇数据分析/机器学习很好的入门案例,对糖尿病的影响进行预测和分析通过随机森林预测,平均准确率和召回率都不错不足&#x…

Pytorch实现多层LSTM模型,并增加emdedding、Dropout、权重共享等优化

简述 本文是 Pytorch封装简单RNN模型,进行中文训练及文本预测 一文的延申,主要做以下改动: 1.将nn.RNN替换为nn.LSTM,并设置多层LSTM: 既然使用pytorch了,自然不需要手动实现多层,注意nn.RNN…

Threejs之OrbitControls轨道控制器

本文目录 前言一、Orbitcontrols(轨道控制器)1.1 基础使用1.2 代码演示 二、效果展示 前言 Orbitcontrols(轨道控制器)可以使得相机围绕目标进行轨道运动。 一、Orbitcontrols(轨道控制器) 1.1 基础使用 C…

【Python 千题 —— 基础篇】身份证隐藏的信息

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 在一个用户信息管理系统中,你需要处理和验证用户提供的身份证号。编写一个程序来从用户信息字符串中提取和验证身份证号,并提供相应的处理方式…

图论----最小生成树讲解与相关题解

目前已更新系列 当前--图论----最小生成树讲解与相关题解 滑动窗口系列算法总结与题解一 算法系列----并查集总结于相关题解 图论---dfs系列 差分与前缀和总结与对应题解(之前笔试真的很爱考) 数论---质数判断、质因子分解、质数筛(埃氏…