【TiDB v7.1.0】资源管控调研及评测

news2024/12/23 19:12:51

作者: angryart 原文来源: https://tidb.net/blog/ad24240a

多租户是什么

有语云,食在广州,玩在杭州,死在柳州,广东人除了天上飞的飞机不吃,地上走的坦克不吃,其它的什么都吃,广州作为省市,吃方面更为极致,它汇集了广府、潮汕、客家的各种特色和口味。一年一度的美食盛宴,广州为四方来客准备了万人宴席,但是万人宴席如何面对成万上亿的中国吃货呢?

一个笨方法是先入先出,通过先入者得到座席,吃完后先出去的方式,但是很快就出现问题 。有些客人是长服务,他提前就点了一堆的东西 ,结果只分配了他们5个座席,他们只能默默的吃,占住位置不释放。另外资源分配也有类似的问题,最后发生所有的座席满员,其它的人只能等待。可怜短服务需求的人,有些人不远万里过来只为吃一粒牛肉丸,有些人只为了吃一个叉烧包。因为愚蠢程序的设计,结果等着等着,活生生饿死,造成系统大面积瘫痪。

**解决问题之道 是加强资源调度管理,IT界引引入了多租户的管理方法。**业界有两个渐为成熟的管理方法, 一个是capacity 调度方法 ,一个是fair调度方法,capacity 把资源按比例分配给各个队列,队列下面再划分二层队列,并添加严格的管理制度防止用户或队列独占资源,而fair则是按照公平的原则把资源分给各资源组,力保每一个用户都在进行中。

通俗的话表达,capacity Scheduler就是根据资源适配业务,按比例划分长服务50%、中服务30%、短服务20%,这样长服务得到更多资源吃饭,吃完就走,短服务因为是吃一碗糖水,占平台的资源不多,吃完就走。fair Scheduler则按标签权重划分划分,而且在算法上会关怀短服务以及那些优先高的任务,这样它们快速完成任务资源释放,后面平台可以服务更多的用户。

数据库的多租户

业界应用实践capacity Scheduler和fair Scheduler的产品有YARN,YARN是hadoop2推出来的资源管理调度框架,沉浸多年,技术上已经非常成熟,估计OceanBase的开发就是借鉴了很多YARN的特性,OceanBase开源后本身就有多租户功能,创建一段OB多租户示例如下

创建15个CPU,3G内存的资源单位unitfish
obclient [oceanbase]> CREATE RESOURCE UNIT unitfish MAX_CPU 15, MEMORY_SIZE '3G', MAX_IOPS 1280,LOG_DISK_SIZE '10G',
 MIN_IOPS=1024;
Query OK, 0 rows affected (0.015 sec)
​
资源单位unitfish绑定资源池poolfish
​
obclient [oceanbase]> CREATE RESOURCE POOL poolfish UNIT = 'unitfish', UNIT_NUM = 1,ZONE_LIST = ('zone1');
Query OK, 0 rows affected (0.025 sec)
​
资源池poolfish绑定租户tenantfish
obclient [oceanbase]> create tenant tenantfish resource_pool_list=('poolfish'), charset=utf8mb4, 
replica_num=3, zone_list('zone1'), primary_zone=RANDOM, locality='F@zone1' 
set variables ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%';
Query OK, 0 rows affected (24.164 sec)

OceanBase的资源管控是三步走的过程。

第一步定义资源单元 ,资元单元声明里面最少可以占用多少资源,最多可以占用多少资源。

第二步声明资源池 ,指定资源单元 以及相关 单元数量,两者乘积就是资源池所有的性能。

第三步就是资源池绑定租户 ,并指定租户与数据副本的映射关系。

OceanBase资源管控策略意图很明显,第一步先声明一个细粒度的资源,足够小以后可以按照业务的需求个性化组装, 第二步可以组合成功的资源规格可以满足业务的需求,一般这是完成与业务绑定了。

OceanBase的资源管控策略与capacity Scheduler、fair Scheduler不一样, TiDB的创新方式也与OceanBase的不一样。

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

区别于OB的细粒度管控方式,TiDB通过PRIORITY和BURSTABLE对资源争夺进行管控,如果发生资源恶性竞争,优先满足PRIORITY高的资源组,如果发生资源闲置,打上BURSTABLE的资源组允许当它处理空闲时其它资源组使用它的资源。

TiDB的资源组除了能够绑定租户,也能绑定会话,语句。不过,笔者认为最有特色的是 根据实际负载估算容量

