数据库|TiDB v7.1.0 资源管控功能是如何降低运维难度和成本

目录

一、前言

二、资源管控流程图

三、资源管控 (Resource Control)测试

1)测试集群环境

2)Request Unit (RU) 概念

3)资源管控参数

4)评估实际负载所需容量

4.1 根据实际负载估算容量

方法一

or:

方法二

4.2 基于硬件部署估算容量

方法一

方法二

5)创建资源组

6)绑定资源组

6.1 将用户绑定到资源组

6.2 将当前会话绑定到资源组

6.3 将语句绑定到资源组

四、总结


一、前言

在早期听过很多客户一直在讨论TiDB有没有多租户的功能,一直是对标其他分布式数据库的热点话题。TiDB v7.1.0支持基于资源组的资源管控,为同一集群中的不同工作负载分配并隔离资源。该功能显著提升了多应用集群的稳定性,并为多租户奠定了基础。 TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度的能力。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的配额对用户的读写请求做流控,TiKV 层会根据配额映射的优先级来对请求做调度。通过流控和调度这两层控制,可以实现用户、会话、语句级别的应用资源隔离,满足服务质量 (QoS) 要求。

二、资源管控流程图

1.png

三、资源管控 (Resource Control)测试

1)测试集群环境

[tidb@tidb80 tidb]$ tiup cluster display tidb-test     
tiup is checking updates for component cluster ...
Starting component `cluster`: /home/tidb/.tiup/components/cluster/v1.12.2/tiup-cluster display tidb-test
Cluster type:       tidb
Cluster name:       tidb-test
Cluster version:    v7.1.0
Deploy user:        tidb
SSH type:           builtin
Dashboard URL:      http://192.168.2.81:2379/dashboard
Grafana URL:        http://192.168.2.80:3000
ID                  Role          Host          Ports        OS/Arch       Status   Data Dir                           Deploy Dir
--                  ----          ----          -----        -------       ------   --------                           ----------
192.168.2.80:9093   alertmanager  192.168.2.80  9093/9094    linux/x86_64  Up       /data/tidb-data/alertmanager-9093  /data/tidb-deploy/alertmanager-9093
192.168.2.80:3000   grafana       192.168.2.80  3000         linux/x86_64  Up       -                                  /data/tidb-deploy/grafana-3000
192.168.2.81:2379   pd            192.168.2.81  2379/2380    linux/x86_64  Up|L|UI  /data/tidb-data/pd-2379            /data/tidb-deploy/pd-2379
192.168.2.82:2379   pd            192.168.2.82  2379/2380    linux/x86_64  Up       /data/tidb-data/pd-2379            /data/tidb-deploy/pd-2379
192.168.2.83:2379   pd            192.168.2.83  2379/2380    linux/x86_64  Up       /data/tidb-data/pd-2379            /data/tidb-deploy/pd-2379
192.168.2.80:9090   prometheus    192.168.2.80  9090/12020   linux/x86_64  Up       /data/tidb-data/prometheus-9090    /data/tidb-deploy/prometheus-9090
192.168.2.80:4000   tidb          192.168.2.80  4000/10080   linux/x86_64  Up       -                                  /data/tidb-deploy/tidb-4000
192.168.2.81:20160  tikv          192.168.2.81  20160/20180  linux/x86_64  Up       /data/tidb-data/tikv-20160         /data/tidb-deploy/tikv-20160
192.168.2.82:20160  tikv          192.168.2.82  20160/20180  linux/x86_64  Up       /data/tidb-data/tikv-20160         /data/tidb-deploy/tikv-20160
192.168.2.83:20160  tikv          192.168.2.83  20160/20180  linux/x86_64  Up       /data/tidb-data/tikv-20160         /data/tidb-deploy/tikv-20160
Total nodes: 10

2)Request Unit (RU) 概念

image.png

3)资源管控参数

此次测试参数如下:

image.png

TiDB 流控和TiKV 调度可以单独管控,组合效果见下图:

image.png

4)评估实际负载所需容量

注意事项:评估窗口范围为 10 分钟至 24 小时,TiDB 与 TiKV 的 CPU 利用率不能过低,否则无法进行容量估算。
权限:TiDB 与 TiKV 的 CPU 利用率不能过低,否则无法进行容量估算

image.png

4.1 根据实际负载估算容量

方法一

指定初始时间 START_TIME 和时间窗口 DURATION 大小,根据实际负载查看 RU 容量。

