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过滤
5.2 找到要限制的SQL语句
通过"问题诊断"里面,观察到某类SQL执行特别慢,并发又特别多时,这条语句可能就是问题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
5.4 重置/终止过滤规则
当遇到设置规则错误,或者想提前终止SQL过滤,可以执行该操作。
5.5 查看过滤历史记录
凡是对该实例执行过SQL过滤功能的,都可以在这里查到记录,方便排查问题。
6 注意事项
- 该功能只能用来救急,不适合长时间运行
- 安全起见默认支持SELECT语句,建议您也优先限制SELECT语句
- 该功能只能运行在MySQL 5.6版本
- 该功能是内核层面上的改进,无论是使用高安全链路还是普通链路都可以使用
- 可以设置多个SQL过滤(根据不同的关键词)
- 如果同一类型的SQL关键词设置了多次,限制的并发按这几个并发的和限制
- 要限制的SQL语句匹配越严格越精准,对业务影响最小
如果设置的不够精准,例如SQL关键词是
SELECT~FROM~sbtest4
那匹配上述规则的SQL语句,哪怕是正常业务的,也可能被限制掉了
- 被限制后的SQL在应用端会出现
1317 query execution was interrupted
- 该限制只对被设置的实例生效,不影响主账号下面的其他实例
- 该限制规则只对新链接有效,如果想使用该规则,在设置过规则后,需要把老链接手动kill(在CloudDBA里可做)
如果您在使用CloudDBA过程中有什么问题,或者好建议,欢迎进群