capacity Scheduler的资源管控策略基于集群硬件部署按照比例的方式笼切去切分,OceanBase的资源管控策略则是基于硬件部署的精确个数去划分,前提是必须知道服务器有多少个CPU,CPU是什么规格属性,才能灵活分配资源,属于 硬件配置校准 的方式。

现在TiDB的 根据实际负载估算容量 可以忽略服务器软硬件的情况,通过业务负载知道预判该租户可以使用多少资源。技术原理与openGauss的AI4DB的类似,openGauss实现数据库自治运维管理,通过采集CPU、内存、硬盘的工作指标状态,保存在时序promethous里面,定期汇聚合并,通过dbmind分析数据库的运维参数,从而得出哪些参数需要调整优化。

与openGauss不同,TiDB不需要额外安装组件、服务、时序数据库,这个比较省心。不过启用 根据实际负载估算容量 会占用TiDB额外的计算消耗。

实验环境

操作系统 CentOS Linux release 7.6.1810
CPU 8核 Intel(R) Xeon(R)
内存 16

以下创建三个资源组,其中RG1是100,RG2是500,RG3是2000,如下。选 用sysbench以及chbenchmark做压力均衡的测试。

​
CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 100 ;
CREATE RESOURCE GROUP IF NOT EXISTS rg2 RU_PER_SEC = 500;
CREATE RESOURCE GROUP IF NOT EXISTS rg3 RU_PER_SEC = 2000 PRIORITY = HIGH BURSTABLE;
​
CREATE USER 'sysbench1'@'%' IDENTIFIED BY '123456' RESOURCE GROUP rg1;
CREATE USER 'sysbench2'@'%' IDENTIFIED BY '123456' RESOURCE GROUP rg2;
CREATE USER 'chbench1'@'%' IDENTIFIED BY '123456' RESOURCE GROUP rg3;
​
#  sysbench1绑定rg1
#  sysbench2绑定rg2 
#  chbench1绑定rg3 
​
​
grant all privileges on   chbenchmark.*  to  chbench1;
grant all privileges on   chbenchmark.*  to  sysbench1;
grant all privileges on   chbenchmark.*  to  sysbench2;
​

测试资源隔离

以sysbench做基准,分别以sysbench1和sysbench2执行相同一个任务,如下。期望 500RU的sysbench2会比100RU的sysbench1快。

sysbench   /usr/share/sysbench/oltp_read_only.lua  --mysql-user=sysbench1 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark --tables=4 --table_size=1000 
--threads=4 --time=3000 --report-interval=10   run
​
sysbench   /usr/share/sysbench/oltp_read_only.lua  --mysql-user=sysbench2 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark --tables=4 --table_size=1000 
--threads=4 --time=3000 --report-interval=10   run
​
sysbench1的结果如下
​
[ 10s ] thds: 4 tps: 23.49 qps: 378.07 (r/w/o: 330.69/0.00/47.38) lat (ms,95%): 204.11 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 4 tps: 19.90 qps: 319.62 (r/w/o: 279.82/0.00/39.80) lat (ms,95%): 211.60 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 4 tps: 19.80 qps: 316.92 (r/w/o: 277.32/0.00/39.60) lat (ms,95%): 211.60 err/s: 0.00 reconn/s: 0.00
​
​
sysbecn2的结果如下
​
[ 10s ] thds: 4 tps: 110.17 qps: 1766.70 (r/w/o: 1545.95/0.00/220.75) lat (ms,95%): 95.81 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 4 tps: 100.80 qps: 1613.18 (r/w/o: 1411.57/0.00/201.61) lat (ms,95%): 42.61 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 4 tps: 99.29 qps: 1587.17 (r/w/o: 1388.59/0.00/198.58) lat (ms,95%): 43.39 err/s: 0.00 reconn/s: 0.00

结论,满足预期目标,sysbench2因为RU值大,所以同样任务,sysbench2比sysbench1快。

测试资源抢夺

以sysbench做基准,先运行chbench1的oltp_write_only任务10分钟后,再陆续挂起sysbench1和sysbench2的oltp_read_only任务,最后以chbench1的身份再运行一个oltp_read_only任务

期望目标

  • chbench1的oltp_read_only任务中途插入,凭借PRIORITY = HIGH 可以获得较多的资源
  • chbench1的oltp_write_only任务结束后,因为BURSTABLE资源释放,sysbench1和sysbench2的oltp_read_only任务的计算速度提升,chbench1的oltp_read_only任务也有所提升。
