1 前言CloudDBA是阿里云数据库团队开发的智能诊断和优化平台,可以帮助用户更好使用阿里云数据库。
CloudDBA不断提升算法和规则,更好的匹配更多用户场景,刚刚上线了SQL过滤功能,用来解决某类SQL给系统带来的冲击。
2 功能描述匹配用户设置的关键字和并发数,对某类SQL(SELECT/UPDATE/DELETE)进行按并发数限流,当这一类SQL的并发小于并发数的进到Server层,大于并发数的丢弃。
该功能只能用来救急,不适合长时间运行。
3 对业务的影响3.1 收益限制了问题SQL后,保障DB Server端能正常响应正常业务的语句,保障大部分的业务正常运转
3.2 弊端如果设置了SQL防火墙,该SQL被限制后,应用端会收到1317错误,即
query execu
tion 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 ***test4 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~***test4~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~***test4那匹配上述规则的SQL语句,哪怕是正常业务的,也可能被限制掉了
1317 query execution was interrupted
- 该限制只对被设置的实例生效,不影响主账号下面的其他实例
- 该限制规则只对新链接有效,如果想使用该规则,在设置过规则后,需要把老链接手动kill(在CloudDBA里可做)