SQL限流

数据库自治服务DAS(Database Autonomy Service)提供SQL限流功能。您可以通过SQL限流来控制数据库请求访问量和SQL并发量,保障服务的可用性。本文将介绍如何使用SQL限流功能。

前提条件

支持的数据库引擎为:

  • RDS MySQL 5.6、5.7、8.0。

  • RDS PostgreSQL 14及以上。

  • PolarDB MySQL 5.6、5.7、8.0。

  • PolarDB-X 2.0。

限流提示

目标SQL限流规则创建后,如果应用端使用了包含所有关键词的SQL或者符合模板限流规则的SQL,限流生效时,根据不同的实例版本,数据库系统将会给出对应提示。

最大并发度

实例版本

错误码

错误提示

0或者正整数

  • RDS MySQL 5.6

  • RDS MySQL 5.7(小版本早于20200630)

  • PolarDB MySQL 5.6

1317

query execution was interrupted

正整数

RDS MySQL 5.7(小版本大于等于20200630)

5041

Concurrency control waiting count exceed max waiting count

说明

最大并发度为正整数,相关SQL会处于Concurrency control waiting(并发控制等待)状态,直至等待数量超过参数ccl_max_waiting_count的值(如果实例版本支持该参数)时,返回提示。

RDS MySQL 8.0

7534

PolarDB MySQL 5.7

3277

PolarDB MySQL 8.0

7533

0

RDS MySQL 5.7(小版本大于等于20200630)

5042

Concurrency control refuse to execute query

说明

最大并发度为0,直接报错返回。

RDS MySQL 8.0

7535

PolarDB MySQL 5.7

3278

PolarDB MySQL 8.0

7534

说明
  • 通过DAS限流时,若参数ccl_max_waiting_count值为0,DAS会将其值设置为DAS的默认值(当前默认值为10);若设置值大于0,则直接使用设置值。

  • RDS MySQL 5.7(小版本大于等于20200630)和 RDS MySQL 8.0 实例,当设置了ccl_wait_timeout参数(如果实例版本支持该参数),处于Concurrency control waiting状态的SQL超过此限制后,SQL会继续执行,不再被限流。

  • PolarDB MySQL 8.0 实例可以设置ccl_mode参数(如果实例版本支持该参数),控制超出并发数量时SQL语句的行为。

    • WAIT(默认):排队等待。

    • REFUSE:不等待,直接报错。

应用场景

场景

说明

某类SQL并发急剧上升

例如缓存穿透或异常调用,可能会导致SQL并发量突然上升。

有数据倾斜SQL

例如大促时高频查询某些热点数据,导致整体系统繁忙。

未创建索引表

例如SQL调用量特别大,且没有创建索引表,导致整体系统繁忙。

限流模式

模式

说明

支持的数据库

关键词限流

根据SQL语句中的关键词进行匹配从而限流。

说明

不支持针对某个具体的SQL语句进行限流。

  • RDS MySQL

  • PolarDB MySQL

  • PolarDB-X 2.0

SQL模板限流

输入SQL样本,将SQL样本进行模板化处理获取对应的SQL模板,对该类型SQL进行限流。

  • RDS MySQL 8.0版本且内核小版本为20230630及以上。

  • RDS PostgreSQL 14或以上版本,且实例内核小版本为20230330或以上

  • PolarDB MySQL

    • 8.0.1版本且内核小版本为8.0.1.1.31及以上。

    • 8.0.2版本且内核小版本为8.0.2.2.12及以上。

SQL模板ID进行匹配从而限流。SQL模板ID可从SQL日志、会话、EXPLAIN执行结果中获得。

说明

SQL模板ID是长度为8的十六进制字符串。

PolarDB-X 2.0企业版

执行耗时限流

根据SQL执行时间进行限流。创建了该类限流模式的规则后,当指定类型SQL的执行时间超过设定的阈值时,该类型SQL所属的模板ID会被自动加入到限流规则中,SQL会按照规则指定的并发度执行。

说明

您可以同时设置限流SQL模板ID数量上限,达到上限后,便不再自动对其他SQL创建限流规则。

PolarDB-X 2.0企业版