1.首先运行chbench1的oltp_write_only任务
sysbench   /usr/share/sysbench/oltp_write_only.lua  --mysql-user=chbench1 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark --tables=4 --table_size=1000 
--threads=4 --time=3000 --report-interval=10   run
​
2.运行sysbench1的oltp_read_only任务
sysbench   /usr/share/sysbench/oltp_read_only.lua  --mysql-user=sysbench1 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark --tables=4 --table_size=1000 
--threads=4 --time=3000 --report-interval=10   run
​
3.运行sysbench2的oltp_read_only任务
sysbench   /usr/share/sysbench/oltp_read_only.lua  --mysql-user=sysbench2 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark --tables=4 --table_size=1000 
--threads=4 --time=3000 --report-interval=10   run
​
​
4.运行chbench1的oltp_read_only任务
sysbench   /usr/share/sysbench/oltp_read_only.lua  --mysql-user=chbench1 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark --tables=4 --table_size=1000 
--threads=10 --time=3000 --report-interval=10   run

no-alt

chbench1的oltp_write_only开始任务运行后,系统约占200RU。10分钟后追加的sysbench1的oltp_read_only任务和sysbench2的oltp_read_only任务,chbench1的oltp_write_only任务依然是200RU,而sysbench1、sysbench2的系统RU分别是100和150。 14:00之前的时间线,chbench1、sysbench1、sysbench2分别是200RU、100RU、150RU.

最后插入chbench1的oltp_read_only任务,chbench1升到500以上的RU,平均值接近550RU。而sysbench1和sysbench2并没有任何变化,依然是100和150左右徘徊。 14:00到14:30的时间线,chbench1、sysbench1、sysbench2分别是500、100RU、150RU.

chbench1的oltp_write_only任务结束后,sysbench1仍然占系统的100RU,oltp_write_only资源释放后, 而sysbench2迅速从原来的150RU升到接500RU,而chbench1的oltp_read_only任务速度有了质量的提升,飙升到2500RU。 14:30到14:45的时间线,chbench1、sysbench1、sysbench2分别是2500、100RU、500RU.

14:45后,sysbench1和sysbench2任务结束后,chbench1的RU进一步急升。 14:45之后的时间线,chbench1是3000RU

结论,chbench1、sysbench1、sysbench2三者竞争,优先满足chbench1的资源需求,sysbench2与chbench1竞夺,自己只占有150的RU。 chbench1拥有优先权,可以继续给chbench1添加任务。在chbench1的部分资源释放后,可以提供给sysbench2使用。

测试资源耗尽

以chbenchmark做基准,通过chbench1和sysbench对集群发起HTAP的压力测试,机器预先加载有tpc-h数据,期望平台会对客户提交的不合理要求截断,并提示报警。

​
/root/.tiup/components/bench/v1.12.0/tiup-bench ch --host 192.168.10.13 -Usysbench1 -p123456 -P4000 
--warehouses 1 run -D chbenchmark -T 1000 -t 50 --time 60m
​
​
​
/root/.tiup/components/bench/v1.12.0/tiup-bench ch --host 192.168.10.13 -Uchbench1 -p123456 -P4000 
--warehouses 2 run -D chbenchmark -T 10000 -t 50 --time 60m
​

no-alt

sysbench1的执行过程中报错,提示failed Error 8252: Exceeded resource group quota limitation,整体系统依然在运行,没有对租户采取强硬措施处理。

chbench1的执行过程中没有报错,系统在持续满足它的资源需求,没有对租户采取强硬措施处理,直到系统不胜负荷,wait使用100%,swap使用100%。

结论,面对chbench1和sysbench1的不合理要求,系统没有把它强行掐断,结果恶性循环导致系统资源消耗殆尽。

通过负载校准

2379监控界面的负载校准必须要持续一段的压力才能出结果,技术原理它是按时序采集压测数据,根据对系统访问,算出平台应该调成多大RU负载。

笔者设了密集的频发的压力测试,经过系统计算后结果是8536RH,相对原来的硬件推荐的14886RU要少。选用8536RH比起14886RU 更合理。

/root/.tiup/components/bench/v1.12.0/tiup-bench ch --host 192.168.10.13 -Uchbench1 -p123456 -P4000 
--warehouses 2 run -D chbenchmark -T 10000 -t 50 --time 60m
​
​
​
​
sysbench   /usr/share/sysbench/oltp_read_only.lua  --mysql-user=sysbench1 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark 
--tables=4 --table_size=1000 --threads=4 --time=3000 --report-interval=10   run
​
sysbench   /usr/share/sysbench/oltp_read_only.lua  --mysql-user=sysbench2 --mysql-password='123456' 
--mysql-host=192.168.10.13 --mysql-port=4000 --mysql-db=chbenchmark 
--tables=4 --table_size=1000 --threads=4 --time=3000 --report-interval=10   run

