TiDB 热点测试

网友投稿 331 2024-03-25



一、测试说明

1、环境信息

硬件信息:3台物理机,1个tidb server(16c,64g),3个tikv(16c,64g,固态硬盘)

TiDB 热点测试

软件信息:centos7.5 + tidb v4.0.13

2、测试方法

sysbench:insert.lua(单条数据insert),50并发

3、测试案例

测试案例

测试场景

测试说明

主键自增热点测试模拟mysql迁到tidb后的热点场景sysbench插入主键为自增的表主键随机热点测试模拟官方建议的热点解决场景sysbench插入主键为随机的表主键随机,表切割热点测试模拟官方建议的热点解决场景sysbench插入主键为随机,并且表切割为10个region

二、测试准备

1、主键自增热点测试

初始化:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_incr --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 prepare

测试:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_incr --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 run

2、主键随机热点测试

初始化:复制主键自增库(sbtest_incr)的建表语句,auto_increment关键字改为auto_random,共8个表

执行测试:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/bulk_insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_rand --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 run

3、主键随机,并根据主键范围切割表热点测试

初始化:复制主键自增库(sbtest_incr)的建表语句,auto_increment关键字改为auto_random,共8个表

表切割:split table sbtest1 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest2 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest3 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest4 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest5 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest6 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest7 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest8 between (1000000000000000000) and (9223372036854775807) regions 10;

执行测试:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_split --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 run

4、主键随机和主键随机并切割表的库初始化表结构语句

sbtest_rand和sbtest_split_rand库初始化表结构:

CREATE TABLE sbtest1 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_1 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest2 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_2 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest3 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_3 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest4 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_4 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest5 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_5 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest6 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_6 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest7 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_7 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest8 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT 0,c char(120) NOT NULL DEFAULT ,pad char(60) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY k_8 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

5、指标查看

查看region的sql:SELECT b.TABLE_NAME,b.REGION_ID,IS_INDEX,INDEX_ID,b.start_key,b.end_keyFROM information_schema.TABLES as aINNER JOIN information_schema.TIKV_REGION_STATUS as bWHERE a.TIDB_TABLE_ID = b.TABLE_IDAND a.TABLE_SCHEMA=sbtest AND a.TABLE_NAME=sbtest1order by region_id desc;

dashboard-流量可视化查看热点情况

dashboard-慢查询查看sql运行情况

grafana查看系统负载情况

三、测试过程

1、主键自增热点测试

sysbench报告:

热点情况,一条亮线,写入集中:

cpu负载,波动较大,不太均衡:

2、主键随机热点测试

sysbench报告:

热点情况,一条亮线,写入集中:

cpu负载,波动较大,不太均衡:

3、主键随机,表切割为10个region

sysbench报告:

热点情况,均匀写入:

cpu负载,tikv均衡:

四、测试结论

1、测试结果对比

测试顺序主键自增主键随机主键随机+表切割为10个region第1次测试TPS : 7183.80 Latency : 6.96 msTPS : 8084.06 Latency : 6.18 msTPS : 6964.05 Latency : 7.18 ms第2次测试TPS : 7651.24 Latency : 6.53 msTPS : 6186.63 Latency : 8.08 msTPS : 6668.02 Latency : 7.50 ms第3次测试TPS : 6900.01 Latency : 7.24 msTPS : 6397.88 Latency : 7.81 msTPS : 6343.44 Latency : 7.88 ms第4次测试TPS : 6884.09 Latency : 7.26 msTPS : 6324.73 Latency : 7.90 msTPS : 6246.54 Latency : 8.00 ms第5次测试TPS : 7200.79 Latency : 6.94 msTPS : 6656.51 Latency : 7.51 msTPS : 6186.46 Latency : 8.08 msTPS平均值7163.996729.966481.7Latency平均值6.99 ms7.50 ms7.73 ms

2、测试结果说明

主键改为随机并不能提升性能,反而有所降低

主键改为随机,并且表切割为10个region并不能提升性能,反而有所降低

主键改为随机,表不做切割,热点问题依旧存在

主键改为随机,表切割为10个region,热点问题有较大改善

3、测试结果分析

在pctp的视频中,老师测试的结果是随机写入要比顺序写入快,我以相同的场景测试很多次,而且业务侧也试过很多次,发现在4.0.13这个版本下,确实顺序写入要比随机写入要快。但是随机写入确实有助于降低热点,不会导致出现tikv write stall现象。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:云原生数据库的主要特点
下一篇:TiDB 生产集群实现加密通信 TLS 实践分享
相关文章