前两篇文章向大家介绍了sysbench和YCSB两个开源性能基准测试工具,这两个工具着重于对数据库进行产品级基本的、与业务和应用无关的压力测试。在这篇文章中将向大家介绍在传统关系型数据库领域中存在的以假想的零售业务为基础的TPC-C性能测,并介绍基于sysbench的一个开源工具sysbench-tpcc针对TiDB和Cockroach的用法。
TPC-C是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统。1992年7月发布。几乎所有在OLTP市场提供软硬平台的国外主流厂商都发布了相应的TPC-C测试结果,随着计算机技术的不断发展,这些测试结果也在不断刷新。
TPC-C测试用到的模型是一个大型的商品批发销售公司,它拥有若干个分布在不同区域的商品仓库。当业务扩展的时候,公司将添加新的仓库。每个仓库负责为10个销售点供货,其中每个销售点为3000个客户提供服务,每个客户提交的订单中,平均每个订单有10项产品,所有订单中约10%的产品在其直接所属的仓库中没有存货,必须由其他区域的仓库来供货。同时,每个仓库都要维护公司销售的100000种商品的库存记录。
下面是TPC-C业务模型的逻辑示意图:
下面是TPC-C的数据库表关系结构图:
TPCC运行事务的简要说明
需要处理的交易事务主要为以下几种:
1、新订单(New-Order) :客户输入一笔新的订货交易;
2、支付操作(Payment) :更新客户帐户余额以反映其支付状况;
3、发货(Delivery) :发货(模拟批处理交易);
4、订单状态查询(Order-Status) :查询客户最近交易的状态;
5、库存状态查询(Stock-Level) :查询仓库库存状况,以便能够及时补货。
本文所介绍的sysbench-tpcc是Percona公司基于sysbench开发的TPC-C标准的实现(tpcc.lua负责实现)。
2. 安装
(1) 环境
sysbench:1.0.14 (要求先安装好它)
TiDB:2.0.x或2.1.x
CockroachDB:2.0.x或2.1.x
(2) 安装部署
下载sysbench-tpcc软件包:
https://github.com/Percona-Lab/sysbench-tpcc/archive/v2.1.tar.gz
解压软件包:
tar xvfz 2.1.tar.gz
假设解压之后的目录为: /home/benchmark/sysbench-tpcc-2.1
3. 运行测试
在执行后面的工作之前,进入sysbench-tpcc相应的目录:
cd /home/benchmark/sysbench-tpcc-2.1
注意:在运行下面的步骤之前,注意后面描述对于CockroachDB和TiDB重要说明!!
(1) prepare(准备数据)
--mysql/tidb
./tpcc.lua --mysql-db=tpcc --mysql-user=root \
--mysql-host=192.168.13.171 --mysql-port=26257 --time=300 \
--threads=4 --report-interval=1 --tables=4 --scale=10 \
--db-driver=mysql prepare
--postgresql/cockroachdb
./tpcc.lua --pgsql-db=tpcc --pgsql-user=root \
--pgsql-host=192.168.13.171 --pgsql-port=26257 --time=300 \
--threads=4 --report-interval=1 --tables=4 --scale=10 \
--db-driver=pgsql prepare
(2) run(加压测试)
--mysql/tidb
./tpcc.lua --mysql-db=tpcc --mysql-user=root \
--mysql-host=192.168.13.171 --mysql-port=26257 --time=300 \
--threads=4 --report-interval=1 --tables=4 --scale=10 \
--db-driver=mysql run
--postgresql/cockroachdb
./tpcc.lua --pgsql-db=tpcc --pgsql-user=root \
--pgsql-host=192.168.13.171 --pgsql-port=26257 --time=300 \
--threads=4 --report-interval=1 --tables=4 --scale=10 \
--db-driver=pgsql run
(3) clean(清理测试)
--mysql/tidb
./tpcc.lua --mysql-db=tpcc --mysql-user=root \
--mysql-host=192.168.13.171 --mysql-port=26257 --time=300 \
--threads=4 --report-interval=1 --tables=4 --scale=10 \
--db-driver=mysql clean
--postgresql/cockroachdb
./tpcc.lua --pgsql-db=tpcc --pgsql-user=root \
--pgsql-host=192.168.13.171 --pgsql-port=26257 --time=300 \
--threads=4 --report-interval=1 --tables=4 --scale=10 \
--db-driver=pgsql clean
对于CockroachDB的重要说明:
虽然CockraochDB兼容PostgreSQL,但是有些地方还不是100%兼容,所以为了能够让sysbench-tpcc针对CockroachDB正常运行,需要修改相关lua文件:
(1) 修改tpcc_common.lua文件
把history表定义中h_data字段的长度改为varchar(48)
(2) 修改tpcc.lua文件,把before_restart_event函数体中的con:query("ROLLBACK")加上注释
(3) 修改tpcc_run.lua文件,把SELECT语句中的FOR UPDATE字句去掉(CockroachDB目前不支持这个字句)
(4) 修改tpcc_common.lua文件,找到下面代码段
if drv:name() == "pgsql" then
show_query="select * from pg_catalog.pg_indexes where schemaname != 'information_schema' and schemaname != 'pg_catalog'
"
repeat
rs= con:query(show_query)
ffi.C.usleep(1000)
until rs.nrows == sysbench.opt.tables * 14
end
把红色一行中的 * 14改为 * 15
对于TiDB的重要说明:
* 由于目前TiDB还不支持外键,sysbench-tpcc要针对其能正常运行,需要修改tpcc_common.lua文件中的相关DDLs。
参考:
http://www.tpc.org/tpcc/
http://www.tpc.org/information/sessions/sigmod/sld009.htm
https://github.com/Percona-Lab/sysbench-tpcc
https://baike.baidu.com/item/TPCC/10023747?fr=aladdin