黄东旭解析 TiDB 的核心优势
535
2023-11-24
在早期听过很多客户一直在讨论TiDB有没有多租户的功能,一直是对标其他分布式数据库的热点话题。TiDB v7.1.0支持基于资源组的资源管控,为同一集群中的不同工作负载分配并隔离资源。该功能显著提升了多应用集群的稳定性,并为多租户奠定了基础。 TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度的能力。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的配额对用户的读写请求做流控,TiKV 层会根据配额映射的优先级来对请求做调度。通过流控和调度这两层控制,可以实现用户、会话、语句级别的应用资源隔离,满足服务质量 (QoS) 要求。
此次测试参数如下:
TiDB 流控和TiKV 调度可以单独管控,组合效果见下图:
指定初始时间 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)方法二
指定 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)方法二
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 limitation1)资源管控特性的引入对 TiDB 具有里程碑的意义,它能够将一个分布式数据库集群划分成多个逻辑单元,利用该特性可以让TiDB应对更多的应用场景。 2) 可以将多个来自不同系统的中小型应用合入一个 TiDB ,应用透明无侵入对集群资源最大化使用。 3)减少了集群数量,降低运维难度及管理成本。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。