业务异常只能瞅着数据库崩溃?别慌,数据库自治服务DAS的自动SQL限流功能来了!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 作者:云矶,阿里云数据库高级开发工程师

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

01、背景

随着技术的发展,尤其是云数据库的普及,数据库系统变得越来越稳定,运维工作也越来越轻松,版本升级、实例迁移等都可以自动完成,上层业务不会有太大的感知。即使硬件设备或者网络出现故障,巡检系统也可以快速迁移、及时重启,保证服务稳定。

但现有的这些手段几乎都是针对服务端的稳定性保证,来自业务端的异常使用造成的问题还需要人工介入处理,比如业务变化中引入了新的慢SQL,突然涌入的洪峰等。这些业务层面的异常发生时,上述的运维手段几乎都不能快速处理异常,防止系统崩溃。

02、问题

1、流量问题——突发的流量急剧上升,影响正常业务
比如缓存穿透、异常调用、大促等等,造成原来并发不大的SQL,并发量突然上升。

2、数据问题——有数据倾斜SQL,影响正常业务
例如订单数据中存在大账号,查询该账号的相关SQL拖慢数据库。

3、SQL问题——烂SQL影响正常业务
比如新上线SQL调用量特别大,又没有创建索引,造成整体系统繁忙。

传统的处理方案(例如 Kill 问题 SQL、重启数据库、主备切换等),在面对上述问题的时候,特别无力。
往往只能看着数据库崩溃,或者呼叫开发进行处理,DBA没有非常好的处理方案。

熟悉阿里云的同学,可能知道阿里云RDS MySQL版从5.6版本开始,就支持通过SQL限流的方式解决上述的问题。

SQL限流顾名思义就是限制数据库上执行SQL的并发度,通过限制问题SQL的并发度后,保障数据库正常响应业务请求,保障大部分的业务正常运转,即通过小部分业务受损,保障大部分业务正常运行。

该功能我们已经上线了近3年,但是从用户的反馈来说,存在如下的问题和挑战:

1、怎么能够在异常发生的时候,第一时间发现异常?
2、发现异常后,怎么识别需要限流的SQL?
3、怎么提取限流SQL的关键字,既能帮助业务恢复正常,又保障业务的受损最小?
4、限流执行后,怎么快速确认执行的限流操作是正确的?

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

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

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

03、实现解读

整体流程

整体流程.png

监控指标采集

在阿里云申请的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发送到自动优化模块,自动创建索引,该部分的内容将在后续的系列文章中进行详细介绍。

跟踪/回滚

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

04、如何使用

该功能在阿里集团内部已经稳定运行一年以上,可以做到1分钟发现异常,5分钟定位原因,10分钟恢复,极其有效的减少了故障发生。

目前,功能已在阿里云的数据库自治服务 DAS 上线,正在火热邀测中,点击阅读原文即可申请。

接下来每周我们会有系列文章,深度解读DAS的AutoScale、异常检测服务、自动SQL优化服务、基于Workload的SQL Review、智能压测、智能调参等等,敬请关注。

数据库自治服务 DAS 正在免费邀测中
这里
立即申请体验吧!

相关实践学习
使用DAS实现数据库自动扩容和回缩
暂无
目录
相关文章
|
7天前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
30 0
|
3月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
4月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
105 16
|
4月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
4月前
|
数据库连接 PHP 数据库
【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
|
4月前
|
PHP 数据库
【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
|
5月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
169 9
|
4月前
|
数据库
【YashanDB知识库】数据库审计shutdown immediate操作导致数据库异常退出
【YashanDB知识库】数据库审计shutdown immediate操作导致数据库异常退出
|
4月前
|
数据库
【YashanDB知识库】调整NUMBER精度,再执行统计信息收集高级包偶现数据库异常退出
【问题分类】功能使用 【关键字】NUMBER类型精度修改,统计信息收集 【问题描述】调整表中NUMBER字段精度时,数据库在收集统计信息时会异常退出。原因是YashanDB处理NUMBER字段精度时误踩内存。 【解决方法】锁定涉及NUMBER精度调整的表的统计信息;升级数据库至22.2.13.100及以上版本。 【影响范围】22.2.13.100以前版本。
|
6月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
625 6