开发者学堂课程【如何在PolarDB-X中进行Online DDL:如何在 PolarDB - X 中进行 Online DDL】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/986/detail/14929
如何在 PolarDB - X 中进行 Online DDL
时可以看到监控数据里面也开始收到tps的数据,Tps会有一个从原来的15到现在8700的一个快速的提升,就是主件查询。现在再来增加另外一个业务的负载adninepolardb - X - demo ~/ class -5[ SIGTNT ]> kC apply - f Sysbench - select - k . yanl现在来创建一个这样的任务
因为这个k并没有命中到主件的索引,所以现在查询的效率比较低,有一千多一点点这样的QPS,再来看一下另外一个任务,就是select的主件
他目前有1700,有一个陡降,原来是有8700加了负载之后降到了1700左右,说明新加的没有命中索引的select k本身还是非常耗系统资源的,因为他自己rt相对来说比较高,系统整体的负载占的比较多,所以就会导致整个系统目前QPS降到了2800大概这样一个水平,假如现在就是目前系统的状态,现在跑了一个数据库的系统,它叫做PolarDB - X,里面有一张表,它里面有几列,业务也正常在跑了,业务有两类的负载,第一个是基于主件的查询,第二个是基于非主件的查询,目前系统的QPS是在2800左右,来看一下select具体的SQL是什么,接近他写出来方便为大家展示,简单来说的就是一个select,Select pad这一列都从sbtest这张表,where是一个非常简单的ID等于什么都查询。
另外一个selectk是什么,他其实是将这张表所有的列选出来
这就是他的SQL,为了便于大家继续向后看操作,再来看一下sb test这张表的结构
它里面有四列,ID是他的索引列,Kc pad这样四列,是一个分表。业务的第一个需求通常是加一个列,所以目前为了演示PolarDB - X online DDL这样的能力,所谓的online就是业务正常在跑的时候,做一些DDL变更,先做一个简单的操作,在sb test1这张表里面加一列,例如现在基于业务需求加一个新的列叫做X,在业务上可能有某些意义,他还是一个char类型,长度是20,将他加在c之后,现在开始做加列的操作
,在这个中需要贯穿两件事情,第一个是ddl本身会不会报错,第二个是qps监控的曲线,如果出现了一个抖动,说明对业务的影响比较大,如果没有抖动,说明确实做到了Online这样一个效果,用了4.54秒就将这个列加好了,看下面的曲线,没有太明显的波动,稍微等一下,因为监控有一些延迟,可以看到他一直维持在2800的水平没有抖动,符合我们的预期,再来看一下这张表当前的结构
可以看到k列已经成功的加了进去,现在将他给删除
执行,完成,也用了四秒多就执行完成,可以看到qps依然没有大的变化,曲线也没有出现太大的波动,说明ddl过程对业务影响确实很小,接下来做一些比较重要的操作,例如现在业务量上涨了,这个系统的QPS不能满足我们的需求了,经过刚才简单分析之后,K列本身是没有命中的,所以导致整个系统的询效率非常低,PolarDB - X支持全局索引这样的功能,所以你可以把它看成单机数据库里的索引,所以如果查k列慢简单的操作就是把这列加入一个索引的列
所以用加索引的语句给sb test1表加一个索引,加索引的语法是与mySQL保持一致的,前面再加一个global就是全局了,给他起一个名字叫做K2,全局索引时需要指明拆分的方式,用k做一个拆分,这样就创建一个全局二级索引K2是用hash k进行拆分的,对这个操作的同时观察下面曲线的抖动的情况,因为这个操作际上需要再建一个索引表把现有的这张表里的数据需要复制过去一部分,所以这里面会有数据拷贝的过程,执行时间就比较长,用了十七点七秒,执行完成之后再看一下当前系统到q PS也就是下方的曲线,可以看到q PS向上爬升,原来是在2800这样一个水平
现在到了5200水平,有一个接近两倍的提升,也就是说现在select k开始命中全局二级索引,这样就会将系统的QPS变得比较高,同时可以看到右边的rt也降低了,同时PolarDB - X支持二级索引里面支持去除索引,也就是可以在额外的把一些其他的列的内容拷贝到索引表里面,如果你的查询所有的列都在索引里面索引表本身就可以查到所有的数据,不需要进行回到主表这样的过程,减少一次查询,这样会让你的询rt更低,系统的效率会更高一些,那么现在来创建一个这样的索引,他的语法是这样的,首先在加一个全局二级索引,他的名字叫做K3,后面加一个,覆盖到哪些列,比如我们把所有列都覆盖去,按照刚才的经验,这个ddl也要七秒的样子,稍微等一下.
执行完成,再来关注一下系统的QPS以及rt的情况,可以看到q PS提高到了8000左右,Rt也有了一个进一步的降低,从2:23毫秒降低到了1.70毫秒,这就意味着select k这样的查询已经完全命中索引,并且从全局二级索引中获取到了所有的数据,减少了一次不必要的查询,所以系统的qps再次提高,这个过程都是符合预期的,在PolarDB - X 里面可以在线的做一些ddl的变更,这些简单的加列减列,还是添加索引,删除索引等等,
对于业务的影响都是非常小的,那么PolarDB - X 还支持一些更高级低调的操作,例如现在可以将这样一个拆分的表转化成单表,比如业务在设计之初可能会这张表设计的数据量非常大,后来随着业务的变化,发现并不需要分表,只需要一个单表就可以了,那么PolarDB - X 是支持将分表转成单表的DDL操作,同时online也可以进行在线变更,接下来做这样一个演示,这个演示大家主要关注ddl是否能够正常的执行成功,语法是这样的
这里有个提示,从分表转化成单表时需要全局的二级索引给删掉,所以现将他给删掉,先将K2的删掉,然后再把K3删掉,这样全局二级索引就删掉了,再次尝试将分表转化成一个单表
看一下这个ddl会执行多久,这个ddl也涉及一个数据拷贝的过程,所以相对来说需要一些时间,22秒就完成了,再来看一下这张表的topology结构,可以看到他现在已经变成了单裤,在一个库里面存在,之前最早的时候是在16个库里面都进行分布,在可以演示一下,把它变成分库分表。语法如后面,alter table sbtest1 dbpartition by hash ( id );这次用了30秒,看一下这张表的topology结构
可以看到,又回到了当时的样子,分布在16个分库当中
看一下showds,可以看一下我们有几个存储,例如dn是0101可以看到他有两个dn,分别是零和1,然后这些库有哪些库是分布在dn上,有哪些是分布在DN0上,可以通过这个指令去看一下。这个demo就到此结束了,简单进行总结一下,一开始有一个库,还有一张表Sb test1,用Sysbench的Select ID Select k模拟流量,然后开始做ddl的一些操作,这个ddl操作包括加列,减列,添加二级索引,删除二级索引,保单表转成分表,把分表转成单表的这样一些操作,这些操作过程中的Sysbench流量也就是业务流量正常的执行以及监控曲线有没有一个明显的抖动,ddl本身完成这个也是PolarDB - X,下面简单讲解一下PolarDB - X online DDL的原理