Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

news2024/11/20 1:50:31

在数字化系统扮演重要角色的今天,数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言,突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能,用户可以从管理流程入手规范变更的测试,或者利用产品手段减少预期外的变化。然而,这仍旧无法完全规避突发的SQL性能问题,其中的原因包括但不仅限于:

  1. 数据量和数据分布剧烈变化,从前被验证过的执行计划可能变得效率更低。
  2. 数据库中的查询变得越来越复杂,优化器对执行计划的选择存在不可控因素。
  3. 频繁的业务更新给测试带来巨大压力,未经充分验证的 SQL 有潜在的性能问题 。

对于一些对延迟非常敏感的应用而言,这些潜在问题有可能对业务造成不可估量的损失。 如何降低这类不可控的突发问题对业务的影响,是摆在每个管理者面前的难题。

做为资源管控的一部分,TiDB 在 7.2.0 引入 Runaway Queries 管理,并持续增强,旨在通过系统化的手段缓解上述难题。

本文将从从适用场景、实现原理等角度详细介绍 TiDB 的 Runaway Queries 管理功能,并通过一个示例展示其在系统中的作用。

什么是 Runaway Queries

Runaway Queries 是指执行时间或消耗资源超出预期的查询,在运行时间和资源消耗上有显著特征。

Runaway Queries 管理旨在提供一种高效、可控、自动化的资源识别和管控机制,以降低突发 SQL 性能问题带来的负面影响,保护复杂工作负载下系统的稳定性,让 TiDB 更加可靠。

Runaway Queries 管理适用哪些场景

● 为了保障重要系统的服务质量,需要能够自动识别并处理异常 SQL 性能问题。

● 当遇到突发 SQL 性能问题,但又没有立即有效的修复手段时,希望临时缓解其影响。

● 当已知个别 SQL 有安全或性能问题,希望加入黑名单或对其进行限流。

Runaway Queries 管理能做什么

Runaway Queries 管理主要提供两个重要能力,即对查询的 “识别” 和 “处置” 。

3.1 查询的识别

TiDB 资源管控模块提供 两类 识别方式

● 动态识别 - 根据运行时规则识别 。指根据 SQL 实际运行指标自动识别 (通过 resource group 定义),目前支持利用 EXEC_ELAPSED 设置实际执行时间,即当查询运行时间超过 EXEC_ELAPSED 的定义时,这个查询会被识别为 Runaway Query。比如:

ALTER RESOURCE GROUP default QUERY_LIMIT=(EXEC_ELAPSED='5s', ACTION=KILL);

○ 上面命令执行的效果是, 属于 default 资源组的查询运行超过 5 秒钟,那么这个查询会被识别为 Runaway Query。 (识别规则的生效范围为“资源组”,如果你没有创建任何资源组,那么可以修改 default 资源组的规则将会对全局有效。 )

○ TiDB 特意提供了每个资源组 Query Max Duration 的监控指标,能够查看一段时间内运行时间最长的查询,这个指标能够协助设置一个合理的 EXEC_ELAPSED .

Resource Group 的定义同时支持将识别到的 SQL 特征同时加入监控列表特定一段时间,即一段时间内,资源管控直接识别 SQL 特征而无需用规则识别。相当于将 SQL 放入监控名单,并阶段性检查是否它已经恢复健康。

ALTER RESOURCE GROUP default QUERY_LIMIT=(EXEC_ELAPSED='5s', ACTION=KILL, WATCH=SIMILAR DURATION='10m');

○ 上述例子里,我们向配置里加入了 WATCH 规则, 那么和被识别成 Runaway Query 查询类似的查询(比如只有过滤值不同),在接下来的 10 分钟里,会直接执行对应操作,而不会再等待 5 秒。10 分钟之后,如果这个查询的性能已经恢复,则不再对其进行限制;如果没有恢复,则再次对这个查询监控 10 分钟。

● 静态识别 - 根据 SQL 特征识别 。自动筛选规则并不能精确的识别出所有有问题的查询,因此我们加入了对监控列表的人工管理。通过 query watch 命令定义 SQL 特征识别及处置规则, 能够达到数据库查询黑名单的作用。目前已支持的 SQL 特征的设置:

○ SQL Text : 根据 SQL 文本做精确匹配。

○ SQL Digest : 根据 SQL Digest 匹配模式相同的查询。比如 select c from t1 where a=1 和 select c from t1 where a=2 拥有相同的 Digest。

○ Plan Digest : 根据 Plan Digest 匹配执行计划相同的查询。相同 SQL 可能存在多个执行计划,造成性能问题的往往是其中少部分执行计划。

SQL 特征可以通过“慢查询”等方式采集,这里是一个“慢查询”示例

