当前位置: 首页 > news >正文

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

在数字化系统扮演重要角色的今天,数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言,突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能,用户可以从管理流程入手规范变更的测试,或者利用产品手段减少预期外的变化。然而,这仍旧无法完全规避突发的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: defaultSTART_TIME: 2023-09-20 01:59:14END_TIME: UNLIMITEDWATCH: SimilarWATCH_TEXT: d3c7846bb8f6b817ae395db30eadedec57af08f7983466f68db93d9ce1ac5872SOURCE: manualACTION: 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: defaulttime: 2023-09-19 15:18:10match_type: identifyaction: killoriginal_sql: SELECT count(1)FROM  sbtest.sbtest1 AS S1,sbtest.sbtest2 AS S2,sbtest.sbtest3 AS S3WHERE S1.c=S2.cAND S1.c=S3.cplan_digest: 41fee801f07e06aa4aba4c0142ce4c624e8dc932c9e14d49854b8ce57366b443tidb_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: defaultSTART_TIME: 2023-09-19 16:58:20END_TIME: 2023-09-19 17:03:20WATCH: ExactWATCH_TEXT: SELECT count(1)FROM  sbtest.sbtest1 AS S1,sbtest.sbtest2 AS S2,sbtest.sbtest3 AS S3WHERE S1.c=S2.cAND S1.c=S3.cSOURCE: 127.0.0.1:4000ACTION: 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 迈向企业级数据库平台保驾护航。

相关文章:

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

在数字化系统扮演重要角色的今天,数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言,突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能,用户可以从管理流程入手规范变更的测试,或者利用产品手段减少预…...

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁,并引入了一个新的问题 若定义锁的过期时间是10s,此时A线程获取了锁然后执行业务代码,但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码,A线程…...

【高德地图】Android高德地图初始化定位并显示小蓝点

&#x1f4d6;第3章 初始化定位并显示小蓝点 ✅第1步&#xff1a;配置AndroidManifest.xml✅第2步&#xff1a;设置定位蓝点✅第3步&#xff1a;初始化定位✅完整代码 ✅第1步&#xff1a;配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…...

继电器测试中需要注意的安全事项有哪些?

继电器广泛应用于电气控制系统中的开关元件&#xff0c;其主要功能是在输入信号的控制下实现输出电路的断开或闭合。在继电器测试过程中&#xff0c;为了确保测试的准确性和安全性&#xff0c;需要遵循一定的安全事项。以下是在进行继电器测试时需要注意的安全事项&#xff1a;…...

Java向ES库中插入数据报错:I/O reactor status: STOPPED

Java向ES库中插入数据报错&#xff1a;java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时&#xff0c;第一次成功插入&#xff0c;第二次出现以下错误&#xff1a…...

vue3实现页面跳转

有需求是在vue项目中实现点击按钮完成页面跳转。这里不适用a标签&#xff0c;而是用vue自带的vue-router。 首先看一下项目结构 src │ App.vue │ main.js │ ├─router │ index.js │ └─views index.vue content.vue 可以看到&…...

【Linux运维系列】vim操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …...

【初始RabbitMQ】延迟队列的实现

延迟队列概念 延迟队列中的元素是希望在指定时间到了之后或之前取出和处理消息&#xff0c;并且队列内部是有序的。简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列 延迟队列使用场景 延迟队列经常使用的场景有以下几点&#xff1a; 订单在十分…...

spark为什么比mapreduce快?

spark为什么比mapreduce快&#xff1f; 首先澄清几个误区&#xff1a; 1&#xff1a;两者都是基于内存计算的&#xff0c;任何计算框架都肯定是基于内存的&#xff0c;所以网上说的spark是基于内存计算所以快&#xff0c;显然是错误的 2;DAG计算模型减少的是磁盘I/O次数&…...

Unity通过XXpermission插件获取MANAGE_EXTERNAL_STORAGE权限

最近公司准备用Unity做一个安卓端的文件管理器功能&#xff0c;文件管理器已经做完了。刚开始的时候想要申请一下所有文件权限&#xff0c;发现在Unity里面申请所有文件权限(android.permission.MANAGE_EXTERNAL_STORAGE)相对来说比较麻烦。所以准备写一下文章记录一下如何申请…...

「连载」边缘计算(二十一)02-26:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; DeviceTwin struct组成剖析 该部分对DeviceTwin struct的组成进行剖析。接着devicetwin struct调用链剖析的实例化DeviceTwin struct&#xff08;dt : DeviceTwin{}&#xff09;往下剖析&#xff0c;进入DeviceTwin struct的定义&#xff0c;…...

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…...

【JS】【Vue3】【React】获取鼠标位置的方法:JavaScript、Vue 3和React示例

目录 使用JavaScript原生方法在Vue 3中获取鼠标位置在React中获取鼠标位置 随着Web应用程序的复杂性不断增加&#xff0c;获取用户交互信息变得越来越重要。其中&#xff0c;获取鼠标位置是一项常见的任务&#xff0c;可以用于实现各种交互效果&#xff0c;如拖拽、悬停提示等。…...

[Docker 教学] 常用的Docker 命令

Docker是一种流行的容器化技术。使用Docker可以将数据科学应用程序连同代码和所需的依赖关系打包成一个名为镜像的便携式工件。因此&#xff0c;Docker可以简化开发环境的复制&#xff0c;并使本地开发变得轻松。 以下是一些必备的Docker命令列表&#xff0c;这些命令将在你下一…...

小程序应用、页面、组件生命周期

引言 微信小程序生命周期是指在小程序运行过程中&#xff0c;不同阶段触发的一系列事件和函数。这一概念对于理解小程序的整体架构和开发流程非常重要。本文将介绍小程序生命周期的概念以及在不同阶段触发的关键事件&#xff0c;帮助开发者更好地理解和利用小程序的生命周期。 …...

Springboot中如何记录好日志

Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位&#xff0c;他是我们在系统发生故障时用来排查问题的利器&#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢&#xff1f;选择什么框架来记录日志&#xff0c;是不是日志打越…...

vm 虚拟机中ubuntu环境配置共享文件夹的方式

1. 在虚拟机设置中启用共享文件夹选项&#xff0c;映射到Windows中具体的目录。 2. 启动虚拟机。 3. 挂在cd #查看cd设备文件 sudo blkid#创建挂载点 sudo mkdir -p /media/cdrom#挂载cd sudo mount /dev/sr0 /media/cdrom#卸载cd sudo umount /media/cdrom 4. 执行完挂载后…...

EMQX Enterprise 5.5 发布:新增 Elasticsearch 数据集成

EMQX Enterprise 5.5.0 版本已正式发布&#xff01; 在这个版本中&#xff0c;我们引入了一系列新的功能和改进&#xff0c;包括对 Elasticsearch 的集成、Apache IoTDB 和 OpenTSDB 数据集成优化、授权缓存支持排除主题等功能。此外&#xff0c;新版本还进行了多项改进以及 B…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

计算机系统结构复习-名词解释2

1.定向&#xff1a;在某条指令产生计算结果之前&#xff0c;其他指令并不真正立即需要该计算结果&#xff0c;如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方&#xff0c;那么就可以避免停顿。 2.多级存储层次&#xff1a;由若干个采用不同实现技术的存储…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...