一、引言
编写目的
本文详细描述了SQL限流特性的需求设计方案以及使用方式,开发、测试人员可根据本文实现功能的开发、测试,DBA可根据本文合理使用SQL限流功能。
需求概述
生产环境中可能出现由于业务量增长过快或者慢SQL等原因导致CPU使用率打满,当CPU打满时,会影响所有依赖该数据库实例的业务,因此需要有手段限制影响CPU的业务执行,保证其他核心业务不受影响。
SQL限流的目标是在出现CPU使用率打满影响所有业务时,通过限制非核心业务或者慢SQL的业务,实现核心业务的快速恢复。
软件结构
MySQL软件结构如下图所示:
参考资料
MySQL官网:https://dev.mysql.com/doc/refman/5.7/en/
二、概要设计
架构设计
总体架构如图所示,SQL限流的主要功能在执行器工作阶段通过限流规则与查询串的匹配来实现。
流程图
三、详细设计
功能设计
对外接口
针对SQL限流功能设计对外提供管理命令,如下:
- 开关控制命令(du_flow_control)
用于控制限流功能是否启用。
- 大小写敏感命令(du_flow_control_case_sensitive)
用于控制限流规则匹配时是否大小写敏感。
- 预留用户命令(du_flow_control_reserve_user)
限流功能对于预留用户不生效。
预留用户参数以字符串的形式接受输入,如果存在多个预留用户,使用 ‘,’ 进行分隔。
在服务启动时,需格式化该参数,后续在做限流判断时,需要根据格式化之后参数识别是否是预留用户,如果是预留用户,则不进行限流操作,无需进行后续的限流规则匹配。
预留用户参数接受NULL和空串 ‘’,当该参数为NULL或空串时,表明所有用户都不是预留用户。
对于预留用户字符串的处理,与MySQL社区对于用户名的处理逻辑保持一致,即忽略每个用户名前后的无意义字符(如空格、换行等),保留用户名之间的无意义字符。
- 分隔符设置命令(du_flow_control_delimiter)