阿里在数据库智能优化路上,做了哪些探索与

近期,中国应用性能管理大会(简称APMCon)圆满落幕。阿里巴巴数据库事业部高级技术专家乔红麟发表了题为《数据库智能优化系统的探索与实践》的演讲,现场解读了过去几年阿里巴巴数据库团队在面对数据库规模急速增长以及业务变化越来越快的情况下在智能数据库诊断优化方面的一些探索和实践经验。

乔红麟  阿里巴巴数据库技术团队技术专家

花名洪林,阿里巴巴数据库技术团队技术专家。年加入阿里巴巴集团,目前负责阿里巴巴数据库智能诊断优化产品CloudDBA开发,曾参与OcanBas云平台开发。年毕业于北京邮电大学,先后在多家外企从事过服务器虚拟化(Xn/KVM),存储及备份(EMC/DataDomain),分布式存储等相关技术开发工作。

阿里数据库优化服务诉求

业务诉求

首先从整个阿里数据库的角度看一下对于数据库优化服务的业务诉求,这也是我们做这个产品最大的驱动力。

1、服务产品化。

阿里业务发展速度远远超过了DBA团队发展的速度,单独依靠DBA重人工支持模式变得越来越困难,因此我们在几年前开始尝试通过产品来完成DBA人工做的一些工作。通过产品解决DBA人工服务的扩展性问题,是我们最直接的诉求,希望能把DBA人工服务产品化。

2、全局规模优化。

站在全局角度来看,数据库规模迅速增大的同时也带来了巨大的成本压力。成本这块怎么理解呢?只要业务有需求,理论上可以通过增加更多的机器来满足业务需求。但是从另外一个角度来讲,这些机器是不是一定要加,是不是有一些机器可以通过优化节省下来给新的业务服务。当规模非常大的时候,所做的一小点规模化优化,所节省的成本可能都是很可观的。因此我们需要有全局规模优化的能力,仅仅一个数据库实例内部做的优化都是一些局部优化,以全局角度来看是不够的。

3、主动诊断。

从运维的角度来看,阿里同其它公司一样,就是要尽量避免故障的发生。在阿里的业务场景下,大部分业务跟数据库有着非常紧密的关系。数据库一个微小的抖动,都可能对业务造成非常大的影响,所以如何让数据库更稳定是非常重要的业务诉求。比如一个最常见的情况,有很多线上SQL性能是有问题的,这些SQL会给业务稳定性带来一定的风险。那么我们能不能通过产品主动对线上有问题的SQL进行主动诊断,提前做优化,而不是SQL引起故障后才去优化。

4、智能异常发现。

线上业务负载不断地变化,业务行为、用户行为也在不断地变化。传统基于阈值设置报警的方式无法可靠、及时地发现数据库故障或者异常。如何可靠地去发现数据库异常,甚至是提前预测到故障的发生并进行及时干预,是有很强的业务需求的,但同时也有非常大的技术挑战,尤其是在阿里这么大数据库规模场景下。

5、容量预估。

还有一些业务诉求是容量预估的需求。比如什么时候需要扩容,如何更精准地对数据库容量做出预估,这些方面后面我会稍微展开一下。

用户诉求

另外一部分诉求是使用数据库这些人的诉求,也就是我们的开发人员。每个公司数据库服务方式有所不同。这里我列了一些开发人员经常会问到的一些问题,这些问题背后的诉求让我们思考我们的产品站在开发者的角度,要解决什么问题。在业务发生异常的时候,需要快速定位到整个链路到底哪块出了问题。之前DB对于开发者来说是一个黑盒,不管是信息透明方面,还是大家对数据库领域的知识方面,对于DB的了解程度可能都不够,不知道DB是什么状态,发生了什么问题。具体来讲用户诉求主要有:

1、信息透明,自助优化。

我们期望用户能够自助发现和解决数据库的性能问题,并非发现问题先去找DBA,这样整个流程会比较长,时间成本也比较高。但做到自助化,首先用户能够全面了解数据库的运行情况。

2、持续优化。

只要业务在线上运行就会不断的变化,业务负载不断变化、用户行为也会不断变化。所以数据库优化是个持续的过程,并不是今天发现一个问题解决了,以后就不出现问题了。尤其是互联网的应用,持续优化尤其重要。

3、量化跟踪,流程闭环。

开发人员经常会问到一个问题,上次帮他做的优化,结果到底怎么样。我们知道并不是每个优化都是实际有效的,因为很多优化方案是基于当时的信息和场景做的一个判断,实际优化结果只有当应用之后才能真正去做评估、做衡量,所以我们要提供量化跟踪和评估的能力。另外,我们期望整个优化流程,从发现问题到最终解决问题在产品内能够闭环,开发人员能够自己完全自助化走完整个流程,而不需要DBA的参与。流程闭环也是产品必须具备的能力。

4、输出产品,而不是人。