no-alt

结论,负载校准相对硬件配置校准的极限负荷,表现更真实,更贴近资源的分配。

总结

多租户管理充分利用了资源 ,面对百万来宾,不需要摆百万宴席,也不需要假设性十万宴席,通过科学有效的现代化管理手段 ,万人宴席就好。

资源隔离是多租户必备的基本能力 ,每个租户分配的资源不一样,才能有序进行工作。

资源抢夺是多租户的核心处理能力 ,当出现竞争的时候,保障VIP食客先吃,低级别的用户也可以吃一部分。VIP食客户快速吃完抂,再腾资源出来,整体协调共进。

资源耗尽是多租户最想避免发生的事情 ,目前资源管控都是通过cgroup技术实现的,本质也是线程管控的。估计这里的测试chbechmark的线程并发有关系,里面有执行tpc-h的昂贵执行,跨越管控,最后发生资源耗尽。

通过负载校准是未来的技术趋势 ,与数据库AI有关,根据真实的业务负荷提供调整数据库建议参数,目前AI在TiDB的应用是租户资源调整,以后还会有很多增长空间。

笔者只知道国产数据库中,只有OceanBase有多租户功能,TiDB直至7.1才推出成熟的资源管控手段 ,来的迟,但是没有晚,亮点让人耳目一新,TiDB7.1的 硬件配置校准 继承传统的资源管控策略,按照工程师的熟悉习惯对服务器配置规格分配资源,同时也在 负载校准 提供了新的手段,通过人工智能识别数据库的最佳参数。

相对OB的大而周全,TiDB是小而精致。OB新建用户,都必须绑定租户,绑定租户需要三步走,三步走之前必须算好我应该划分多少个CPU、多少内存。 而TiDB假设你没有多租户的需求,那么你直接新建用户,不需要你强制绑定资源组。这样一对比,TiDB的多租户显得锦上添花了!

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

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

相关文章

Mybatis面试题--MyBatis一级缓存,二级缓存

Mybatis的一级、二级缓存用过吗? 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存 二级缓存 是基于n…

Python将多维列表「拉伸」为一维列表的10种方式

来源:投稿 作者:Fairy 编辑:学姐 在Python编程中,列表是一种常用的数据类型。当我们遇到了一个嵌套列表,如果想将它扁平化为一维列表,就可以使用下面10种方法之一来实现这个需求。 1. 使用两层循环遍历 l…

【记录】实践场景

Apache Doris 在京东搜索实时 OLAP 探索与实践 https://doris.apache.org/zh-CN/blog/JD_OLAP/ 通过对比开源的几款实时OLAP引擎,我们发现doris和clickhouse能够满足我们的需求,但是clickhouse的并发度太低是个潜在的风险,而且clickhouse的数…

已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。

错误提示: 一般只有下面几种方法 百度经验解决方法 http://jingyan.baidu.com/article/90bc8fc859b481f653640cac.html http://jingyan.baidu.com/article/25648fc1bfd4a29190fd0067.html 2.第二种方法 检测问题所在: 下载LeoMoon CPU-V 检查一下CP…

小程序本地生活

