热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【后端教程】业务异常只能看着数据库崩溃?看看应急处理利器——自动SQL限流

作者:云矶,阿里云数据库高级开发工程师

01

背景

随着技术的发展,尤其是云数据库的普及,数据库系统变得越来越稳定,运维工作也越来越轻松,版本升级、实例迁移等都可以自动完成,上层业务不会有太大的感知。即使硬件设备或者网络出现故障,巡检系统也可以快速迁移、及时重启,保证服务稳定。**但现有的这些手段几乎都是针对服务端的稳定性保证,来自业务端的异常使用造成的问题还需要人工介入处理,**比如业务变化中引入了新的慢SQL,突然涌入的洪峰等。这些业务层面的异常发生时,上述的运维手段几乎都不能快速处理异常,防止系统崩溃。02

问题

【后端教程】业务异常只能看着数据库崩溃?看看应急处理利器——自动SQL限流

1、流量问题——突发的流量急剧上升,影响正常业务比如缓存穿透、异常调用、大促等等,造成原来并发不大的SQL,并发量突然上升。2、数据问题——有数据倾斜SQL,影响正常业务例如订单数据中存在大账号,查询该账号的相关SQL拖慢数据库。3、SQL问题——烂SQL影响正常业务比如新上线SQL调用量特别大,又没有创建索引,造成整体系统繁忙。【后端教程】业务异常只能看着数据库崩溃?看看应急处理利器——自动SQL限流

传统的处理方案(例如 Kill 问题 SQL、重启数据库、主备切换等),在面对上述问题的时候,特别无力。

往往只能看着数据库崩溃,或者呼叫开发进行处理,DBA没有非常好的处理方案。

【后端教程】业务异常只能看着数据库崩溃?看看应急处理利器——自动SQL限流

熟悉阿里云的同学,可能知道阿里云RDS MySQL版从5.6版本开始,就支持通过SQL限流的方式解决上述的问题。SQL限流顾名思义就是限制数据库上执行SQL的并发度,通过限制问题SQL的并发度后,保障数据库正常响应业务请求,保障大部分的业务正常运转,即通过小部分业务受损,保障大部分业务正常运行。该功能我们已经上线了近3年,但是从用户的反馈来说,存在如下的问题和挑战:
1、怎么能够在异常发生的时候,第一时间发现异常?2、发现异常后,怎么识别需要限流的SQL?3、怎么提取限流SQL的关键字,既能帮助业务恢复正常,又保障业务的受损最小?

4、限流执行后,怎么快速确认执行的限流操作是正确的?

除了上述的问题,在现实生活中可能还会出现各种特殊情况,比如值班人员联系不上、工作人员身边没有电脑、信息太多分析难度大、压力大紧张操作失误等。

因此需要尽可能的把异常发现、异常SQL定位、SQL限流、跟踪/回滚的整体流程自动化处理。

自动SQL限流的解决方案应运而生,该服务已经在阿里巴巴集团内部运行了2年多,并且在2020年2月在阿里云上输出,您可以在数据库自治服务DAS进行体验和使用。

03实现解读****整体流程【后端教程】业务异常只能看着数据库崩溃?看看应急处理利器——自动SQL限流

监控指标采集
在阿里云申请的RDS实例默认开启主机和引擎的性能指标采集,包括CPU,IOPS,QPS,活跃会话等,这些实时数据是后续所有分析和Action的基础。

异常检测

该模块通过机器学习对实例历史性能数据进行离线训练获得相关模型,然后利用该模型对实时指标数据进行异常检测,相比基于阈值的告警,能够更及时的发现异常,该部分的内容将在后续的系列文章中进行详细介绍。

根因定位

该模块会订阅实例上的异常事件,并采集异常时刻的会话信息,然后结合SQL审计中的全量SQL,performance_schema中的统计信息进行判断,找出实例异常的原因。我们将根因分为四种场景:

  • 阻塞型SQL

DAS会利用实时会话,锁等待,运行中的事务等进行分析,分析是否存在DDL变更,大事务,锁等待等场景,同时判断被影响会话的数量和执行时间,如果影响的会话比较多或者执行时间很长,那这不需要通过限流来解决问题,而是Kill异常会话。

  • 资源消耗型SQL,俗称为“烂SQL”

该场景中,可能SQL的并发不大,但是消耗大量的CPU或者IO或者网络资源,并且被持续不断的被提交;

  • **流量型SQL **
大量正常SQL同时在数据库中运行,触发数据库的资源瓶颈,导致即使KV类的查询SQL的响应时间都出现了异常。
  • 其他

暂时还无法归因到上述3种场景的case。

自动限流

当发现实例存在根因分析中描述的第2种和第3种场景时,会自动提取SQL特征,对异常SQL进行限流(用户授权的情况下触发)。这里面最难的问题是怎么选取SQL的特征,进行精确限流,而不会出现由于特征选取错误而导致业务全面受损。

特征选取

如果发现需要限流的异常SQL,下一步就需要确定SQL的特征,理想的情况是特征是唯一的,只对识别到的异常SQL进行限流而不影响其它SQL。这里首先要区分SQL模版限流和SQL文本限流。

  • SQL模板限流:SQL模板是指将SQL文本的具体参数抽象化后的文本,这类SQL并发度高都会产生问题且与具体参数无关,对应突增流量,无索引等场景,特征只需要包含模板特征即可。

  • SQL文本限流:这类限流主要针对数据倾斜的场景,同一类模版的一些SQL执行正常,一些SQL执行异常,特征中既要包含SQL模板信息,又要包含具体参数信息。

对于SQL模板限流,如果SQL中包含模板ID信息,会优先使用ID类信息,比如使用数据库中间件根据模板自动生成的SQL ID 或者 开发人员在SQL模板中添加的HINT信息。使用ID的优点是容易保证模板唯一,不会对其它模板的SQL造成影响,缺点是同样的SQL如果不带ID信息(比如通过命令行手动执行),仍然可以执行,不受限流并发度控制。如果不包含模板ID信息,那就需要提取文本信息。SQL模板在我们分析过程中已经计算获得。如下所示,SQL1和SQL2 计算后分别可以得到模板1和模板2。那我们对模板1进行限流,可以获得的最全特征为 select~id~name~age~from~students~where~name 。使用该特征进行限流,优点是不管从哪种连接方式发送的SQL,只要满足该特征都受限流并发度控制,缺点是存在误限的可能性,比如模板2包含模板1中的所有特征。*左右滑动阅览

/* SQL 文本1 */
select id,name,age from students where name='张三';
/* SQL 模板 1 */
select id,name,age from students where name = ?
/* SQL 文本2 */
select id,name,age from students where name='张三' and sid='唯一ID';
/*SQL 模板 2*/
select id,name,age from students where name=? and sid=?

自动优化

当根因分析发现可以优化的SQL时,除了发起限流应急处理外,还会将异常SQL发送到自动优化模块,自动创建索引,该部分的内容将在后续的系列文章中进行详细介绍。

跟踪/回滚

自动限流后,持续跟踪,如果发现限流后,数据库的负载未降低或者降低的流量和预估出现偏差,自动回滚限流操作,并再次启动根因定位。

服务推荐

  • 蜻蜓代理
  • ip代理服务器
  • 企业级代理ip
  • 微信域名检测
  • 微信域名拦截检测

推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
author-avatar
mobiledu2502857697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有