TiDB 5.0 部分新特性试用

【是否原创】是
【首发渠道】TiDB 社区

TiDB 5.0 部分新特性试用

一、引言

2021年 04 月 07 日 TiDB 5.0.0版本正式发版。每一个大版本的更新都有一个主题。如果说 TiDB 4.0 的关键词是更多新功能与新特性。TiDB 5.0 的关键词可以说是“内功”。根据官方文档(https://docs.pingcap.com/zh/tidb/stable/release-5.0.0#whats-new-in-tidb-50) 可以了解到新增特性。
在发布的核心关键特性中,大部分都是性能提升,还有另外一部分是关于系统稳定性提升的特性。今天就针对部分性能提升的特性做一些简要的测试,通过实验数据对比 TiDB 5.0 与 TiDB 4.0 的差别。

二、特性验证

1、TiDB 5.0 引入聚簇索引功能,提升数据库性能。这方面以 TPC-C tpmC 性能提升 39% 为例。下面的验证性实验将使用 tiup 的 bench 组件进行 TiDB 4.0 和 5.0 的 TPC-C 测试。

TPC-C 是一个对 OLTP(联机交易处理)系统进行测试的规范,使用一个商品销售模型对 OLTP 系统进行测试,其中包含五类事务:

  • NewOrder – 新订单的生成
  • Payment – 订单付款
  • OrderStatus – 最近订单查询
  • Delivery – 配送
  • StockLevel – 库存缺货状态分析

TPC-C 使用 tpmC 值(Transactions per Minute)来衡量系统最大有效吞吐量(MQTH, Max, Qualified Throughput)。其中 Transaction 以NewOrder Transaction 为准,即最终衡量单位为每分钟处理的新订单数。

下面使用 300 WAREHOUSE 为例进行测试。在相同的资源分配情况下分别对 TiDB 4.0 和 5.0 进行测试。

两次测试均使用以下硬件配置,集群架构则是 1PD、1TiDB、5TiKV。

IP 部署节点 OS 网卡 CPU 内存 存储
10.3.72.145 PD,监控 Centos7 千兆 4核 20G 120g
10.3.72.87 TiDB Centos7 千兆 4核 20G 120g
10.3.72.83 TiKV Centos7 千兆 4核 20G 120g
10.3.72.125 TiKV Centos7 千兆 4核 20G 120g
10.3.72.90 TiKV Centos7 千兆 4核 20G 120g
10.3.72.86 TiKV Centos7 千兆 4核 20G 120g
10.3.72.88 TiKV Centos7 千兆 4核 20G 120g

使用 tiup 命令分别测试集群 TPC-C 能力,每一个版本都测试多次取平均值,排除偶然误差。

## 导入数据
tiup bench tpcc -H 10.3.72.87 -P 4000 -D tpcc --warehouses 1000 prepare

## 运行测试
tiup bench tpcc -H 10.3.72.87 -P 4000 -D tpcc --warehouses 1000 run

## 清理数据
tiup bench tpcc -H 10.3.72.87 -P 4000 -D tpcc --warehouses 4 cleanup

从 tpm 的柱状图中可以看出v5,0在 new_order,payment 等事务的tpm数值都高于 v4.0。增长幅度在 20% -30% 之间,与官网提供的增长幅度数据 39% 有一定差距。由于实验环境的影响,实验数据的偏差在这个范围内也是可以接受的。

TPC-C 的实验比较耗时,导入数据以及运行实验都会花费较长时间,最好将实验数据保存到文本中,即 run 命令之后再加上">> tpc.log",以免过程中 ssh 连接工具意外断开丢失实验结果,导致前功尽弃。

2、TiDB 5.0 默认开启异步提交事务功能。数据库的客户端会同步等待数据库系统通过两阶段 (2PC) 完成事务的提交,事务在第一阶段提交成功后就会返回结果给客户端,系统会在后台异步执行第二阶段提交操作,降低事务提交的延迟。据官网文档所述,在一定配置情况下,Sysbench 设置 64 线程测试 Update index 时, 平均延迟由 12.04 ms 降低到 7.01ms ,降低了 41.7%。接下来在我的本地环境下分别对 TiDB 5.0 和 TiDB 4.0 进行Sysbench 测试,验证一下性能提升效果。

使用 Sysbench 自带 oltp_update_index.lua 脚本分别对 5.0 和 4.0 的 TiDB 集群进行多次测试,取测试结果的平均值作为参考。集群配置与上一点中的表格内容相同

使用如下命令测试集群。测试规模为20张表,每张表100w行数据,并发线程为64。

## 初始化库表结构以及数据
sysbench oltp_update_index --config-file=tidb-config  --tables=20 --table-size=1000000 --report-interval=10 --threads=64 --time=100 prepare

## 运行只写脚本,触发cdc同步任务。
sysbench oltp_update_index --config-file=tidb-config  --tables=20 --table-size=1000000 --report-interval=10 --threads=64 --time=100 run

##清理数据
sysbench oltp_update_index --config-file=tidb-config  --tables=20 --table-size=1000000 --report-interval=10 --threads=64 --time=100 cleanup

对比测试结果如下图

bar-y-category%20(1)

v4.0 和 v5.0 平均时延分别是 74.40 ms 和 43.71 ms, 性能提升 41.25%。基本符合官网提供的数据。

3、通过提升优化器的稳定性及限制系统任务对 I/O、网络、CPU、内存等资源的占用,降低系统的抖动。例如:测试 8 小时,TPC-C 测试中 tpmC 抖动标准差的值小于等于 2%。对于系统稳定性提升的感受,从第二点测试中95%的时延也可以看出来,v5.0 绝大部分查询都在一个稳定的 QPS 下完成,所以 95% 时延与其平均时延基本持平。而 v4.0 的 95% 时延数值则偏大。说明其系统存在比较明显的抖动情况,造成一部分查询完成时间较长。

官网使用tpc-c实验数据计算tpmC的抖动标准差来反映v5.0稳定性的提升,我们这里就使用Sysbench一段时间内的 QPS 来计算标准差来看一下 v4.0 和 v5.0 稳定性的差别。

使用 Sysbench 的 update_index 脚本在相同情况下分别对v4.0 和 v5.0 进行 1000 秒的测试,计算过程中报告的实时QPS计算得出v4.0与v5.0的实时QPS标准差分别是 634.1 和 127.4。通过这种粗略的方式可以看出二者QPS的稳定性确实有比较大的差别,由于时间有限,只进行了1000s 的实验,所得数据可能不太能准确反映二者实际稳定性的表现。只能大致了解一下稳定性的提升效果。

三、总结

总结上面的验证结果,我们可以直观地了解到TiDB通过内部代码的优化,实实在在地提高了数据库各方面的性能以及稳定性。通过异步提交事务,引入聚簇索引提升数据库性能,降低写入数据延迟。通过提升优化器的稳定性及限制系统任务对I/O,网络,内存资源的占用,降低系统抖动。通过这次实验,在一定配置和软件环境下通过实验数据大致了解到TiDB V5.0.0 所带来的提升。除了这次实验所说的部分特性,还有很多特性有待大家一起探索,比如TiFlash引入的MPP架构,备份到云存储,TiCDC等。

2赞

感谢分享~

1赞