MySQL [(none)]> CALIBRATE RESOURCE START_TIME '2023-06-26 17:25:00' DURATION '10m';  
+-------+
| QUOTA |
+-------+
| 14129 |
+-------+
1 row in set (0.20 sec)
or:

指定初始时间 START_TIME 和结束时间 END_TIME,根据实际负载查看 RU 容量。

MySQL [(none)]> CALIBRATE RESOURCE START_TIME '2023-06-26 17:25:00' END_TIME '2023-06-26 17:35:00';
+-------+
| QUOTA |
+-------+
| 14129 |
+-------+
1 row in set (0.53 sec)
方法二

image.png

4.2 基于硬件部署估算容量

方法一

指定 WORKLOAD 查看 RU 容量

MySQL [(none)]> CALIBRATE RESOURCE;
+-------+
| QUOTA |
+-------+
|  9690 |
+-------+
1 row in set (0.21 sec)MySQL [(none)]> CALIBRATE RESOURCE WORKLOAD OLTP_WRITE_ONLY;
+-------+
| QUOTA |
+-------+
|  9148 |
+-------+
1 row in set (0.36 sec)MySQL [(none)]> CALIBRATE RESOURCE WORKLOAD OLTP_READ_ONLY; 
+-------+
| QUOTA |
+-------+
|  1746 |
+-------+
1 row in set (0.23 sec)MySQL [(none)]> CALIBRATE RESOURCE WORKLOAD OLTP_READ_WRITE;
+-------+
| QUOTA |
+-------+
|  3721 |
+-------+
1 row in set (0.01 sec)
方法二

image.png

5)创建资源组

1.创建 rg1 资源组用于重要应用,限额是每秒 3000 RU,并且允许这个资源组的应用超额占用资源,设置绝对优先级为 HIGH。
MySQL [(none)]> CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 2000 BURSTABLE PRIORITY = HIGH;2.创建 rg2 资源组,RU 的回填速度是每秒 300 RU。在系统资源充足的时候,不允许这个资源组的应用超额占用资源,设置绝对优先级为 LOW。
MySQL [(none)]> CREATE RESOURCE GROUP IF NOT EXISTS rg2 RU_PER_SEC = 200 PRIORITY = HIGH;3.创建 rg3 资源组,RU 的回填速度是每秒 300 RU。在系统资源充足的时候,不允许这个资源组的应用超额占用资源,设置绝对优先级为 MEDIUM。
MySQL [(none)]> CREATE RESOURCE GROUP IF NOT EXISTS rg3 RU_PER_SEC = 500 PRIORITY = LOW;4.创建 rg4 资源组,RU 的回填速度是每秒 300 RU。在系统资源充足的时候,不允许这个资源组的应用超额占用资源,设置绝对优先级为 MEDIUM。
MySQL [(none)]> CREATE RESOURCE GROUP IF NOT EXISTS rg4 RU_PER_SEC = 1000 PRIORITY = MEDIUM;5.展示所有资源组 (resource group) 的信息
MySQL [(none)]> SELECT * FROM information_schema.resource_groups; 
+---------+------------+----------+-----------+
| NAME    | RU_PER_SEC | PRIORITY | BURSTABLE |
+---------+------------+----------+-----------+
| default | UNLIMITED  | MEDIUM   | YES       |
| rg1     | 2000       | HIGH     | YES       |
| rg2     | 200        | HIGH     | NO        |
| rg3     | 500        | LOW      | NO        |
| rg4     | 1000       | MEDIUM   | NO        |
+---------+------------+----------+-----------+
5 rows in set (0.01 sec)

6)绑定资源组

TiDB 支持如下三个级别的资源组设置:
用户级别:通过 CREATE USER 或 ALTER USER 语句将用户绑定到特定的资源组。
会话级别:通过 SET RESOURCE GROUP 设置当前会话使用的资源组。
语句级别:当集群遇到突发的 SQL 性能问题,可以Optimizer Hint 设置当前语句使用的资源组,临时限制某个 SQL 的资源消耗。

6.1 将用户绑定到资源组