不断有新的业务上线,而我们的DBA就这么多人,并且每个人有不同的侧重。对于一些快速发展的业务,在早期我们可能没有DBA去做特别支持的,但这些业务的数据库反而是容易出问题的。开发人员如果能够通过产品解决问题,而不是凡事都去找DBA,解决问题的效率会更高。将我们DBA的能力通过产品进行输出,更好去支持我们的业务。

所以今天我们做CloudDBA产品,是希望我们能够通过产品的方式把DBA专家服务提供给业务开发同学,实现DBA人力的扩展。同时我们需要具备全局规模优化能力,这是在阿里对数据库优化服务的业务诉求和用户诉求,也是我们做CloudDBA这个产品的动机。

CloudDBA关键技术

首先简单介绍下CloudDBA在阿里的发展历程。

早期我们团队有很多非常牛的DBA,经常是一个人当千军万马的感觉,那个阶段优化更多依赖于DBA人工完成。之后我们开发了一些工具,让工具来完成简单的优化操作。几年前我们的理念转变为所有数据库服务都应该由产品来做,所以我们在数据库运维,管理,优化等方面都有相应的产品,开始进入自动化阶段。

未来数据库优化服务会从自动化发展到智能化,这是我的判断。今天仍然有很多问题是解决不了的,比如精确的容量预估,智能的异常发现,故障提前预警等。现在我们有非常多的数据,也有数据加工分析的技术,所以我们开始进行一些探索,通过数据分析和机器学习等技术手段来解决之前解决不了的问题。比如最简单的容量预估,每年都会做预算,做容量预估。

至少我现在还没有看到特别多的公司去用很科学的方式,完全基于业务目标以及历史数据的分析来做容量预估。很多时候容量预估是靠拍脑袋决定的,但是今天有了大量的数据和加工数据的技术手段,我们是不是可以做更精准的容量预估。举这个例子来说明一下,未来很多的优化应该向智能化方向去思考,去探索。

CloudDBA在阿里大概是这样的一个发展历程,我们今天还处于自动化阶段,但同时也有一些智能化的实践。未来我的判断是我们一定向智能化去走,后面会在这方面尝试更多的探索。

那么CloudDBA到底是什么?

PPT上面有一句话,“CloudDBA是一个数据库智能优化产品,面向开发人员提供自助化诊断优化服务,致力于成为用户身边的数据库专家。”CloudDBA不是给DBA开发的工具,CloudDBA从一开始我们的用户定义就很明确。我们是面向使用数据库的开发人员提供这种自助化的诊断优化服务,我们的用户不是DBA,而是真正使用数据库的开发同学。面向DBA和面向开发同学对产品来讲是完全不同的概念。比如开发同学没有太多数据库背景知识,我们即使做简单的信息透明,也需要做一些翻译,能够让开发同学理解。用户定义不同,数据的加工、分析以及最终的呈现,都是完全不一样的。

接下来讲一下CloudDBA到底能做什么。这是我们简化版的整体架构,涉及的面比较广。从下到上分为四层:

1、最下面是我们的采集层。

对所有数据库进行实时的秒级数据采集,包括性能指标,日志数据、SQL流水,DB内部的一些信息等等。

2、采集完之后数据到达计算层,计算层分两大块。

一部分是实时计算,对于SQL流水,监控指标等,都会做实时计算和展示。另一部分是离线分析,比如性能基线,读写热点,统计报表等。

3、再往上就是数据库诊断服务层。

如果大家做过系统的数据库优化,就清楚数据库优化会涉及到很多方面。最常见的就是SQL优化,SQL是不是很慢、有没有走到最优路径、SQL写法是否合理等等。SQL相关问题是我们开发经常会遇到的。还有其他一些问题,比如说空间,会话,锁,安全,配置等,CloudDBA能够对DB的每一个方面提供相应的专家诊断服务。

4、最上面是接入层。

在阿里内部通过企业数据库服务平台iDB作为入口向开发同学提供数据库优化服务。

接下来跟大家分享一下我们做这个产品的一些产品设计原则。如果大家也在做类似的产品,希望能够给大家一些参考。

之前我们数据库优化主要是DBA来做,但DBA人工优化不具备扩展性,CloudDBA第一个设计原则就是要提供自助化服务,希望整个优化过程只有开发参与,并且整个优化流程能在CloudDBA里实现闭环。由于业务负载会不断地变化,需要对所有线上数据库进行持续的主动诊断,及时发现和解决数据库性能问题。

另外这个产品需要有全局的视角,能够从全局角度发现规模优化点,具备规模优化能力,并且能够量化规模优化的收益。

还有最后两点非常重要,首先就是数据驱动。从我个人理解,今天要做这样一个优化产品,首先要有足够的数据,然后用数据分析和挖掘的技术手段,再结合数据库领域知识,给出更合理的诊断优化建议。智能化是我们对于数据库优化产品未来发展方向的判断,也是我们一直在坚持探索的。