操作步骤

  1. 登录DAS控制台

  2. 在左侧导航栏中,单击智能运维中心 > 实例监控

  3. 找到目标实例,单击实例ID,进入目标实例详情页。

  4. 在左侧导航栏,单击实例会话

  5. 会话管理页面,单击SQL限流

  6. 在弹出窗中单击创建限流规则

  7. 在弹出的创建限流规则对话框中,根据不同的数据库引擎配置如下参数。

  8. RDS MySQL

    参数

    说明

    限流模式

    根据需要选择限流模式

    SQL类型

    选择SQL类型,取值如下:SELECTUPDATEDELETEINSERT

    说明
    • 限流模式关键词限流时,需要配置此参数。

    • 仅以下数据库引擎支持限流INSERT类型:

      • RDS MySQL 8.0

      • PolarDB MySQL 5.7、8.0

      • PolarDB-X 2.0

    • 不支持限流INSERT...SELECT...类型的SQL语句。

    数据库

    SQL限流的数据库。

    说明

    限流模式SQL模板限流时,需要配置此参数。

    最大并发度

    SQL最大并发数,允许设置的最小值为0。

    说明

    当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。

    限流时间

    SQL限流的生效时间。

    重要

    SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。

    SQL关键词

    需要限流的SQL关键词。

    说明
    • 限流模式关键词限流时,需要配置此参数。

    • 若您设置多个关键词,则SQL语句中需要同时包含这些关键词才会触发限流规则,多个关键词间用波浪线(~)分隔,且无顺序限制。

      例如原始语句为:SELECT min(id), max(id) FROM task_event WHERE gmt_modified < '2020-06-21' AND begin_time > '2020-07-09' AND source IN (527) AND id >= 15673 AND id <= 8015673 

      对应限流关键词为:SELECT~min~id~max~id~FROM~task_event~WHERE~gmt_modified~AND~begin_time~AND~source~IN~AND~id~AND~id 。

    • 不支持仅设置SELECT、INSERT、UPDATE、DELETE为限流关键词,且关键词大小写敏感(部分早期版本实例不区分)。

    SQL样本

    需要限流的样本SQL。

    说明
    • 限流模式SQL模板限流时,需要配置此参数。

    • SQL较为复杂情况下,DAS会保证最终SQL模板不变的情况下,对SQL样本进行优化,优化后限流效果不会受到影响。

      例如输入为:select name from das where name = `das` and age = 21 limit 20

      模板化为:select name from das where name = ? and age = ? limit ?

      改写为:select name from das where name = `param0` and age = `param1` limit 20

    RDS PostgreSQL

    参数

    说明

    限流模式

    RDS PostgreSQL仅支持SQL模板限流

    数据库

    限流SQL的数据库。

    搜索路径

    限流SQL的搜索路径。

    说明

    多个路径间用英文逗号,分隔,默认为information_schema,public

    最大并发度

    SQL最大并发数,允许设置的最小值为0。

    说明

    当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。

    最大等待数

    最大等待数。

    限流时间

    SQL限流的生效时间。

    重要

    SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。

    SQL样本

    需要限流的样本SQL。

    说明
    • 限流模式SQL模板限流时,需要配置此参数。

    • SQL较为复杂情况下,DAS会对SQL样本在保证SQL模板不变的情况下进行模板化,转换后限流效果不会受到影响。

      例如输入为:select name from das where name = "das" and age = 21 limit 20

      模板化为:select name from das where name = ? and age = ? limit ?

      改写为:select name from das where name = "param0" and age = "param1" limit 20

    PolarDB MySQL

    参数

    说明

    限流模式

    根据需要选择限流模式

    SQL类型

    选择SQL类型,取值如下:SELECTUPDATEDELETEINSERT

    说明
    • 当前仅以下数据库引擎支持限流INSERT类型:

      • RDS MySQL 8.0

      • PolarDB MySQL 5.7、8.0

      • PolarDB-X 2.0

    • 不支持限流INSERT...SELECT...类型的SQL语句。

    最大并发度

    SQL最大并发数,允许设置的最小值为0。

    说明

    当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。

    数据库

    限流SQL的数据库。

    说明

    限流模式SQL模板限流时,需要配置此参数。

    限流时间

    SQL限流的生效时间。

    重要

    SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。

    SQL关键词

    需要限流的SQL关键词。

    说明
    • 限流模式关键词限流时,需要配置此参数。

    • 若您设置多个关键词,则SQL语句中需要同时包含这些关键词才会触发限流规则,多个关键词间用波浪线(~)分隔,且无顺序限制。

      例如原始语句为:SELECT min(id), max(id) FROM task_event WHERE gmt_modified < '2020-06-21' AND begin_time > '2020-07-09' AND source IN (527) AND id >= 15673 AND id <= 8015673 

      对应限流关键词为:SELECT~min~id~max~id~FROM~task_event~WHERE~gmt_modified~AND~begin_time~AND~source~IN~AND~id~AND~id 。

    • 不支持仅设置SELECT、INSERT、UPDATE、DELETE为限流关键词,且关键词大小写敏感(部分早期版本实例不区分)。

    SQL样本

    需要限流的样本SQL。

    说明
    • 限流模式SQL模板限流时,需要配置此参数。

    • SQL较为复杂情况下,DAS会对SQL样本在保证SQL模板不变的情况下进行模板化,转换后限流效果不会受到影响。

      例如输入为:select name from das where name = "das" and age = 21 limit 20

      模板化为:select name from das where name = ? and age = ? limit ?

      改写为:select name from das where name = "param0" and age = "param1" limit 20

    PolarDB-X 2.0

    参数

    说明

    限流模式

    根据需要选择限流模式

    SQL类型

    选择SQL类型,取值如下:SELECTUPDATEDELETEINSERT

    说明
    • 当前仅以下数据库引擎支持限流INSERT类型:

      • RDS MySQL 8.0

      • PolarDB MySQL 5.7、8.0

      • PolarDB-X 2.0

    • 不支持限流INSERT...SELECT...类型的SQL语句。

    最大并发度

    SQL最大并发数,允许设置的最小值为0。

    说明

    当满足限流策略的SQL同时执行,并达到最大并发数时,触发SQL限流。

    限流时间

    SQL限流的生效时间。

    重要

    SQL限流是应急措施,建议您按实际需求设置限流时长,用完及时关闭。

    SQL关键词

    需要限流的SQL关键词。

    说明
    • 限流模式关键词限流时,需要配置此参数。

    • 若您设置多个关键词,则SQL语句中需要同时包含这些关键词才会触发限流规则,多个关键词间用波浪线(~)分隔,且无顺序限制。

      例如原始语句为:SELECT min(id), max(id) FROM task_event WHERE gmt_modified < '2020-06-21' AND begin_time > '2020-07-09' AND source IN (527) AND id >= 15673 AND id <= 8015673 

      对应限流关键词为:SELECT~min~id~max~id~FROM~task_event~WHERE~gmt_modified~AND~begin_time~AND~source~IN~AND~id~AND~id 。

    • 不支持仅设置SELECT、INSERT、UPDATE、DELETE为限流关键词,且关键词大小写敏感(部分早期版本实例不区分)。

    SQL模板ID

    需要限流的SQL模板ID,模板ID为长度为8的十六进制字符串, 多个SQL模板ID间用英文逗号,分隔。

    说明

    PolarDB-X为企业版,并且限流模式SQL模板限流时,需要配置此参数。

    最小SQL执行耗时

    SQL执行时间的阈值,当SQL的执行时间大于设置的阈值时,系统会将该类型SQL所属的SQL模板ID加入到限流规则中。

    说明

    PolarDB-X为企业版,并且限流模式执行耗时限流时,需要配置此参数。

    限流SQL ID数量上限

    通过执行耗时限流的SQL模板ID数量上限,达到上限后,系统不再对其他执行时间大于设置阈值的SQL创建限流规则。

    说明

    PolarDB-X为企业版,并且限流模式执行耗时限流时,需要配置此参数。

    被限流SQL的数据库账号

    被限流SQL所属的数据库账号。

    说明

    限流模式关键词限流SQL模板限流时,需要配置此参数。

  9. 单击提交,完成创建。

    SQL限流规则创建完成后,您可以在运行中页签查看SQL限流规则的相关信息。列表中的参数信息如下:

    说明

    不同的数据库引擎和限流模式,列表中的参数略有差异。

    参数

    说明

    限流模式

    您所选择的模式。

    限流规则

    • 关键字限流:限流关键字配置信息。

    • SQL模板限流:该限流样本对应的模板ID信息。

    • 执行耗时限流:配置的执行耗时的执行时间阈值/限流模板SQL的数量。

    最大并发度

    SQL最大并发数。

    最大等待数

    限流规则配置的最大等待数。

    说明

    数据库实例为RDS PostgreSQL, 且限流模式SQL模板限流时,展示此参数。

    限流时间(分钟)

    SQL限流的生效时间。

    开始时间

    限流规则配置时间(生效时间)。

    剩余时间

    限流规则失效的剩余时间。

    限流SQL样本

    限流SQL样本配置。

    说明

    限流模式SQL模板限流时,展示此参数。

    限流模板ID

    限流SQL样本对应模板ID。

    说明

    限流模式SQL模板限流时,展示此参数。

    状态

    运行中规则为启用状态。

    数据库

    限流SQL数据库。

    说明

    限流模式SQL模板限流时,展示此参数。

    搜索路径

    限流SQL对应的搜索路径。

    说明

    数据库实例为RDS PostgreSQL, 且限流模式SQL模板限流时,展示此参数。

    匹配SQL数量

    限流规则配置下,匹配到的SQL数量。

    说明

    限流模式SQL模板限流时,展示此参数。

    等待SQL数量

    限流规则配置下,正在等待SQL数量。

    说明

    限流模式SQL模板限流时,展示此参数。

    操作

    关闭修改限流规则的操作按钮。

相关文档

相关API

API

描述

EnableSqlConcurrencyControl

启用SQL限流。

DisableSqlConcurrencyControl

关闭指定限流规则。

DisableAllSqlConcurrencyControlRules

关闭全部正在执行的限流规则。

GetRunningSqlConcurrencyControlRules

获取正在执行的限流规则。

GetSqlConcurrencyControlRulesHistory

获取正在执行或被触发过的限流规则。

GetSqlConcurrencyControlKeywordsFromSqlText

根据SQL语句生成限流关键词。