SELECT count(1)    FROM  sbtest.sbtest1 AS S1        ,sbtest.sbtest2 AS S2        ,sbtest.sbtest3 AS S3  WHERE S1.c=S2.c     AND S1.c=S3.c;
# Time: 2023-09-19T17:16:56.640436+08:00
...
# Digest: d3c7846bb8f6b817ae395db30eadedec57af08f7983466f68db93d9ce1ac5872
...
# Plan_digest: 41fee801f07e06aa4aba4c0142ce4c624e8dc932c9e14d49854b8ce57366b443

用户可以根据经验选择其中一种识别方式,比如下面例子里用 SQL DIGEST 子句将类似的查询加入监控队列, 那么和此查询类似的查询会被识别并做出对应的处置。

mysql> QUERY WATCH ADD ACTION KILL SQL DIGEST 'd3c7846bb8f6b817ae395db30eadedec57af08f7983466f68db93d9ce1ac5872';
Query OK, 0 rows affected (0.01 sec)
​
mysql> SELECT * FROM INFORMATION_SCHEMA.RUNAWAY_WATCHES ORDER BY id\G
*************************** 1. row ***************************
                 ID: 54
RESOURCE_GROUP_NAME: default
         START_TIME: 2023-09-20 01:59:14
           END_TIME: UNLIMITED
              WATCH: Similar
         WATCH_TEXT: d3c7846bb8f6b817ae395db30eadedec57af08f7983466f68db93d9ce1ac5872
             SOURCE: manual
             ACTION: Kill
1 row in set (0.04 sec)

3.2 查询的处置

处置 , 指被识别到的 Runaway Queries 要如何处理。目前支持以下几个处理方式。

● DRYRUN : 仅识别不做处理,在日志和对应视图中显示。 初期配置的时候,可以利用 DRYRUN 试运行一段时间,检测是否有误判的风险。

● COOLDOWN : 将查询置于资源组的最低优先级,限制其处理速度。

● KILL : 终止被识别的查询,防止其进一步影响数据库性能。

○ 在 7.5.0 版本, COOLDOWN 在复杂场景下的限制作用有限,如果对服务质量要求比较高,则推荐设置 KILL

在这个例子里,被识别为 Runaway Queries 的查询会被自动取消。

ALTER RESOURCE GROUP default QUERY_LIMIT=(EXEC_ELAPSED='5s', ACTION=KILL, WATCH=SIMILAR DURATION='10m');

3.3 历史记录及观测性

以上所有的设置,及识别和处置的历史记录,TiDB 提供了一组系统表用于查询:

● INFORMATION_SCHEMA.RESOURCE_GROUPS : 资源组定义,包括对 Runaway Queries 识别规则和处置设置。

● INFORMATION_SCHEMA.RUNAWAY_WATCHES : 监控队列中的规则。

● MYSQL.TIDB_RUNAWAY_QUERIES : 记录被识别和处置的 Runaway Queries 历史记录。

运行示例

  1. 正常负载下, 整体 QPS 接近 11k , P999 在 50ms 上下。
  2. 出现一个异常查询,每秒提交一次,运行时间在 3~8 秒, QPS 从 11K 急剧下降至 3K 左右,P999 由 60ms 增加到 200ms 。
  3. 这时我们尝试向 default 资源组加入一条规则,自动杀掉运行时间超过 1 秒的查询。QPS 回升至 7.5k , P999 下降。
mysql> alter resource group default QUERY_LIMIT=(EXEC_ELAPSED='1s', ACTION=KILL);
Query OK, 0 rows affected (1.02 sec)
​
mysql> SELECT * FROM information_schema.resource_groups;
+---------+------------+----------+-----------+--------------------------------+------------+
| NAME    | RU_PER_SEC | PRIORITY | BURSTABLE | QUERY_LIMIT                    | BACKGROUND |
+---------+------------+----------+-----------+--------------------------------+------------+
| default | UNLIMITED  | MEDIUM   | YES       | EXEC_ELAPSED='1s', ACTION=KILL | NULL       |
+---------+------------+----------+-----------+--------------------------------+------------+
1 row in set (0.01 sec)

通过系统表 mysql.tidb_runaway_queries ,我们看到 Runaway 管理开始介入,有问题的 SQL 被持续标记并处理。

mysql> select * from mysql.tidb_runaway_queries limit 1 \G
*************************** 1. row ***************************
resource_group_name: default
               time: 2023-09-19 15:18:10
         match_type: identify
             action: kill
       original_sql: SELECT count(1)
  FROM  sbtest.sbtest1 AS S1
       ,sbtest.sbtest2 AS S2
       ,sbtest.sbtest3 AS S3
 WHERE S1.c=S2.c
    AND S1.c=S3.c
        plan_digest: 41fee801f07e06aa4aba4c0142ce4c624e8dc932c9e14d49854b8ce57366b443
        tidb_server: 127.0.0.1:4000
