首先,咱们先来看一下数据库远程运维运维的开展趋势。榜首个阶段是无序化运维,尽管许多大的甲方公司基本不存在这个问题,可是乙方公司或许是小型甲方公司都有这个问题,运维全赖人,没有规章制度,也没有很好的梯队建造。第二个阶段是标准化运维,这个阶段除了人员的添加,更重要的是要有东西和文档的堆集。第三个阶段是主动化运维,即让机器干机械的事。什么是机械的事?便是重复劳动,例如装置、布置,乃至是某些监控报警和弹性扩容。这儿的弹性扩容指的是当空间和资源不够了,咱们去弥补添加,而这些操作都是一些可控的机械化动作。第四个阶段是智能化运维,尽管现在关于智能化运维的评论很火,可是客观来说,现在绝大多数公司还处于理论阶段。
以咱们公司为例,现在保护的Oracle数据库大概是5000套左右,而咱们的Oracle DBA团队在五年前是五六十人左右。5年期间,公司业绩以每年翻70%左右的速度生长,而公司业绩的生长、客户量的添加势必会带来一个问题,那便是需求扩展团队规划。可是,咱们在业绩翻番的时候,团队成员数量也没有添加。为什么呢?由于咱们的运维作业一路从标准化过渡到主动化再到智能化,人均产值一直在提升。
以咱们公司为例,现在保护的Oracle数据库大概是5000套左右,而咱们的Oracle DBA团队在五年前是五六十人左右。5年期间,公司业绩以每年翻70%左右的速度生长,而公司业绩的生长、客户量的添加势必会带来一个问题,那便是需求扩展团队规划。可是,咱们在业绩翻番的时候,团队成员数量也没有添加。为什么呢?由于咱们的运维作业一路从标准化过渡到主动化再到智能化,人均产值一直在提升。
无序化运维高度依赖工程师价值,所以无论是甲方仍是乙方都会碰到一个问题,那便是该岗位的人离任了怎样办呢?我常常会碰到这种状况,十几年前的一个体系没人敢去动它,由于之前保护的人离任了,该体系就一直跑在那里,Oracle数据库乃至还或许是跑在8i阶段。
师傅领进门,修行在个人。几乎没有任何一个师傅会是他在那儿敲命令,让你在周围看着,再加上没有文档、流程等制度化的东西能够给到新人,让新人只靠个人去生长,速度是很慢的。
人不够了?招!当公司业绩在走上坡路的时候,几乎每个部门都会面对缺人的状况,假如每个部门都去找老板请求,那么老板或许会很厌烦。剩余价值怎样克扣呢?:)
标准化运维和主动化运维靠的是流程、制度、文档和东西去履行。例如实时监控、日志剖析、快速布置、弹性扩容、毛病处理等都有许多的重复劳动,只靠人来运维的话,或许分身乏术,但假如依靠机器去布置、处理、巡检,那么就能解放许多劳动力。
智能化运维,简略来说便是让机器干人的事。以咱们公司为背景介绍,许多甲方客户的数据库都是能够上云的,这意味着其网络是能够打通的,所以,为了最大的复用DBA价值,咱们推出了远程DBA。
在网络打通之后,客户的一些高档信息都会实时推送到咱们二线DBA的邮件、微信以及手机客户端。咱们成立了一支二线DBA团队,专门处理这些事情。由于这些运维日志来自于五花八门的客户,包含银行、公安、医疗、社保等等,所以收集上来之后咱们会做一些机器学习,再结合每套体系的事务节奏,咱们就能够提早预知哪些数据库或许哪个事务模块或许产生问题或许说即将产生问题。
大屏监控是我和我团队最近一年来一直在琢磨的东西。现在80%的监控都是以结果为导向,比如当空间缺乏了,监控报警。当CPU资源率到达90%了,再给一个报警。但其实监控不仅仅是给运维人员用的,更是给小白用户用的,由于他们不通晓数据库,所以才需求去看监控。
可是这儿就又呈现了一个问题,既然用户不太懂数据库,那么只告诉他一个结果是没有用的。所以咱们想设计一张简略易懂的大屏,就算做不到咱们都能看懂,至少也要有80%的人能看懂。因此,咱们的大屏不是以结果为导向,而是以输入输出流程及时刻模型的角度联动展现各项目标。
监控大屏以进程为导向,例如CPU资源使用率到达100%时,那么大屏显示出问题的环节,如在SQL履行的生命周期中,明确指出SQL哪个环节呈现了问题,乃至能够联动的显示出受影响的各个环节。当然并不是一切的问题都会在大屏里显示出来,大概会包含80%以上的常见数据库毛病。
五大健康指数是最夺目的一个环节。榜首个是可用性,这张大屏主要是针对Oracle,不过SQL Sever、MySQL除了一些技术实现细节,概念方面是通用的,如服务、监听、实例、表空间等。
第二个是功用,功用目标没有一千也有八百,如何挑选一个目标去反映数据的功用好坏呢?咱们思考了好久!一般状况下,咱们读取数据都有个进程,如从磁盘上读上来,再读到内存里面,从内存里面读数据块的进程就叫逻辑读。数据库本质上便是一个存数据和读数据的进程,存数据之前要先把数据块读上来,这对Oracle来讲便是一个逻辑读。衡量逻辑读也有两个细化目标,一是逻辑读的时刻,正常状况下单个逻辑读的时刻是几纳秒,假如呈现了几十倍的上升,那么必定是呈现问题了。二是逻辑读次数,假如逻辑读次数急剧上升,那么也肯定是呈现问题了,应用产生了改变或许是SQL的履行计划产生了剧烈改变。
第三个是过错,相信在一切的告警里,咱们最关心的便是过错,咱们会推送数据库运转进程中的过错到大屏。
第四个是改变,数据库产生问题了肯定是来自于改变。所以咱们在监控里将改变作为一个重要要素放入其间。数据库中的目标有没有变多,权限有没有变更,空间使用有没有变高等等,一旦这个库产生改变,咱们就会把它投到大屏里。
最后是可靠性,也便是备份,由于一般的生产库肯定是有备份或许灾备的,所以咱们也会挑选最重要的几个目标放到大屏上。
SQL生命周期监控,SQL生命周期可分为登陆、解析、履行、提交四个阶段,所以咱们把整个库的功用也剖析成四个环节,每个环节别离进行机器学习。由于每套体系的事务结构都不相同,而个人经历又很有限,盲目判别很容易出问题,所以需求机器学习去动态学习每个事务体系的节奏。
以履行环节为例,需求用履行次数和每次履行的时刻去衡量这个环节是不是有问题。假如通过多个事务周期的学习,履行次数和时刻是相对固定的,那我就以为这是个正常值。假如忽然在某个事务中某个目标超出这个正常值的范围,那我就以为这是出问题了或许是即将出问题。
通过改变和比较,能够直观凸显功用瓶颈。
资源相关剖析,主要是检查我的数据库资源是不是快要缺乏了?做数据库DBA的都知道数据库资源包含processes、session、DB files和jobs,而咱们常常碰到的数据库功用三大资源锁是Mutex、Latch和Lock,主机四大资源是CPU、内存、存储和网络。
这是大屏的细化图,除了上文提到的机器学习部分,整个模型进程中都需求去强化训练。例如在履行阶段的履行数和履行时刻,也有许多其它环节需求去学习。
机器学习有什么用途?危险反常猜测是老生常谈了,这儿就不再打开讲了,咱们谈谈另一个用户为决策供给依据。在不改变事务的状况下,DBA能够知道下个时刻,库空间有多大?按照这个趋势开展什么时候资源会缺乏?什么时候需求准备扩容?
由于咱们的客户量比较大,所以涉及到库的类型也比较多。不过,数据库版别虽多,可是万变不离其宗,它们肯定是运转在小机上或许X86上,选用的硬件都差不多。在咱们的数据堆集进程中,发现许多厂商的硬盘毛病率并没有他们标榜的那么好。从上图中,咱们能够看到,机器刚刚运过来时,或许由于路上有波动或许其他原因,毛病率是最高的,而一个月之后毛病率就会下降,当到了必定生命寿命周期之后,就又上升了。
得到了这种趋势,咱们就能够辅导用户存储上线的时刻。如在榜首个月最好是进行跑批等测验,当测验没问题了之后,再上线。这样的话上线之后会安稳许多,这便是一个经历+数据辅导用户决策的很好例子。
日常智能巡检,许多用户都会去做,但咱们不同的当地是加入了机器学习的成分。咱们都知道脚本是死的,一套脚本跑遍一切库,给出来的主张肯定是有问题的。并且数据库数量许多的状况下,人工写巡检陈述也是很大的作业量。
所以,咱们的巡检结合了某些目标进行动态的采样、动态的剖析、动态的调整,乃至还能够主动书写巡检陈述出来。巡检陈述并不是巡检结果的一个简略展现,还需求做一些智能化的主张。主动巡检陈述完成之后,DBA再进行人工审阅,并给出自己的主张,构成最终完好的巡检陈述。
上图是咱们巡检渠道的截图。
智能功用解析也是供给给小白DBA使用的,这个功用的灵感来源于医院体检。医学专业术语许多,也很杂乱,可是体检陈述咱们都看得懂。为什么呢?由于体检陈述会在各项数值之后都会标明正常、过高或过低。
同样,咱们也能够把它应用在咱们的AWR陈述中。一般来说,AWR陈述都会有几十页,假如SQL许多的话或许会到达上百页。假如是一个新手DBA去看这个陈述,或许无从下手。但假如咱们开发这样一个功用,它把AWR陈述上传之后,咱们把每个环节都帮他解析掉,并反馈给他一份新的陈述。这份新陈述中包含了一切的问题,乃至是哪些SQL是什么问题。并且假如渠道能连到你的数据库,我还能够给出主张这条SQL如何改。
这对小白用户来说简直是大喜讯,不仅把长篇大论的几十页AWR陈述浓缩成几页的新陈述,并且还能够简略明了的看到问题出在哪里,乃至能够依据主张批改过错。
毛病处理,咱们现已能主动处理空间之内的容量毛病。可是 Oracle报一个600过错或是其它八怪七喇的过错,想要依靠机器或许软件把它处理掉或许剖析出原因,难度实在很大。并且Oracle是一个商业化软件,版别更迭是难以避免的,而这对咱们来说就意味着要一直追着Oracle的屁股跑,很明显,咱们没有那么大的精力投入其间。
在探索阶段我碰到了几个问题,榜首个是尽管我能够通过必定的趋势去猜测毛病,可是或许有些毛病并没有归入到毛病列表中,那机器仍是处理不了;第二个是不同要素之间的搅扰,不止是Oracle,其它数据库也相同都是并发性很强的数据库,一个要素或许会影响到其它要素,导致一个毛病像滚雪球相同引发大面积的瘫痪。不同要素的搅扰是一件非常痛苦的事情,不同要素有不同的因子,反映在机器学习里就有不同的变量,并且这些变量的权重还不相同。
当时咱们能做到的是什么呢?首先是处理容量缺乏类毛病。当空间、主机等资源缺乏了,能够主动去扩容。其次是保存毛病现场。还有便是快速止损,许多客户都有考核标准,例如在30分钟内处理掉毛病,那么就不需求上报领导或许上级机构。所以,即使是一个在DBA看来很严重的问题,只需你能及时康复,那么对客户来说便是小问题。
如何快速止损呢?通常的手法是重启数据库或许杀会话。可是这又带来一个问题,数据库重启了,会话杀掉了,过后怎样剖析?现场破坏了之后,人为就很难进一步剖析了。所以在引进快速止损时要先保存毛病现场,也便是说在重启数据库之前,要把那个时刻的主机资源、空间资源、内存、进程等等材料都保存下来。并且保存毛病现场必需要东西化,否则靠人工敲命令,时刻很快就消逝了。
总之,快速止损和保存毛病现场是必须用起来的一套组合拳。
快速止损是当时数据库智能化运维范畴中最易实现的,那么现在有哪些快速止损的手法呢?不同的毛病对应不同的止损手法。假设是监听出问题了,那么就要重启监听,但这个问题的关键是如何判别监听出问题了以及如何在监听之前把这些状态保存下来?这个话题有点广,下次再说:)
其他的常见快速止损手法还包含实例重启、Kill进程、Kill锁、空间扩容、主机资源扩容、固化履行计划、阀值告警以及现场保存。其间,通过长时间的实践发现,数据库主动化程度越高,履行计划骤变的概率越大,而履行计划一旦产生变异的话,机器学习就要立即响应,通过调用调用响应时刻正常值的履行计划,把它固化掉,让体系功用康复正常。