MySQL [(none)]> CREATE USER 'test1'@'%' IDENTIFIED BY 'test1' RESOURCE GROUP rg1;
Query OK, 0 rows affected (0.09 sec)MySQL [(none)]> CREATE USER 'test2'@'%' IDENTIFIED BY 'test2' RESOURCE GROUP rg2;
Query OK, 0 rows affected (0.04 sec)MySQL [(none)]> CREATE USER 'test3'@'%' IDENTIFIED BY 'test3' RESOURCE GROUP rg3;
Query OK, 0 rows affected (0.06 sec)MySQL [(none)]> CREATE USER 'test4'@'%' IDENTIFIED BY 'test4' RESOURCE GROUP rg4;
Query OK, 0 rows affected (0.04 sec)MySQL [(none)]> grant all privileges on *.* to 'test1'@'%';
Query OK, 0 rows affected (0.05 sec)MySQL [(none)]> grant all privileges on *.* to 'test2'@'%';
Query OK, 0 rows affected (0.04 sec)MySQL [(none)]> grant all privileges on *.* to 'test3'@'%';
Query OK, 0 rows affected (0.03 sec)MySQL [(none)]> grant all privileges on *.* to 'test4'@'%';
Query OK, 0 rows affected (0.03 sec)MySQL [(none)]> select user,host,User_attributes from mysql.user;
+-------+------+---------------------------+
| user  | host | User_attributes           |
+-------+------+---------------------------+
| root  | %    | NULL                      |
| test1 | %    | {"resource_group": "rg1"} |
| test2 | %    | {"resource_group": "rg2"} |
| test3 | %    | {"resource_group": "rg3"} |
| test4 | %    | {"resource_group": "rg4"} |
+-------+------+---------------------------+
5 rows in set (0.02 sec)

Sysbench压测测试

[tidb@tidb80 tidb]$ cat config_test1
mysql-host=192.168.2.80
mysql-port=4000
mysql-user=test1
mysql-password=test1
mysql-db=sbtest
time=60
threads=16
report-interval=10
db-driver=mysql[tidb@tidb80 tidb]$ cat config_test2
mysql-host=192.168.2.80
mysql-port=4000
mysql-user=test2
mysql-password=test2
mysql-db=sbtest
time=60
threads=16
report-interval=10
db-driver=mysql[tidb@tidb80 tidb]$ cat config_test3
mysql-host=192.168.2.80
mysql-port=4000
mysql-user=test3
mysql-password=test3
mysql-db=sbtest
time=60
threads=16
report-interval=10
db-driver=mysql[tidb@tidb80 tidb]$ cat config_test4
mysql-host=192.168.2.80
mysql-port=4000
mysql-user=test4
mysql-password=test4
mysql-db=sbtest
time=60
threads=16
report-interval=10
db-driver=mysql[tidb@tidb80 tidb]$ sysbench --config-file=/tidb/config_test1 /tidb/sysbench/share/sysbench/oltp_write_only.lua --tables=1 --table-size=10000000 --time=600 --mysql-db=rc1 run 
[tidb@tidb80 tidb]$ sysbench --config-file=/tidb/config_test2 /tidb/sysbench/share/sysbench/oltp_write_only.lua --tables=1 --table-size=2000000 --time=600 --mysql-db=rc2 run
[tidb@tidb80 tidb]$ sysbench --config-file=/tidb/config_test3 /tidb/sysbench/share/sysbench/oltp_write_only.lua --tables=1 --table-size=5000000 --time=600 --mysql-db=rc3 run
[tidb@tidb80 tidb]$ sysbench --config-file=/tidb/config_test4 /tidb/sysbench/share/sysbench/oltp_write_only.lua --tables=1 --table-size=10000000 --time=600 --mysql-db=rc4 run

由于rg1设置了应用超额占用资源,rg1消耗RU可达到2K以上,由于rg2,rg3,rg4没有设置超额分配,就算在系统资源充足,也不会让这个资源组的应用超额占用资源。当系统资源超过限制时,TiDB 会优先满足高优先级 (PRIORITY) 资源组的请求。如果同一优先级的请求无法全部满足,TiDB 会根据用量 (RU_PER_SEC) 的大小按比例分配。

image.png

6.2 将当前会话绑定到资源组

通过把当前会话绑定到资源组,会话对资源的占用会受到指定用量 (RU) 的限制。

分别打开4个会话绑定不同的资源组,由于rg1设置了应用超额占用资源,rg1消耗RU可达到8K以上,由于rg2,rg3,rg4没有设置超额分配,在限制的RU内运行。

image.png

image.png

image.png

image.png

image.png

6.3 将语句绑定到资源组

当集群遇到突发的 SQL 性能问题,可以结合 SQL Binding 和资源组,临时限制某个 SQL 的资源消耗

将rg2资源组设置ru为1进行语句限制测试,可将某条资源消耗高的语句进行临时限制,从而让集群正常运行

