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

news2024/10/1 1:22:49

目录

一、前言

二、资源管控流程图

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

(一)测试集群环境

(二)Request Unit(RU)概念

(三)资源管控参数

(四)评估实际负载所需容量

(五)创建资源组

(六)绑定资源组

四、总结


一、前言

在早期听过很多客户一直在讨论TiDB有没有多租户的功能,一直是对标其他分布式数据库的热点话题。TiDB v7.1.0支持基于资源组的资源管控,为同一集群中的不同工作负载分配并隔离资源。该功能显著提升了多应用集群的稳定性,并为多租户奠定了基础。

TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度的能力。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的配额对用户的读写请求做流控,TiKV 层会根据配额映射的优先级来对请求做调度。通过流控和调度这两层控制,可以实现用户、会话、语句级别的应用资源隔离,满足服务质量 (QoS) 要求。

二、资源管控流程图

图片

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

(一)测试集群环境

[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

(二)Request Unit(RU)概念

Request Unit(RU)是TiDB对CPU、IO等系统资源的统一抽象的单位,目前包括CPU、IOPS和IO带宽三个指标。这三个指标的消耗会按照的比例统一到RU单位上。

下表是用户请求对TKV存储层CPU和IO资源的消耗以及对应的RU权重:

图片

基于上表,假设这个资源组消耗的TiKV时间是c毫秒,r1次请求读取了r2KB数据,w1次写请求写入了w2KB数据,集群中非witness

TKV节点数是n,则该资源组消耗的总RU的公式如下:

图片

(三)资源管控参数

此次测试参数如下:

图片

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

图片

(四)评估实际负载所需容量

注意事项:

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

权限:

TiDB 与 TiKV 的 CPU 利用率不能过低,否则无法进行容量估算

图片

//根据实际负载估算容量

  • 方法一:

指定初始时间 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)

或者

指定初始时间 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)

  • 方法二

图片

//基于硬件部署估算容量

  • 方法一:

指定 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)

  • 方法二:

图片

(五)创建资源组

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)

(六)绑定资源组

TiDB 支持如下三个级别的资源组设置: 

  • 用户级别:通过 CREATE USER 或 ALTER USER 语句将用户绑定到特定的资源组。 

  • 会话级别:通过 SET RESOURCE GROUP 设置当前会话使用的资源组。 

  • 语句级别:当集群遇到突发的 SQL 性能问题,可以Optimizer Hint 设置当前语句使用的资源组,临时限制某个 SQL 的资源消耗。

//将用户绑定到资源组

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) 的大小按比例分配。

图片

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

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

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

图片

图片

//将语句绑定到资源组

当集群遇到突发的 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.coloradmin.cn/o/1241830.html

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

相关文章

vue项目引入element-plus

文章目录 引入框架遇到的问题引入的时候,报错 ...(reading replace)...报错:The template root requires ...eslint报错: 运行 引入框架 使用add引入 遇到的问题 引入的时候,报错 …(reading ‘replace’)… Cannot read prop…

Navicat 技术指引 | 适用于 GaussDB 的数据迁移工具

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

git本地账户如何从一台电脑迁移到另外一台

为了表述方便,我们此处用旧电脑、新电脑指代。 在新电脑上安装git 例如,我旧电脑上安装的git版本是2.33.1版本,新电脑安装git的版本是2.43.0,这不妨碍迁移。 将git的全局配置文件从旧电脑拷贝到新电脑 Git的全局配置文件&…

el-table表格排序(需要后端判别),el-table导出功能(向后端发送请求)

&#xff08;1&#xff09;表格排序 &#xff08;2&#xff09;简单的table导出功能&#xff08;需要后台支撑&#xff09;必须要有iframe &#xff08;3&#xff09;页面所有代码&#xff1a; <template><div class"mainContainer"><el-form:model&…

Selenium安装WebDriver最新Chrome驱动(114以后的版本)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

都被“锟斤拷”毒害过,那么究竟是为什么会出现这些奇怪的字符?

不管是在工作中还是生活中&#xff0c;都被“锟斤拷”毒害过&#xff0c;比如这样&#xff1a; 或者这样&#xff1a; 还有这样&#xff1a; 那么究竟是为什么会出现这些奇怪的字符&#xff1f; ASCII编码 在计算机底层都是用0和1进行存储的&#xff0c;ASCII编码将所有的字母…