时间关系今天无法全部展开,接下来重点展开几个方面。一个是CloudDBA的SQL优化怎么做的,还有一个是空间优化,另外就是CloudDBA全量SQL采集和分析。最后会分享一下我们在智能化方向的探索。

SQL诊断

先说一下SQL优化,不知道大家平时做SQL优化时是怎样的流程。大家回想一下,你是怎么发现哪些SQL需要优化的?要知道优化什么,为什么要优化它,然后再考虑怎么去优化。还有一个问题是优化完之后效果到底怎么样,是不是真的有效。整个优化过程不管是开发还是DBA做,都需要形成一个闭环。

CloudDBA产品实现了这么一个闭环。第一步决定哪些SQL需要优化,第二步是如何优化,第三步是优化后效果如何,要做量化跟踪,确认是不是有效。如果发现没有效果,再次重复这个优化流程,直到问题被解决。

这是CloudDBA里SQL优化的大概流程。我们实现了一个类似MySQL优化器的What-ifoptimizr。

举个例子说明一下What-ifoptimizr是什么。比如一条SQL查询有10个可选的访问路径,MySQL优化器目标是要从这10个路径选择访问代价最低的一个路径。而What-ifoptimizr要做的事情是如何规划出第11条路,让这条路比现有的10条路都快。难点在于这条路是不存在的,这个路怎么修,修完之后是不是真的更快,这些是What-ifoptimizr要解决的问题。

比如一个常见的SQL优化手段是索引,那建什么样的索引会比当前所有执行路径都好?这是我们的SQL优化引擎要解决的问题,也是我们产品比较核心的部分。大家可以看一下这个流程,前面几步跟MySQL或者其他优化器类似,但后面的候选索引生成,代价评估,优化建议合并等都不一样。我们的输入是一条SQL或者一个SQLworkload,输出是对应的优化建议,比如新建索引,SQL改写等。

SQL优化最关键的是要有全面准确的统计信息作为输入,另外就是它不能是规则式的,因为SQL的执行路径与数据分布有很大的关系。同样一条SQL,数据分布不一样,实际执行路径可能会完全不一样。

SQL优化这块有几个关键点需要强调一下:

1、全局视角。

如果业务SQL非常多,假设有类SQL(模板化后),挑选哪些SQL来优化是非常关键的。是对这类都做优化,还是选出其中一些重要的SQL?通常会选择性能有问题的SQL优化,但怎么选呢?CloudDBA有全量SQL性能统计数据,会分析出查询效率低且有优化空间的SQLWorkload来进行优化。

2、代价评估(Cost-basdOptimizr)。

比如一条SQL可能会有多个索引建议,哪个建议是最优的?候选索引生成阶段确定某列是不是可以放到候选索引里,也需要结合统计信息来评估。这些过程都需要基于代价进行评估,而不是规则。

3、动态采样。

优化器在做路径选择时很重要的一个输入是统计信息,对于我们的What-ifoptimizr也一样。我们通过动态采样来获取代价评估所需要的统计信息,包括Cardinality,Frquncy还有Histogram等。数据倾斜比较严重的时候,Histogram对做出准确的代价评估非常关键。为了更准确的代价评估,所以我们实现了一个动态采样系统。

量化跟踪

CloudDBA的SQL诊断在阿里内部怎么使用呢?

我们选择出要优化的SQL之后会有一个优化按纽来发起诊断流程。对单条SQL来讲,诊断结果包括SQL文本,现在的执行计划大概是什么样子,以及我们针对这条SQL给出的优化建议。比如这个SQL给出一个新建索引的建议。这个建议我们目前直接给到了开发,开发同学会可以应用这个建议,自助去创建这个索引。

那如何判断索引建议是否有效?前面提到优化流程闭环很重要的一环就是量化跟踪。这里有一个例子,是CloudDBA推荐的索引被开发采纳后24小时的性能量化跟踪情况。这两个框圈出来的时间点是索引生效的时间点,下面两个图表示优化建议被采纳前后的性能对比。会分析这个优化建议对直接优化SQL,以及该索引可能影响到的SQL,以及整个实例的性能影响,来量化判定和评估这次这个优化的建议是否有效。

能够发现问题,找出问题根本原因,给出问题解决方案,并且可以应用到线上,然后完成量化评估,整个优化闭环在产品里做到闭环。只有这样,开发自助优化才能真正实现,我们才能拿到最终的优化结果,中间少任何一环都很麻烦。比如说没有量化评估手段,用户采纳建议的动力就会小很多,因为即使应用了之后,也无法知道到底是不是有效。

空间优化

接下来简单说一下空间优化。

不知道大家平时有没有







































治白癜风有什么偏方
什么医院治疗白癜风效果最好



转载请注明:http://www.guyang114.com/bdyh/yxgj/6930.html