CloudDBA新功能上线--SQL过滤/限制/防火墙

1 前言

CloudDBA是阿里云数据库团队开发的智能诊断和优化平台,可以帮助用户更好使用阿里云数据库。
CloudDBA不断提升算法和规则,更好的匹配更多用户场景,刚刚上线了SQL过滤功能,用来解决某类SQL给系统带来的冲击。

2 功能描述

匹配用户设置的关键字和并发数,对某类SQL(SELECT/UPDATE/DELETE)进行按并发数限流,当这一类SQL的并发小于并发数的进到Server层,大于并发数的丢弃。
该功能只能用来救急,不适合长时间运行。

3 对业务的影响

3.1 收益

限制了问题SQL后,保障DB Server端能正常响应正常业务的语句,保障大部分的业务正常运转

3.2 弊端

如果设置了SQL防火墙,该SQL被限制后,应用端会收到1317错误,即

query execution was interrupted

4 适用场景

如果业务方能够接受舍小(小部分业务损失)保大(大部分业务正常运转),可以进行限流;
如果不能接受上述报错,就要接受整个业务被拖垮的可能。

4.1 能解决的场景

4.1.1 某类SQL并发急剧上升,影响正常业务

比如缓存穿透,或者异常调用,可能会造成原来并发不大的SQL语句,并发量突然上升

4.1.2 有数据倾斜SQL,影响正常业务

比如大促时拉取某个特别大的数据,造成整体系统繁忙

4.1.3 未创建索引SQL,影响正常业务

比如新上线SQL调用量特别大,又没有创建索引,造成整体系统繁忙

4.2 处理误区

4.2.1 切换主备

以前碰到上述情况,见有的运维人员是切换主备尝试解决上述问题,主备的配置是一样的,如果主库有问题,同样的请求到备库也是同样的问题,所以切换是解决不了问题的。

4.2.2 kill问题语句

kill语句是可以减少系统压力,未尝不是一种处理手段。但是,请求是不断进来的,不停kill语句手都酸了吧?

4.3 可以尝试的解决方法

上面提到这个功能只是应急手段那么如何才能解决该类问题呢?

  • 提高缓存命中率
  • 使用只读实例
  • 快速加索引

5 使用方式

5.1 路径

RDS控制台->找到具体实例->CloudDBA->问题诊断->SQL过滤
CloudDBA新功能上线--SQL过滤/限制/防火墙

5.2 找到要限制的SQL语句

通过"问题诊断"里面,观察到某类SQL执行特别慢,并发又特别多时,这条语句可能就是问题SQL,经过再三确认(根据经验,跟业务开发,跟老板)后就可以限制并发啦。
例如:
CloudDBA新功能上线--SQL过滤/限制/防火墙
想限制下面这类语句:

SELECT * FROM sbtest4 WHERE top_cmt_id=99738 AND status in (1,3)  and parent_cmt_id >= 0 order by add_time desc limit 0,20

就要执行下面的步骤

5.3 创建过滤规则

5.3.1 SQL类型

是限制SELECT语句还是限制UPDATE语句还是限制DELETE语句,安全起见默认支持SELECT语句,建议您也优先设置SELECT语句

5.3.2 最大并发度

该次限制的SQL最大允许在Server端跑多少个

5.3.3 限流时间

允许SQL过滤最大执行时间;超过了指定时间,就会自动终止该限制

5.3.4 SQL关键词

SQL过滤的匹配关键词,多个关键词之间以~分隔,不要有空格之类的特殊字符
接着上面的例子,SQL关键词我可以这样拼写

SELECT~FROM~sbtest4~WHERE~top_cmt_id~status~parent_cmt_id~order~add_time~desc

CloudDBA新功能上线--SQL过滤/限制/防火墙

5.4 重置/终止过滤规则

当遇到设置规则错误,或者想提前终止SQL过滤,可以执行该操作。
CloudDBA新功能上线--SQL过滤/限制/防火墙

5.5 查看过滤历史记录

凡是对该实例执行过SQL过滤功能的,都可以在这里查到记录,方便排查问题。
CloudDBA新功能上线--SQL过滤/限制/防火墙

6 注意事项

  • 该功能只能用来救急,不适合长时间运行
  • 安全起见默认支持SELECT语句,建议您也优先限制SELECT语句
  • 该功能只能运行在MySQL 5.6版本
  • 该功能是内核层面上的改进,无论是使用高安全链路还是普通链路都可以使用
  • 可以设置多个SQL过滤(根据不同的关键词)
  • 如果同一类型的SQL关键词设置了多次,限制的并发按这几个并发的和限制
  • 要限制的SQL语句匹配越严格越精准,对业务影响最小

如果设置的不够精准,例如SQL关键词是

SELECT~FROM~sbtest4

那匹配上述规则的SQL语句,哪怕是正常业务的,也可能被限制掉了

  • 被限制后的SQL在应用端会出现
1317 query execution was interrupted
  • 该限制只对被设置的实例生效,不影响主账号下面的其他实例
  • 该限制规则只对新链接有效,如果想使用该规则,在设置过规则后,需要把老链接手动kill(在CloudDBA里可做)

如果您在使用CloudDBA过程中有什么问题,或者好建议,欢迎进群
CloudDBA新功能上线--SQL过滤/限制/防火墙

上一篇:MongoDB选型及注意问题点


下一篇:orcl数据库的导入 导出