MySQL [(none)]> alter RESOURCE GROUP rg2 RU_PER_SEC = 1;                   MySQL [(none)]> SELECT * FROM information_schema.resource_groups; 
+---------+------------+----------+-----------+
| NAME    | RU_PER_SEC | PRIORITY | BURSTABLE |
+---------+------------+----------+-----------+
| default | UNLIMITED  | MEDIUM   | YES       |
| rg1     | 2000       | HIGH     | YES       |
| rg2     | 1          | MEDIUM   | NO        |
| rg3     | 500        | LOW      | NO        |
| rg4     | 1000       | MEDIUM   | NO        |
+---------+------------+----------+-----------+MySQL [(none)]> select count(*) from rc1.sbtest1 where pad like '%22%';                                                                                      +----------+
| count(*) |
+----------+
|  3713861 |
+----------+create GLOBAL binding for select count(*) from rc1.sbtest1 where pad like '%22%' using select /*+ RESOURCE_GROUP(small_rg1) */ count(*) from rc1.sbtest1 where pad like '%22%';MySQL [(none)]> show global bindings;
+--------------------------------------------------------------+--------------------------------------------------------------+------------+---------+-------------------------+-------------------------+---------+-----------------+--------+------------------------------------------------------------------+-------------+
| Original_sql                                                 | Bind_sql                                                     | Default_db | Status  | Create_time             | Update_time             | Charset | Collation       | Source | Sql_digest                                                       | Plan_digest |
+--------------------------------------------------------------+--------------------------------------------------------------+------------+---------+-------------------------+-------------------------+---------+-----------------+--------+------------------------------------------------------------------+-------------+
| select count ( ? ) from `rc1` . `sbtest1` where `pad` like ? | SELECT count(1) FROM `rc1`.`sbtest1` WHERE `pad` LIKE '%22%' |            | enabled | 2023-07-03 11:49:48.436 | 2023-07-03 11:49:48.436 | utf8    | utf8_general_ci | manual | e2231bf96e1696343b39b1897a118cdef02f8d12a651b067b14c887c2611fcfe |             |
+--------------------------------------------------------------+--------------------------------------------------------------+------------+---------+-------------------------+-------------------------+---------+-----------------+--------+------------------------------------------------------------------+-------------+MySQL [(none)]> select count(*) from rc1.sbtest1 where pad like '%22%';
ERROR 8252 (HY000): Exceeded resource group quota limitation

四、总结

1)资源管控特性的引入对 TiDB 具有里程碑的意义,它能够将一个分布式数据库集群划分成多个逻辑单元,利用该特性可以让TiDB应对更多的应用场景。 2) 可以将多个来自不同系统的中小型应用合入一个 TiDB ,应用透明无侵入对集群资源最大化使用。 3)减少了集群数量,降低运维难度及管理成本。

作者 :高文锋 | 后端开发工程师

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,后台回复数据库,加入数据库技术交流群。

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

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

相关文章

鸿蒙原生应用/元服务开发-AGC分发如何配置签名信息

使用制作的私钥(.p12)文件、在AGC申请的证书文件和Profile(.p7b)文件,在DevEco Studio配置工程的签名信息,以构建携带发布签名信息的APP。 1.打开DevEco Studio,菜单选择“File > Project S…

va-Q-tec实现温度敏感产品运输过程质量控制温控无忧

摘要:温度敏感产品运输对供应链全流程的温度质量要求较高,往往需要借助特殊的温湿度监测技术产品。va-Q-tec与虹科Comet合作,采用虹科Comet的U系列温度记录仪,为集装箱运输过程提供完整的温控包装解决方案。 一、客户背景 va-Q-…

钴电解液中净化除镍除铜树脂

#钴电解液中净化除镍除铜树脂 钴是生产各种合金及电池不可或缺的原材料,钴资源供给主要来自于大型铜矿和镍矿的伴生开采,钴的主要应用领域为动力电池、3C消费电池、各种耐热合金、硬质合金、防腐合金、磁性合金及各种钴盐等。其中,电池领域是…

【洛谷算法题】P5714-肥胖问题【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5714-肥胖问题【入门2分支结构】🌏题目描述🌏输入格式&a…

给项目快速接入链路追踪

为什么需要链路追踪? 我们程序员在日常工作中,最常做事情之一就是修bug了。如果程序只是运行在单机上,我们最常用的方式就是在程序上打日志,然后程序运行的过程中将日志输出到文件上,然后我们根据日志去推断程序是哪一…

redis-cluster集群

1.redis-cluster集群 redis3.0引入的分布式存储方案 集群由多个node节点组成,redis数据分布在这些节点之中。 在集群之中分为主节点和从节点 集群模式当中,主从一一对应,数据写入和读取与主从模式一样,主负责写,从…