​
​
mysql> select count(*) from mysql.tidb_runaway_queries;
+----------+
| count(*) |
+----------+
|       56 |
+----------+
1 row in set (0.02 sec)

这里 QPS 仍没有回升至原先的水平, 因为虽然会把运行超过 1 秒的查询杀掉,但每个查询仍旧都会运行 1 秒,对系统仍旧造成消耗 。

  1. 修改资源组规则,把符合 runaway 规则的查询的文本,加入到监控列表中,时长为 5 分钟。 这意味着,如果文本匹配到被标记为 runaway 的查询,那么会被直接杀掉,不再等待 1 秒;而每隔 5 分钟,TiDB 会自动放开限制,检查一下查询的性能是否恢复。如果恢复,则不再对此查询进行取消处理 。这时系统的 QPS 和 P999 恢复到阶段 1 的水平。
mysql> alter resource group default QUERY_LIMIT=(EXEC_ELAPSED='1s', ACTION=KILL, WATCH=EXACT DURATION='5m');
Query OK, 0 rows affected (0.53 sec)
​
mysql> SELECT * FROM information_schema.resource_groups;
+---------+------------+----------+-----------+-------------------------------------------------------------+------------+
| NAME    | RU_PER_SEC | PRIORITY | BURSTABLE | QUERY_LIMIT                                                 | BACKGROUND |
+---------+------------+----------+-----------+-------------------------------------------------------------+------------+
| default | UNLIMITED  | MEDIUM   | YES       | EXEC_ELAPSED='1s', ACTION=KILL, WATCH=EXACT DURATION='5m0s' | NULL       |
+---------+------------+----------+-----------+-------------------------------------------------------------+------------+
1 row in set (0.00 sec)

查看视图,有一条 watch 规则生成:

mysql> SELECT * FROM INFORMATION_SCHEMA.RUNAWAY_WATCHES ORDER BY id\G
*************************** 1. row ***************************
                 ID: 50
RESOURCE_GROUP_NAME: default
         START_TIME: 2023-09-19 16:58:20
           END_TIME: 2023-09-19 17:03:20
              WATCH: Exact
         WATCH_TEXT: SELECT count(1)
  FROM  sbtest.sbtest1 AS S1
       ,sbtest.sbtest2 AS S2
       ,sbtest.sbtest3 AS S3
 WHERE S1.c=S2.c
    AND S1.c=S3.c
             SOURCE: 127.0.0.1:4000
             ACTION: Kill
1 row in set (0.01 sec)

有问题的查询被执行时会直接退出,告知已经被监控隔离:

ERROR 8254 (HY000): Quarantined and interrupted because of being in runaway watch list

至此,我们看到, 通过对异常查询的自动识别和监测,能够有效限制个别 SQL 的资源消耗, 缓解其对整体性能的影响。

在上述示例中,即使没有设置资源组对查询的自动识别,在出现 SQL 性能问题时,我们仍可以通过“慢日志”或者系统表找出问题查询的“特征”,用 QUERY WATCH 手工将查询加入监视列表,达到设置黑名单的效果。

展望

TiDB Runaway Queries 管理的一个显著优势是提升了用户体验。通过自动化和手动管理的结合,用户能够更轻松地监控和控制数据库中的 Runaway Queries,避免它们对正常业务的干扰。

未来, TiDB 会持续增强管理 Runaway Queries 的能力, 支持更多且复杂的识别规则, 增加更丰富的处理手段,全面提升可观测性,通过引入图形化管理的方式进一步提升用户体验 , 为 TiDB 迈向企业级数据库平台保驾护航。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1466375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

su模型在3d里渲染效果如何---模大狮模型网

SketchUp模型在其他3D应用程序中进行渲染可以获得非常好的效果,取决于您所选择的渲染引擎和技术水平。下面是一些常见的渲染效果和技巧: 一:光照和阴影 通过添加适当的光源和调整阴影设置,可以使SketchUp模型在渲染中呈现出更加真…

python递归算法

