传统数据库领域包含两大业务场景:OLTP和OLAP。过去,两大业务场景需要依赖不同的数据库产品,数据在不同数据库之间融通的过程中往往容易产生数据孤岛、数据的时效性、数据的一致性等问题。因此,近年来支持HTAP混合负载的数据库产品正在受到越来越多的关注。如何实现一款优秀的HTAP数据库,业界有不同的声音。
一方面,以TiDB为代表的新兴数据库厂商选择从头做起,搭建一款HTAP原生数据库。另一方面,以Greenplum为代表的成熟数据库厂商选择在自己的优势产品中引入对HTAP的支持。其中,Greenplum6.0通过引入全局死锁检测、优化全局事务、升级PG内核等优化,实现了在OLTP上性能的飞跃。那么,这些HTAP数据库的性能究竟如何呢?
近日,来自金风科技的社区小伙伴马晓亮对三款数据库:Greenplum、CockroachDB和TiDB 进行了相关场景的性能测试。下面,让我们来看一下测试结果。
此次性能测试场景分为OLTP的TPC-C和TPC-B测试以及简单的OLAP统计聚合场景(作为一款OLAP数据库,Greenplum对复杂场景支持优异,而大多数新兴HTAP数据库还不能很好的支持复杂场景,所以本测试只测试简单OLAP场景),所有测试都是通过186代理节点进行测试,CockroachDB(后文简称CRDB)和Greenplum使用相同的节点进行分段测试,由于是使用的虚拟机性能对三个分布式来说不会太高,废话不多说直接上测试数据,我们先看下整体的对比情况:
一、基础环境
1. 硬件环境:
2. 软件环境:
二、整体的OLTP测试情况对比
sysbench测试脚本是为PostgreSQL设计,其中用到了SELECT FOR UPDATE。Greenplum 6.x还不支持 SELECT FOR UPDATE,所以通过pgbench对Greenplum再进行一轮测试。(Greenplum 7将支持SELECT FOR UPDATE)
Greenplum 6.7.1pgbench测试,通过自己写的脚本实现的三个场景。
三、OLAP简单场景统计性能对比
t1、t2表各生成1亿记录:包含id、int类型、字符类型、时间类型、浮点型。由于TiDB和CRDB对复杂的统计分析场景支持不好(如窗口函数、CTE等),所以采取简单场景测试:
准备测试表:
CRDB
create table t1 (id int primary key, c1 float4, c2 text, c3 timestamp, c4 float4);
TIDB
create table t1 (id int, c1 float, c2 text, c3 timestamp, c4 float);
Greenplum
create table t1 (id int, c1 float, c2 text, c3 timestamp, c4 float);
由于CRDB、TiDB一个事务中生成1亿记录未能完成(CRDB异常、TiDB异常缓慢),所以通过程序实现分段提交实现:
insert into t1 select id, random()*1000, md5(random()::text), clock_timestamp(), random()*1000 from generate_series(1,100000000) t(id);
insert into t2 select id, random()\*1000, md5(random()::text), clock\_timestamp(), random()\*1000 from generate\_series(1,100000000) t(id);
CRDB
20线程 每线程500万数据,双表同时写入,共耗时3200359毫秒。
按开始-结束时间统计单事务耗时:总耗时=单个事务提交*(2亿/1000/20),反推出单个事务提交320毫秒,这320包含了生成数据时间。程序逻辑:生成1000条数据 ->t1→t2。
按日志输出统计单事务耗时:
cat nohup.out |grep t1 |awk -F '1000条,耗时:' '{sum += $2} END {print "Average =",sum/NR}'
Average = 225.017
cat nohup.out |grep t2 |awk -F '1000条,耗时:' '{sum += $2} END {print "Average =",sum/NR}'
Average = 249.99
TIDB
cat nohup.out |grep t1 |awk -F '1000条,耗时:' '{sum += $2} END {print "Average =",sum/NR}'
Average = 295.407
cat nohup.out |grep t2 |awk -F '1000条,耗时:' '{sum += $2} END {print "Average =",sum/NR}'
Average = 350.562
由于CRDB主要针对OLTP优化,并不是一个真正意义上的HTAP数据库,下图我们将Greenplum与TiDB两款HTAP数据库OLAP性能数据进行对比。具体对比数据请参考上面的表格。
毫秒级的测试数据证明了Greenplum强大的OLAP性能
四、总结
综合来看Greenplum的OLAP能力卓越,OLTP场景支持的已经足够好。Greenplum在OLTP场景目前存在Master单节点的性能瓶颈,后续希望Greenplum做出突破。新型的HTAP分布式数据库,目前节点性能损耗还是比较严重的,HTAP 的优势应该是在节点足够多,能够成线性的增长,对特性这块的支持也是不尽相同,Greenplum是对原生关系型数据库支持特性最好的(完全支持,如触发器需要单节点使用)。
编者记:除了单纯OLAP和OLTP的性能考量之外,一个优秀的HTAP还需要考虑在混合负载的情况下,如何合理分配计算资源,避免发生AP和TP查询之间的资源抢占。针对混合负载,Greenplum的Resource Group特性基于cgroup技术,实现了CPU和内存资源在不同资源组之间的隔离,显著降低了AP负载和TP负载之间的相互影响。
希望了解测试过程的同学,欢迎扫码获取测试代码。