网页小游戏的开发流程

网页小游戏的开发流程可以分为几个关键步骤。这只是一个一般性的流程概述,具体的步骤可能会根据项目的规模和要求而有所不同。此外,还要考虑法律和版权问题,确保你的游戏开发过程是合法的。下面是一个简要的概述,希望对大家有所帮…

Android WorldWind加载shapefile格式文件形成三维效果

目录 1 前言2 实现思路3 绘制Polygons4 读取shapefile文件5 加载立体模型6 问题1 前言 在项目中有时会加载shapefile格式的数据,要形成三维立体效果。但是查看worldwind NASA官网,在worldwind android的使用教程中并没用加载shapefile格式的教程,然后源码中也没有开发加载s…

单片机调试技巧--栈回溯

在启动文件中修改 IMPORT rt_hw_hard_fault_exceptionEXPORT HardFault_Handler HardFault_Handler PROC; get current contextTST lr, #0x04 ; if(!EXC_RETURN[2])ITE EQMRSEQ r0, msp ; [2]0 > Z1, get fault context from h…

java--static修饰成员变量

1.static 叫静态,可以修饰成员变量、成员方法。 2.成员变量按照有无static修饰,分为两种: ①类变量:有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享(不管那个类调用的&#x…

CyberRT-共享内存实现

CyberRT共享内存类图 共享内存消息发布 数据用共享内存发布时,首先会创建ShmTransmitter对象,包含两个主要成员segment和notifier,Segment用于创建共享内存(上面绿色部分),Notifer 最终构建ReadableInfo通…

Navicat 技术指引 | 适用于 GaussDB 的自动运行功能

Navicat Premium(16.2.8 Windows版或以上) 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

tp8 使用rabbitMQ

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 生产者代码 <?php declare (strict_ty…

一个ETL流程搞定数据脱敏

数据脱敏是什么&#xff1f; 数据脱敏是指在数据处理过程中&#xff0c;通过一系列的技术手段去除或者替换敏感信息&#xff0c;以保护个人隐私和敏感信息的安全的过程。数据脱敏通常在数据共享、数据分析和软件测试等场景下使用&#xff0c;它旨在降低数据泄露和滥用的风险。…

运动戴什么耳机好?运动无线耳机哪个品牌比较好?运动耳机推荐

​如果你是一名户外运动爱好者&#xff0c;那么一款高品质的运动耳机是必不可少的。它们具备好音质、高稳固性舒适度、防尘防水等多项防护功能&#xff0c;让你在恶劣的天气条件下也能保持音乐的陪伴。面对市面上越来越多的运动耳机&#xff0c;到底哪款更值得入手&#xff1f;…

脸爱云一脸通智慧管理平台未授权访问

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞概述 脸爱云一脸通智慧管理平台存在严重漏洞&#xff0c;允许…

文件差分服务设计

需求 OTA&#xff08;Over-The-Air&#xff09;升级是一种至关重要的技术&#xff0c;用于更新嵌入式设备的固件或软件&#xff0c;以确保设备具备最新功能和修复漏洞。在OTA升级过程中&#xff0c;使用差异算法工具&#xff08;如bsdiff、hdiffpatch和xdelta3&#xff09;能够…

C++:一文读懂智能指针

C11 引入了 3 个智能指针类型&#xff1a; 当使用智能指针时&#xff0c;我们首先需要包含 memory头文件&#xff0c;这个头文件包含了 C 标准库中智能指针的定义。 1.std::unique_ptr<T> &#xff1a;独占资源所有权的指针。 2.std::shared_ptr<T> &#xff1a;共…

【数据结构初阶(4)】栈的基本操作实现

文章目录 Ⅰ 概念及结构1. 栈的概念2. 栈的操作 Ⅱ 基本操作实现1. 栈的定义2. 初始化栈3. 元素入栈4. 元素出栈5. 获取栈顶元素6. 获取栈中有效元素个数7. 判断栈空8. 销毁栈 Ⅰ 概念及结构 1. 栈的概念 栈&#xff1a;栈是一种特殊的线性表&#xff0c;其只允许在固定的一端…

MATLAB实现灰色预测

久违了&#xff0c;前段时间由于学习压力大&#xff0c;就没怎么更新MATLAB相关的内容&#xff0c;今天实在学不进去了&#xff0c;换个内容更新一下~ 本贴介绍灰色预测模型&#xff0c;这也是数学建模竞赛常见算法中的一员&#xff0c;和许多预测模型一样——底层原理是根据已…