递归算法 一、嵌套调用的过程二、递归的基本原则1、递归的基本原则2、无限递归调用3、正常递归调用4、阶乘问题5、力扣:231. 2 的幂6、力扣面试题 08.05. 递归乘法7、力扣、326. 3 的幂8、力扣342. 4的幂 一、嵌套调用的过程 def show1():print("show 1 run s…

第2讲:C语言数据类型和变量

第2讲:C语言数据类型和变量 目录1.数据类型介绍1.1字符型1.2整型1.3浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 数据类型长度1.5.3 sizeof 中表达式不计算 2.signed 和 unsigned3.数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5…

Leetcode日记 2583. 二叉树中的第 K 大层和

Leetcode日记 2583. 二叉树中的第 K 大层和 题目:解题思路:代码实现制作不易,感谢三连,谢谢啦 题目: 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和…

Jenkins邮件通知配置(7)

1、安装插件: Email Extension,Email Extension Template,这两个插件可以帮助我们进行邮件的编写发送以及格式化 2、配置jenkins中链接腾讯企业邮箱 先配置发送服务,然后在具体工程中设置接收者 基础信息: POP3/S…

thinkphp5.1 phpexcel 批量导入导出

1.批量导入 public function importExcel(){$authority $this->getUserAuthority(order_input, batch_import);if ($authority[code] ! 0) {return json($authority);}$file request()->file(files);if(empty($file)){return printMsg(-1, "请上传文件");}/…

LeetCode刷题日志-200.岛屿数量

思路: 遍历二维数组,每当遇到一个‘1’进行一次dfs,根据规则,将本次dfs到的所有元素标记为‘0’(放置重复dfs,并且能dfs到的元素一定是与当前遍历到的元素属于统一岛屿。)最后,dfs的…

Sora-OpenAI 的 Text-to-Video 模型:制作逼真的 60s 视频片段

OpenAI 推出的人工智能功能曾经只存在于科幻小说中。 2022年,Openai 发布了 ChatGPT,展示了先进的语言模型如何实现自然对话。 随后,DALL-E 问世,它利用文字提示生成令人惊叹的合成图像。 现在,他们又推出了 Text-t…

【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here!

创建时间:2024-02-19 最后编辑时间:2024-02-23 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

【关于python变量类型学习笔记】

python的变量类型 在创建变量时会在内存中开辟一个空间,变量是存储在内存中的值。 根据变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 变量可以指定不同的数据类型,这些变量可以存储整数,…

Codeforces Round 927 (Div. 3) G. Moving Platforms --- 题解 (非常好的题)

目录 Codeforces Round 927 (Div. 3) G. Moving Platforms: 原题链接:Problem - G - Codeforces 题目大意: 思路解析: 代码实现: Codeforces Round 927 (Div. 3) G. Moving Platforms: 原题链接&#…

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感,严格遵循黄金分割比例的蓝色点晴线条,加上雾面工艺及高低起伏错落有致的线条处理,在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…

app自动化元素定位工具Weditor安装使用

之前用appium自带的appium Desktop inspector老是定位不到元素 如下 用另外工具 Weditor M1电脑 安装 pip3 install weditor 启动-自动打开端口 python3 -m weditor 输入设备名称,点击【connect】出现绿色为连接成功 获取到

vscode中git相应插件的使用(强化工作效率)

git graph 这篇文章写的不错:Git Graph 对于git graph的插件的使用: 1、首先vscode-extension中去下载 2、打开 相应的项目,然后在vscode左边底下去找到git graph标识然后打开就可以看到commit记录的可视化形式了。 能够很清晰的看到你的提…

自定义股票池策略周报告---收益1.8,回撤0.7,提供实盘设置

综合交易模型已经交易了1个月了目前收益10,回测0.8,策略追求稳稳的幸福,细水流长,回测年化20,最大回撤8 链接自定义股票池策略周报告---收益1.8,回撤0.7,提供实盘设置 (qq.com) 实盘稳定运行2…

镜像的使用条件

Q:老师,我怎么才能把做了一半的脸直接复制呢? A:镜像,但是镜像是有条件的 Q:镜像的使用条件有哪些呢? A: 1.对称面不能存在,必须是镂空的(以哪个面做对称…

yolov8学习笔记(一)网络结构

一、yolov8.yaml YOLOv8详解 【网络结构代码实操】: YOLOv8详解 【网络结构代码实操】-CSDN博客文章浏览阅读10w次,点赞559次,收藏2.9k次。YOLOv8 算法的核心特性和改动可以归结为如下:提供了一个全新的 SOTA 模型,包…

SQL Server——建表时为字段添加注释

在 MySQL 中,新建数据库表为字段添加注释可以使用 comment 属性来实现。SQL Server 没有 comment 属性,但是可以通过执行 sys.sp_addextendedproperty 这个存储过程添加扩展属性来实现相同的功能。 这个存储过程的参数定义如下: exec sys.s…

TiDB 社区智慧合集丨TiDB 相关 SQL 脚本大全

非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 48】非正式 TiDB 相关 SQL 脚本征集大赛!( https://asktug.com/t/topic/996635 )里提供的各种常用脚本。 在这篇文章中,我们整理了社区同学提供的一系列 TiDB 相关 SQL 脚本,希望能为大家在…

基于Springboot实现课程评分系统设计和实现

基于java Springboot实现课程评分系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码…