开发指南—DAL语句—SQL限流

简介: 为应对突发的数据库请求流量、资源消耗过高的语句访问以及SQL访问模型的变化等问题,PolarDB-X提供了节点级别的SQL限流功能来限制造成上述问题的SQL执行,从而保证实例的持续稳定运行。本文介绍如何使用SQL限流功能。

创建限流规则

  • 语法
CREATE CCL_RULE [ IF NOT EXISTS ] `ccl_rule_name`
ON `database`.`table`
TO '<usename>'@'<host>'
FOR { UPDATE | SELECT | INSERT | DELETE }
[ filter_options ]
with_options
filter_options:
    [ FILTER  BY KEYWORD(‘KEYWORD1’, ’KEYWORD2’,…) ]
    [ FILTER  BY TEMPLATE(‘template_id’) ]
    
 with_options:
    WITH MAX_CONCURRENCY = value1 [ , WAIT_QUEUE_SIZE = value2 ] [ , WAIT_TIMEOUT = value3 ] [ ,FAST_MATCH = { 0 , 1 }]
  • 表 1. 参数说明
参数 是否必选 说明
限流规则匹配参数 `ccl_rule_name` 必选 限流规则的名称。

说明 为避免名称与SQL关键字冲突,建议在规则名称前后各加一个反引号(`)

`database`.`table` 必选 数据库和数据表的名称,支持使用星号(*)表示任意匹配。

说明 为避免名称与SQL关键字冲突,建议在库表名称前后各加一个反引号(`)。

'<usename>'@'<host>' 必选 账号名称。其中Host部分支持用百分号(%)来表示任意匹配。
UPDATE | SELECT | INSERT | DELETE 必选 SQL语句类型。当前支持UPDATE、SELECT、INSERT和DELETE类型。

说明 每条限流规则仅支持传入一种类型的SQL语句。

[ filter_options ] 可选 过滤条件,支持包括如下两种条件:
  • 关键词(KEYWORD):查看限流规则时,关键词列表会在查询结果中被转化为["kwd1","kw2","kw3"...]的字符串形式,最多支持512个字符。说明
    • 若关键字是SQL语句中的参数值,匹配时大小写敏感。
    • 若关键字是SQL语句中的其他词,匹配时大小写不敏感。
  • 模版(TEMPLATE):模版编号是SQL日志中的sql_code值,该值是参数化后的SQL语句(SQL模版)以16进制表示的哈希值。您可以通过SHOW FULL PROCESSLIST和EXPLAIN命令查看模版编号。
限流规则行为控制参数 with_options 必选 WITH选项中支持如下4个参数来控制限流规则的行为:
  • MAX_CONCURRENCY:匹配到该限流规则的SQL语句的最大并发度,超过后进入等待队列。取值范围:[0~231 - 1],默认值为0。
  • WAIT_QUEUE_SIZE:超过并发度后的最大等待队列长度。当等待队列长度超过该值后,SQL语句将报错。在队列中的语句仍然占用了线程资源,排队过多时也可能导致内存耗尽。取值范围:[0~231 - 1],默认值为0。
  • WAIT_TIMEOUT:SQL语句在等待队列中的最长等待时间,超过该等待时间后,SQL语句将报错。取值范围:[0~231 - 1],单位为秒,默认值为600。
  • FAST_MATCH:是否开启Cache来加速匹配。开启后,PolarDB-X 2.0会将模版编号作为Cache key的一部分,匹配结果作为value进行缓存,来加速匹配速度。取值范围:0表示关闭,1表示开启,默认开启。