2023年7月1号 感觉就是视频要快点看不完 不然哪天接口又失效了 Page({/*** 页面的初始数据*/data: {// 存放轮播图的数据swiperList:[],// 存放九宫格的数据gridList:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getSwiperList()this.getGridList()},// 获…

【GIS】阿里AI Earth选择内置地图

说明 aie.Map,构造一个地图组件Map对象,用于可视化渲染计算结果。坐标系固定为EPSG:4326。 阿里AI Earth中,坐标系默认为EPSG:4326 效果 import aie aie.Authenticate() aie.Initialize() my_province aie.FeatureCollection(China_Provin…

【Python】Python基础笔记

Python基础笔记 数据的输入和输出 print("数据") # 这是数据的输出 name input() # 这是数据的输入,并将输入的数据赋值给name。而且无论输入的何种类型的数据,最终的结果都是 字符串 类型的数据pint 输出不换行: # print 输出…

结合ace编辑器实现MapboxGL热力图样式在线配置

概述 MapboxGL热力图的配置参数并不多,但是有时候为了或得一个比较好用的热力图配置参数,我们不得不改代码再预览,显得尤为麻烦,为方便配置,实现实时预览,本文使用ace实现了一个热力图样式在线配置页面。 …

MSF之信息收集及漏洞利用

MSF之信息收集及漏洞利用 一、Metasploit简介二、Metasploit安装三、安装postgresql数据库四、KaIi-msfdb-Postgresql报错排查处理五、Metasploit-启动六、Metasploit-目录结构六、Metasploit-模块七、Metasploit-信息收集7.1、db_nmap/nmap7.2、Metasploit auxiliary7.2.1、端…

【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)

本篇文章包含的内容 一、步进电机的结构和工作原理1.1 步进控制系统的组成1.2 步进电机简介1.3 步进电机的分类1.4 步进电机的工作原理1.4.1 单极性步进电机(5线4相)1.4.2 双极性步进电机(4线2相)1.4.3 细分器驱动原理 1.5 步进电…

hcia回顾复习

一、OSI七层参考模型 OSI/RM 开放式系统互联参考模型 由ISO ---- 国际标准化组织 — 1979提出 核心思想 分层 :上层协议再下层协议提供服务的基础上再提供增值服务。 应用层 — 提供各种应用服务.可以将抽象语言转换为编码 .应用程序 APP:通过人机交互提供&#xff…

Win10打字输入法不显示输入框怎么办?

Win10的打字输入法是我们日常计算机使用中必不可少的工具之一,然而,有时候在使用过程中可能会遇到打字输入法不显示输入框的问题,这给我们的输入和操作带来了很大的困扰,如果您也遇到了这个问题,不要担心,以…

Linux--获取某个区间文本的指令:head和tail

Linux--获取文本前n行的指令&#xff1a;head 语法&#xff1a; head 选项 文件名 功能&#xff1a; head 用来显示档案的开头至标准输出中&#xff0c;默认head命令打印其相应文件的开头10行。 选项&#xff1a; -n <行数> 显示的行数 示例&#xff1a; ①生成默…

【UE5 Cesium】05-Cesium for Unreal 在子关卡中添加Actor

上一篇&#xff1a;【UE5 Cesium】04-Cesium for Unreal 将不同地区的倾斜摄影作为不同子关卡 步骤 首先将关卡切换到“DenverRooftop” 添加一个“立方体” 将关卡切换到“Globe” 然后再向场景中添加一个“椎体” 此时如果我们将关卡切换到“Boston”&#xff0c;只能看到“…

如何高效获取嵌入式系统知识和技能

学习嵌入式系统的方法&#xff1a; 设定明确的目标&#xff1a;在学习嵌入式系统之前&#xff0c;明确自己的学习目标和期望结果。这可以帮助你更有针对性地选择学习材料和项目&#xff0c;并保持专注和动力。 分解学习计划&#xff1a;将学习过程分解成小的可管理的任务和阶段…

SQL注入经验方法总结

SQL注入 先判断是哪种数据库。再进行后续操作。 SQL注入漏洞产生的原理 web应用程序&#xff0c;对用户输入的语句没有做严格的过滤&#xff0c;导致被输入的语句被拼接成恶意代码的SQL语句进入数据库中查询&#xff0c;修改信息等。 所以SQL注入漏洞需要的条件&#xff1a…

chatglm2 本地部署中遇到的问题

在本地GPU部署的时候&#xff0c;发现了报错&#xff0c; ModuleNotFoundError: No module named transformers_modules.chatglm2-6b 但是自己路径都是正确的&#xff0c; 确实是按照双斜杠来写的路径。 但依旧报错 最后发现是安装的 transformers 包的版本太新导致的。 …

抖音SEO账号矩阵系统源码

一、抖音SEO账号矩阵系统源码思路 1. 数据采集与分析 2. 排名算法设计 3. 用户管理模块 4. 内容推荐系统 二、抖音矩阵系统源码功能概述 &#xff08;1&#xff09;多平台多账号管理,支持抖音&#xff0c;快手&#xff0c;好看视频&#xff0c;B站&#xff0c;西瓜&#x…

jdbc获取数据库元数据信息

DatabaseMetaData 接口&#xff1a; 获取数据库&#xff0c;&#xff0c;&#xff0c;表&#xff0c;&#xff0c;列&#xff0c;&#xff0c;等元数据信息 jdbc使用&#xff1a; // 获取一个连接 Connection connection DriverManager.getConnection(url,username,password)…

葡萄酒数据可视化分析

葡萄酒数据可视化分析 必应壁纸供图 数据集&#xff1a;https://download.csdn.net/download/weixin_53742691/87982219 import pandas as pd import seaborn as sns import matplotlib.pyplot as pltwine pd.read_csv("wine_quality/wine_edited.csv") wine.hea…