oracle数据库巡检常见脚本-系列二

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…

Navicat 技术指引 | 适用于 GaussDB 的备份与还原功能

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

Linux反弹SHell与检测思路

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 反弹shell payload在线生成 https://www.chinabaiker.com/Hack-Tools/ Online - Reverse Shell G…

C++基础从0到1入门编程(四)类和对象

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 往期文章&#xff1a; C基础从0到1入门编程&#xff08;一&#xff09; C基础从0到1入门编程&#xff08;二&#xff09; C基础从0到1入门编程&#xff08;三&#xff09; 参考视频&#xff1a; 1.黑马程序员匠心…

docker启动容器失败,然后查看日志,docker logs查看容器出现报错:

docker 启动容器失败&#xff0c;然后docker logs 查看容器出现报错&#xff1a; error from daemon in stream: Error grabbing logs: invalid character l after object key:value pair在网上看到的 解决方案&#xff1a; 找到你日志文件目录&#xff1a; docker inspect …

信用卡不在身上怎么查安全码

信用卡安全码是由3位数字组成的&#xff0c;一般位于信用卡背面签名栏旁边。如果信用卡不在身上&#xff0c;可以通过拨打发卡银行客服热线来查询安全码。但是&#xff0c;安全码是非常私密的信息&#xff0c;客服可能没有权限查询。因此&#xff0c;这个方法不一定有用。另外&…

Ocam——自由录屏工具~

当我们想要做一些混剪、恶搞类型的视频时&#xff0c;往往需要源影视作品中的诸多素材&#xff0c;虽然可以通过裁减mp4文件的方式来获取片段&#xff0c;但在高画质的条件下&#xff0c;mp4文件本身通常会非常大&#xff0c;长此以往&#xff0c;会给剪辑工作带来诸多不便&…

芯片的测试方法

半导体的生产流程包括晶圆制造和封装测试&#xff0c;在这两个环节中分别需要完成晶圆检测(CP, Circuit Probing)和成品测试(FT, Final Test)。无论哪个环节&#xff0c;要测试芯片的各项功能指标均须完成两个步骤&#xff1a;一是将芯片的引脚与测试机的功能模块连接起来&…

CCC联盟——UWB MAC(一)

本文在前面已经介绍了相关UWB的PHY之后&#xff0c;重点介绍数字钥匙&#xff08;Digital Key&#xff09;中关于MAC层的相关实现规范。由于MAC层相应涉及内容比较多&#xff0c;本文首先从介绍UWB MAC的整体框架&#xff0c;后续陆续介绍相关的网络、协议等内容。 1、UWB MAC架…

好用的团队协同办公软件推荐!企业办公必备!

有什么好用的团队协同办公软件可以推荐&#xff1f; 想要的办公软件需要满足“即时通讯”、“多端适配”、“项目管理”、“文件传输”这4大能力。 下面就给大家分享3大类能够满足题主需求的企业级办公软件&#xff0c;免费的付费的都有&#xff0c;也都是侧重的不同领域&…

基于命令行模式设计退款请求处理

前言 这篇文章的业务背景是基于我的另一篇文章: 对接苹果支付退款退单接口-CSDN博客 然后就是说设计模式是很开放的东西,可能我觉得合适,你可能觉得不合适,这里只是做下讨论,没有一定要各位同意的意思.... 相关图文件 这里我先把相关的图文件放上来,可能看着会比较清晰点 代码逻…

[UE4][C++]基于UUserWidget的一种序列图播放方法

最近在做一个大项目&#xff0c;鸽了几个月了....... 一、传统方法Flipbook 这种方法适合序列图较少的情况下、可以一个一个添加进来然后调整顺序。蓝图也比较友好可以直接设置很多属性和功能。这里简单了解一下即可&#xff0c;想要深入了解的同学可以自行搜索。 1.1创建Fli…

手把手云开发小程序-(四)-uniclould增删改查业务开发

一&#xff0c;导入uView 在开发小程序的时候&#xff0c;我习惯使用uView这个ui库。主要是直接用当然比自己写省时间。 它的官网&#xff1a;uView - 多平台快速开发的UI框架 - uni-app UI框架 (gitee.io) 导入&#xff1a; npm install uview-ui2.0.31然后按照官网进行配…

数据库基础入门 — SQL运算符

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…