TiDB 7.5.1 资源管控测试
作者: 像风一样的男子原文来源:https://tidb.net/blog/189313c2
一、前言
诸位 DBA 是否经常遇到过如下问题:
1、当集群突然遇到某些 SQL 引发的性能问题时,为了不影响真个集群正常使用,只能忍痛停掉相关服务 。
2、当某个业务处于高峰期时,会过多占用整个数据库系统的资源,进而影响别的业务正常运行。
TiDB v7.1.0 开始支持基于资源组的资源管控,为同一集群中的不同工作负载分配并隔离资源。该功能显著提升了多应用集群的稳定性。
TiDB 资源管控提供了两层资源管理能力,分别在 TiDB 层和 TiKV 层的优先级调度。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的配额对用户的读写请求做流控,TiKV 层会根据配额和优先级来对请求做调度。通过流控和调度这两层控制,可以实现用户、会话、语句级别的应用资源隔离。
资源管控已经推出半年较为成熟,之前社区小伙伴已经做了很详细的测评。
最近有这方面需求就做了个简单的功能测试。
二、升级版本
之前数据库所使用版本为 5.4.3(一直稳定运行,没有升级的动力)。现在把该集群升级到最新的 7.5.1.
在 dashboard 中可以看到新加入的资源管控页面。
三、创建资源组和用户
Request Unit (RU) 是 TiDB 对 CPU、IO 等系统资源的统一抽象的计量单位,用于表示对数据库的单个请求消耗的资源量。请求消耗的 RU 数量取决于多种因素,例如操作类型或正在检索或修改的数据量。
集群资源的评估,一开始只能通过系统自动根据硬件配置来计算得到总 RU 量,然后根据这个估计得到的量,创建资源组、分配租户。
运行一段时间后,会根据这段时间的实际负载获得准确的总 RU 和消耗量,这个时候还需要管理员介入,再次调整之前不同租户的资源组所持有的分配额。
创建资源组
CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 10000;
CREATE RESOURCE GROUP IF NOT EXISTS rg2 RU_PER_SEC = 20000;
创建用户绑定到对应资源组
CREATE USER ‘usr2’@‘%’ IDENTIFIED BY ‘123456’ RESOURCE GROUP rg2;
CREATE USER ‘usr1’@‘%’ IDENTIFIED BY ‘123456’ RESOURCE GROUP rg1;
然后就可以在 dashboard 重要到相关资源组的信息。
也可以在数据库中查询到用户和资源组的绑定关系。
[root\@tsp-tidb-taos-01 ~]# mysql -h 127.0.0.1 -P4000 -uusr1 -p
Enter password:
MySQL [(none)]> select host, user,User_attributes from mysql.user;
+——+——+—————————+
| host | user | User_attributes |
+——+——+—————————+
| % | root | NULL |
| % | read | NULL |
| % | usr1 | {“resource_group”: “rg1”} |
| % | usr2 | {“resource_group”: “rg2”} |
+——+——+—————————+
4 rows in set (0.00 sec)
MySQL [(none)]>
四、关闭资源管控做压力测试
先关闭资源管控
SET GLOBAL tidb_enable_resource_control = ’OFF’;
建库 sbtest
MySQL [(none)]> create database sbtest;
sysbench 主要对集群做基准测试,主要关注 TPS、QPS
远程连接进入 shell 环境, 安装 sysbench
[root\@tsp-tidb-taos-01 ~]# yum install sysbench
[root\@tsp-tidb-taos-01 ~]# sysbench –version
sysbench 1.0.17
初始化压测数据建 100 张表
sysbench oltp_common –threads=32 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr1 –mysql-password=‘123456’ –tables=100 –table-size=10 prepare
启动一个 sysbench 任务做写入测试
[root\@taos3 sysbench]# sysbench oltp_write_only –threads=512 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr1 –mysql-password=‘123456’ –tables=16 –table-size=10000000 –report-interval=10 –time=300 run
可以看到服务器资源利用率非常高,资源管控相关监控应为关闭功能看不到数据了。
开启资源管控测试
SET GLOBAL tidb_enable_resource_control = ’ON’;
同样的测试方法只启动一个压测任务
[root\@taos3 sysbench]# sysbench oltp_write_only –threads=512 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr1 –mysql-password=‘123456’ –tables=16 –table-size=10000000 –report-interval=10 –time=300 run
从测试结果和监控指标中可以看到资源控制的非常精确。
换个用户 usr2 做测试
[root\@taos3 sysbench]# sysbench oltp_write_only –threads=512 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr2 –mysql-password=‘123456’ –tables=16 –table-size=10000000 –report-interval=10 –time=300 run
usr2 的压测结果和资源使用量都是 usr1 的 2 倍
加大资源组的限额
ALTER RESOURCE GROUP rg1 RU_PER_SEC = 50000;
ALTER RESOURCE GROUP rg2 RU_PER_SEC = 100000;
同时开启 usr1、usr2 用户启动 2 个 sysbench 任务做压测
sysbench oltp_write_only –threads=512 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr1 –mysql-password=‘123456’ –tables=16 –table-size=1000000000 –report-interval=10 –time=300 run
任务 2
sysbench oltp_write_only –threads=512 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr2 –mysql-password=‘123456’ –tables=16 –table-size=1000000000 –report-interval=10 –time=300 run
压测结果和监控指标符合预期。
修改资源组总限额超过系统给的估算值(写入为 219552RU/s)。
ALTER RESOURCE GROUP rg1 RU_PER_SEC = 100000;
ALTER RESOURCE GROUP rg2 RU_PER_SEC = 200000;
同时启动 2 个任务进行测试
sysbench oltp_write_only –threads=512 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr1 –mysql-password=‘123456’ –tables=16 –table-size=100000000 –report-interval=10 –time=300 run
sysbench oltp_write_only –threads=512 –rand-type=uniform –db-driver=mysql –mysql-db=sbtest –mysql-host=10.20.10.137 –mysql-port=4000 –mysql-user=usr2 –mysql-password=‘123456’ –tables=16 –table-size=100000000 –report-interval=10 –time=300 run
2 个任务发生了资源抢夺。
如果设置了优先级,TiDB 会优先满足高优先级 (PRIORITY) 资源组的请求。如果同一优先级的请求无法全部满足,TiDB 会根据用量 (RU_PER_SEC
) 的大小按比例分配。这里就不一一测试了。
总结
TIDB 的 resource control 资源管控,将 cpu/ 内存 /io 的物理资源抽象成 RU 的感念,简化了使用方式,并且测试中发现该特性可以正常限制住 RU,达到资源控制的效果。
可以将 TiDB 当做一个资源池,资源不够时可以添加 TiDB 或 TiKV 资源来扩大资源池。
TiDB 的硬件配置校准如果能通过人工智能识别自动调整就完美了。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/e2d1807d036e503d2ceaf6b41】。文章转载请联系作者。
评论