1.前言Gartner预测,到2023年,全球3/4的数据库将运行在云端。云原生数据库最大的优势之一就是天生拥有云计算的弹性能力,数据库可以像水、电、煤一样随时可用,而自动销售能力是弹性的最终体现。数据库的弹性伸缩能力是指当数据库处于业务高峰期时,会自动扩容以增加实例资源;当业务负载下降时,会自动释放资源,降低成本。业界云厂商AWS和Azure已经在部分云数据库上实现了Autoscaling能力,而阿里云数据库也实现了其独有的Autosaling能力,由数据库内核、管控和DAS(DatabaseAutonomousService)共同打造。团队。管控团队提供数据库自动伸缩的基础能力,DAS负责性能数据的监控、伸缩决策算法的实现以及伸缩结果的呈现。DAS(DatabaseAutonomyService)是一种基于机器学习和专家经验,实现数据库自感知、自修复、自优化、自运维和自安全的云服务,帮助用户消除数据库管理的复杂性人工操作失误导致的服务和服务,有效保障了数据库服务的稳定、安全和高效。其解决方案架构如图1所示,Autoscaling/Serverless能力属于“自主运维”部分。图1.DAS解决方案架构2.Autosaling工作流数据库Autoscaling的整体工作流可以定义为如图2所示的三个阶段,分别是“When:何时触发Scaling”、“How:采用哪种方法进行MethodScaling”和“What:Scaling达到了哪些规范》。何时触发Scaling是决定数据库实例扩缩容的时机。通常的做法是观察数据库实例的性能指标,在实例负载高峰期进行扩容操作,在负载下降时进行缩容操作。这是一种常见的做法。除了React被动触发方式,我们还实现了基于预测的Proactive主动触发方式。触发时序将在2.1章节详细介绍。Scaling通常有两种形式:ScaleOut(水平缩放)和ScaleUp(垂直缩放)。以分布式数据库PolarDB为例,ScaleOut的实现是增加只读节点的数量,比如从2个只读节点增加到4个只读节点。该方式主要适用于实例负载以读流量为主的情况;ScaleUp的实现是升级实例的CPU和内存规格,比如从2核4GB升级到8核16GB。这种方式主要适用于实例负载以写入流量为主的情况。Scaling方法将在2.2章节详细介绍。扩展方式确定后,需要选择合适的规格,将实例的负载降低到一个合理的水平。例如,对于ScaleOut方法,需要确定要添加多少个实例节点;对于ScaleUp方式,需要判断升级后实例的CPU核数和内存数,以确定升级到哪个实例规格。扩展规格的选择将在2.3章节详细介绍。图2.Autoscaling工作流程图2.1Autoscaling触发时机2.1.1Reactive被动触发(基于观察)基于观察的Reactive被动触发是目前Autoscaling的主要实现形式,用户针对不同的实例设置不同的扩展和收缩触发条件。对于计算性能扩展,用户可以通过设置触发CPU阈值、观察窗口长度、规格上限、只读节点数限制、静默期等选项来配置满足业务负载的触发条件;对于存储空间的扩容,用户可以设置空间的扩容触发阈值和扩容上限,以满足实例业务的增长,避免磁盘资源的浪费。被动触发的配置选项将在第3.2节中详细介绍。Reactive被动触发的优点是实现起来比较容易,用户接受度高。然而,如图3所示,被动触发也有其缺点。通常,Scaling操作只有在满足用户配置的观测条件后才会真正执行。但是,Scaling操作的Execution也需要一定的时间。在此期间,用户实例可能长期处于高负载状态,一定程度上会影响用户业务的稳定性。图4.主动触发扩容的资源对比图我们在RDS-MySQL存储空间扩容中也实现了一种基于预测的方法。在接下来的一段时间内,存储空间会达到最大值,根据预测值选择扩容容量,可以避免实例空间快速增长带来的影响。图5基于磁盘使用趋势的预测2.2Autoscaling方法决策DAS的Autoscaling方法有两种,ScaleOut和ScaleUp。当给出Scaling方案时,会结合Workload全局决策分析模块给出更多的诊断建议(如SQL自动限流、SQL索引建议等)。图6是Scaling方法的决策示意图。示意图以PolarDB数据库为例。PolarDB数据库采用分布式集群架构,一写多读,计算存储分离。一个集群包括一个主节点和多个只读节点。主节点处理读写请求,只读节点只处理读请求。图6所示的“性能数据监控模块”会持续监控集群的各项性能指标,判断当前时刻的实例负载是否满足2.1章节描述的Autoscaling触发条件。当满足触发条件时,会进入图6的Workload分析模块。该模块会分析实例当前的Workload,通过会话数、QPS、CPU来判断实例高负载的原因实例的使用情况、锁和其他指标。如果实例被判断死了如果有锁导致的高负载,大量慢SQL,或者大事务,Autoscaling推荐也会推荐SQL限流或者SQL优化,让实例可以快速从故障中恢复并降低风险。在Autoscaling方法的决策生成模块中,会判断哪种Scaling方法更有效。以PolarDB数据库为例,该模块会根据实例的性能指标和实例的主库保护、事务拆分、系统语句、聚合函数或自定义集群等特点,判断集群当前的负载分布情况。如果流量占优势,则执行ScaleOut操作,增加集群只读节点数;如果判断当前实例以写流量为主,则执行ScaleUp操作升级集群规格。ScaleOut和ScaleUp决策的选择是一个非常复杂的问题。除了考虑实例当前的负载分布,还需要考虑用户设置的扩展规格上限和只读节点数上限。为此,我们还引入了一个效果跟踪和决策反馈模块,会在每次决策判断时分析实例在历史上的扩容方式和扩容效果,从而对当前的扩容方式做出一定的调整选择算法。图6.PolarDB的Scaling模式决策图2.3Autoscaling规格选择2.3.1ScaleUp决策算法ScaleUp决策算法是指当确定对数据库实例进行ScaleUp操作时,根据实例的工作负载确定当前实例,实例元数据。选择适当的规范参数,使实例的当前工作负载满足给定的约束条件。起初,DASAutoscaling的ScaleUp决策算法是基于规则实现的。以PolarDB数据库为例,PolarDB集群目前有8种实例规格,前期基于规则的决策算法足够用;但同时,我们也探索了分类模型,因为随着数据库技术最终迭代到serverless状态,数据库的可用规格数量会非常多,分类算法在这个场景下会非常有用.如图7和图8所示,我们目前实现了数据库规范的离线训练模型和基于性能数据的实时推荐模型。通过标注自定义CPU占用范围,参考DAS之前实现的AutoTune自动调参算法,在标注数据集中对模型进行分类,通过实现的代理流量转发工具进行验证。目前的分类算法已经达到80%以上的准确率。图7基于性能数据的数据库规格ScaleUp模型离线训练示意图图8基于性能数据的数据库规格ScaleUp实时推荐方法示意图2.3.2ScaleOut决策算法可以减少多少个只读节点实例当前的工作负载到一个合理的水平。在ScaleOut决策算法中,我们还实现了基于规则和基于分类的算法。分类算法的思路与2.3.1章节描述的基本相似。基于规则的算法思路如图9所示。首先,我们需要确定与读流量最相关的指标。这里选择com_select、qps、rows_read指标。s_i表示第i个节点的读相关指标的表征值,c_i表示第i个节点的目标约束表征值(通常使用CPU使用率、RT等直接反映业务性能的指标),f指的是目标函数,算法的目标是确定增加多少个只读节点X,使整个集群的负载降低到f函数确定的范围内。计算方法清晰有效。算法启动后,以分配后集群的CPU负载是否降低到合理水平作为评价条件。该算法的准确率达到了85%以上。采用ScaleOut分配方式后,通过ScaleOut决策算法,新加入的只读节点基本可以处于“刚刚饱和”的工作负载下,可以有效提高数据库实例的吞吐量。图9基于性能数据的基于数据库节点数的ScaleOut推荐算法示意图3.实现3.1实现架构在DAS服务中集成了Autoscaling能力。整个服务涉及异常检测、全局决策、Autoscaling服务、底层管控执行等多个模块,如图10所示。图为DASAutoscaling的服务能力架构。异常检测模块是所有DAS诊断和优化服务(Autoscaling、SQL限流、SQL优化、空间优化等)的入口,该模块会检测监控指标、SQL、锁、日志、运维事件等实时7*24小时,基于AI算法预测分析Spike、Seasonaliy、Trend、Meanshift等趋势;DAS的全局决策模块会根据实例当前的工作量给出最佳的诊断建议;当全局决策模块确定执行Autoscaling操作时,会进入第2章介绍的Autoscaling工作流,最终通过数据库底层的管控服务实现实例的扩缩容.图10.DAS与AutoScaling的服务能力架构3.2产品方案本章将介绍如何在DAS中开启Autoscaling功能。如图11所示,是DAS阿里云官网的产品首页。在该界面,可以看到DAS提供的所有功能,如“实例监控”、“请求分析”、“智能压测”等,点击“实例监控”选项可以查看该DAS访问的所有数据库实例我们点击具体实例id链接,选择“自治中心”选项,可以看到PolarDB自动扩缩容设置和RDS-MySQL自动扩容设置,如图12和图13所示。对于PolarDB实例,用户可以设置扩容规格上限、只读节点数上限、观察窗口、静默期等选项,对于RDS-MySQL实例,用户可以设置触发器等选项阈值、规格上限、存储容量上限。图11.DAS产品首页图12.PolarDB自动扩缩容设置图图13.RDS-MySQL自动扩缩容设置图3.3效果案例本章将介绍两个具体的在线案例。如图14所示,为在线PolarDB实例的计算规范Autoscaling触发图。05:00-07:00时间段,实例负载缓慢增加,最终CPU使用率超过80%。07:00触发自动扩容操作,后台的Autoscaling服务判断实例当前读流量占主导地位,于是执行ScaleOut操作,向集群添加两个只读节点。从图中可以看出,添加节点后集群的负载明显下降,CPU占用率下降到50%左右;在接下来的两个小时内,实例的业务流量不断增加,导致实例负载继续缓慢上升,所以在09:00再次达到了扩容的触发条件。当时后台服务判断实例当前写入流量占优,于是执行ScaleUp操作,将集群规格从4核8GB升级到8核16GB。从图中可以看出,规格升级后的实例负载趋于稳定,并维持了将近17个小时后,实例负载下降,触发了自动收回操作。后台Autoscaling服务将实例规格从8核16GB缩减为4核8GB,并缩减2个只读节点。Autoscaing服务将在后台自动运行,无需人工干预。高峰时扩容,低载时收容,提高业务稳定性,降低用户成本。图14.在线PolarDB横向和纵向扩容效果示意图扩容操作,累计扩容近300GB。右边是磁盘空间的增长图。可以发现,当实例存储空间快速增长时,自动空间扩容操作可以无缝进行,真正实现随时可用。避免填满实例空间,同时节省用户的成本。图15.在线RDS-MySQL空间扩展效果示意图原文链接:http://click.aliyun.com/m/1000282741/