说明

  • 创建限流规则时,需从上述4个行为控制参数中至少选择一个传入。
  • MAX_CONCURRENCY为默认值(0)时,可能会使匹配到的所有SQL返回错误。此时,建议您显式指定该参数为非0的值。
  • PolarDB-X 2.0是分布式云原生数据库,计算层由多个节点组成,因此每个节点的并发度之和是整个实例的并发数最大值。在负载不均衡的情况下,整个实例的受限制SQL并发数可能无法达到最大并发数。

  • 说明 仅当一个SQL语句满足所有的匹配参数条件时,才会根据该规则的WITH选项进行限流。
  • 限流结果一条SQL匹配到该规则后,根据限流规则中WITH选项里配置的参数,会出现如下几种结果:
    • RUN(可运行)若并发度还未达到最大并发度(即MAX_CONCURRENCY参数值),该SQL正常执行不会被限流。
    • WAIT(等待中)若并发度已经达到最大并发度,但等待队列长度还未达到最大长度(即WAIT_QUEUE_SIZE参数值),该SQL进入等待状态,直到进入可运行(RUN)状态,或者等待超时(WAIT_TIMEOUT)状态。
      您可以通过如下命令查看由于匹配到限流规则而等待的SQL语句:
mysql> SHOW FULL PROCESSLIST;
    • 返回结果示例如下:
+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+

| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | SQL_TEMPLATE_ID |
+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+
| 2 | polardbx_root | *...*:62787 | polardbx | Query | 0 | | show full processlist | NULL |
| 1 | polardbx_root | *...*:62775 | polardbx | Query(Waiting-selectrulereal) | 12 | | select 1 | 9037e5e2 |
+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+
2 rows in set (0.08 sec)
    • 从上述查询结果可以看出:SQL语句select 1由于限流规则selectrulereal而处于等待(Waiting)状态。
    • WAIT_TIMEOUT(等待超时)SQL语句进入等待状态后,当等待时间超过最长等待时间(即WAIT_TIMEOUT参数值)时,该语句将会返回错误。
      例如,设置了一条最长等待时间为10秒的限流规则,执行SELECT sleep(11)语句时会因为等待超时而报错,示例如下:
ERROR 3009 (HY000): 11a07e23fd800000[polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal after waiting for 10060 ms
    • KILL(结束)并发度和等待队列长度均已经达到最大值,客户端将收到提示超过最大并发度的报错,报错信息中会包含匹配上的限流规则的名称。
      例如,在并发度和等待队列长度均已经达到最大值后执行SELECT 1;命令,会出现如下报错:
ERROR 3009 (HY000): 11a07c4425c00000[polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal
    • 上述结果表示:该SQL语句SELECT 1;由于超出了限流规则selectrulereal设置的最大并发度而执行失败。
  • 示例假设需要创建一条名为selectrule的规则,用于限制由'ccltest'@'%'用户发起的,包含cclmatched关键字的,且对任意表执行SELECT操作的SQL语句,同时将最大并发度设置为10。
    规则创建语句如下:
CREATE CCL_RULE IF NOT EXISTS `selectrule` ON . TO 'ccltest'@'%'
FOR SELECT
FILTER BY KEYWORD('cclmatched')
WITH MAX_CONCURRENCY=10;

查看限流规则

  • 语法
    • 查看指定限流规则语法如下:
SHOW CCL_RULE `ccl_rule_name1` [, `ccl_rule_name2` ]
    • 查看所有限流规则语法如下:
SHOW CCL_RULES
  • 示例使用如下命令查看当前数据库下所有的限流规则:
mysql> SHOW CCL_RULES \G
  • 返回结果如下:
 1. row **
NO.: 1
RULE_NAME: selectrulereal
RUNNING: 2
WAITING: 29
KILLED: 0
MATCH_HIT_CACHE: 21374
TOTAL_MATCH: 21406
ACTIVE_NODE_COUNT: 2
MAX_CONCURRENCY_PER_NODE: 1
WAIT_QUEUE_SIZE_PER_NODE: 100
WAIT_TIMEOUT: 600
FAST_MATCH: 1
SQL_TYPE: SELECT
USER: ccltest@%
TABLE: .
KEYWORDS: ["SELECT"]
TEMPLATEID: NULL
CREATED_TIME: 2020-11-26 17:04:08
  • 表 2. 参数说明
参数 说明
NO. 匹配优先级,数字越小,优先级越高。
RULE_NAME 限流规则名称。
RUNNING 匹配到该限流规则且正常执行的SQL语句数量。
WAITING 匹配到该限流规则且正在等待队列里的查询数量。
KILLED 匹配到该限流规则且被KILL的SQL语句数量。
MATCH_HIT_CACHE 匹配到该限流规则且命中Cache的SQL语句数量。
TOTAL_MATCH 匹配到该限流规则的总次数。
ACTIVE_NODE_COUNT 计算层中启用了SQL限流的节点数。
MAX_CONCURRENCY_PER_NODE 每个计算节点的并发度。
WAIT_QUEUE_SIZE_PER_NODE 每个计算节点上等待队列的最大长度。
WAIT_TIMEOUT SQL语句在等待队列的最大等待时间。
FAST_MATCH 是否启动缓存加速匹配速度。
SQL_TYPE SQL语句类型。
USER 用户名。
TABLE 数据库表。
KEYWORDS 关键词列表。
TEMPLATEID SQL模版的编号。
CREATED_TIME 创建时间(本地时间),格式为yyyy-MM-dd HH:mm:ss

删除限流规则


说明 被删除的限流规则会立即失效,此时该规则下等待队列中的SQL语句全部会被正常执行。

  • 删除指定限流规则:
DROP CCL_RULE [ IF EXISTS ] `ccl_rule_name1` [, `ccl_rule_name2`, ...]
  • 删除所有限流规则:
CLEAR CCL_RULES

慢SQL限流

  • 一键开启按语句类型分,默认为SELECT类型,相同语句类型的命令,有更新作用。语法结构如下:
SLOW_SQL_CCL GO [ SQL_TYPE [MAX_CONCURRENCY] [SLOW_SQL_TIME] [MAX_CCL_RULE]]
    • SQL_TYPE取值:ALL,SELECT,UPDATE,INSERT,默认为SELECT。
    • MAX_CONCURRENCY默认值为CPU核数的一半。
    • SLOW_SQL_TIME默认值为系统参数SLOW_SQL_TIME的值。
    • MAX_CCL_RULE的默认值为1000。
  • 动作:
    • 遍历整个实例的session,识别出该语句类型慢SQL的TemlateId。
    • 创建针对慢SQL的限流触发器,名称为:_SYSTEM_SLOW_SQL_CCL_TRIGGER_{SQL_TYPE}_。
    • 传递慢SQL的TemplateId给限流触发器,由限流触发器创建限流规则。
    • Kill所有该语句类型的慢TemplateId查询。
  • 一键关闭删除由SLOW_SQL_CCL创建的限流触发器,连带着会删除由限流触发器创建的限流规则。语法结构如下:
SLOW_SQL_CCL BACK
  • 查看限流情况。语法结构如下:
SLOW_SQL_CCL SHOW
  • plan_cache和ccl_rules里以模版ID作为join key的一次inner join。
  • 如何干预慢SQL的阈值?
    • 设置SLOW_SQL_CCL GO中的语法。
    • 在一键开启SQL限流之前,设置用户变量slow_sql_time。如下:
set @slow_sql_time=2000;
slow_sql_ccl go;
    • 在控制台上设置系统参数SLOW_SQL_TIME。
  • 说明 后面的设置方式会被前面的设置方式所覆盖。
相关文章
|
存储 负载均衡 NoSQL
|
Docker 容器
docker备份容器到本地(以及恢复)
docker备份容器到本地(以及恢复)
1515 0
|
监控 Cloud Native 关系型数据库
【跨区域PolarDB-MySQL主备互通】:揭秘如何跨越万里实现数据无缝同步,打造坚不可摧的灾备体系!
【8月更文挑战第20天】阿里云PolarDB是一款兼容MySQL协议的云原生数据库服务,提供高性能与高可用性。本文介绍如何在PolarDB-MySQL中实现跨区域主备同步。首先创建主备两个集群,接着通过MySQL复制功能配置同步:获取主节点复制信息、配置备节点复制并启动复制进程。最后,通过`SHOW SLAVE STATUS\G;`监控复制状态,确保数据同步正常。此方法可提升数据的可靠性和可用性,需考虑网络条件对性能的影响。
578 0
|
存储 安全 虚拟化
虚拟化技术:实现资源高效利用和灵活管理的利器
虚拟化技术作为实现资源高效利用和灵活管理的重要手段,在数字化时代背景下,正逐步改变传统IT架构模式。本文概述了虚拟化技术的概念、原理及其在数据中心管理、云计算平台、企业信息化建设、科研教育及医疗行业的应用,并探讨了其面临的挑战与未来发展趋势。
669 3
|
监控 数据可视化 架构师
为什么企业需要开展架构治理?
随着数字化转型加速,企业面临的技术和业务环境日益复杂,传统架构难以应对快速变化的需求。企业架构治理成为数字化转型的关键,通过确保技术与战略对接、优化资源利用、降低风险和复杂性,提升企业灵活性、效率和创新能力,支持快速响应市场变化,推动数字化转型成功。
562 7
为什么企业需要开展架构治理?
|
11月前
|
SQL 机器学习/深度学习 运维
SQL优化有绝招,使用DAS提升工作效率!完成任务可领取保暖手套!
数据库自治服务(Database Autonomy Service,简称DAS)是一种基于机器学习和专家经验实现数据库自感知、自修复、自优化、自运维及自安全的云服务。数据库自治服务DAS支持自动SQL优化,相比传统的优化方式,能够自动识别问题SQL,生成索引优化建议。
|
11月前
|
弹性计算 运维 监控
云资源运维与管理体验分享
作为一名开发工程师,我分享了在云资源运维与管理中的体验。健康状态功能实时监控ECS实例的关键指标,如CPU负载、内存使用率等,及时预警并解决问题,确保业务连续性。诊断功能通过日志分析和性能剖析快速定位复杂问题,提升故障处理效率。建议优化包括自定义告警阈值、多维度数据展示、自动化修复、集成更多日志源及建立用户反馈机制。这些功能显著提升了系统的稳定性和运维效率。
199 4
|
12月前
|
运维 监控 安全
天财商龙:云上卓越架构治理实践
天财商龙成立于1998年,专注于为餐饮企业提供信息化解决方案,涵盖点餐、收银、供应链和会员系统等。自2013年起逐步实现业务上云,与阿里云合作至今已十年。通过采用阿里云的WA体系,公司在账号管理、安全保障、监控体系和成本管控等方面进行了全面优化,提升了业务稳定性与安全性,并实现了显著的成本节约。未来,公司将持续探索智能化和全球化发展,进一步提升餐饮行业的数字化水平。
|
12月前
|
弹性计算 监控 安全
云上IT“新”治理:体系化助力企业上好云、用好云、管好云
随着云计算的普及,企业上云已不再是难题,如何用好和管好云成为新的挑战。阿里云通过Landing Zone和Well-Architected Framework(WAF)帮助企业搭建安全合规、可扩展的多账号环境,并提供涵盖安全、稳定性、效率、成本和性能五大支柱的最佳实践。其中,Landing Zone助企业构建隔离环境,内置财务管理、资源规划等模块;WAF则提供详细指导原则,确保企业在云上的应用环境安全、稳定、高效。此外,阿里云还推出了一系列工具和服务,如身份权限管理、配置审计、成本分析等,助力企业提升云治理成熟度。
|
机器学习/深度学习 安全 物联网
操作系统的未来趋势与挑战
随着科技的不断进步,操作系统作为计算机系统的核心,其发展趋势和面临的挑战备受关注。本文将从数据导向、科学严谨和逻辑严密的角度,探讨操作系统的未来发展方向和可能遇到的挑战。通过对相关数据的深入解读和分析,揭示操作系统在性能优化、安全性提升、跨平台兼容性等方面的发展趋势;同时,结合科学家的观点和经典理论,阐述操作系统在未来可能面临的技术瓶颈和安全隐患等挑战。最后,文章将提出一些建设性的建议,以期为操作系统的发展提供有益的参考。