干货丨DolphinDB与Aliyun HybridDB for PostgreSQL的对比

1. 概述

DolphinDB 是一款高性能混合列式数据库和数据分析系统,尤为擅长处理时间序列数据。Aliyun HybridDB for PostgreSQL(如下简称HybridDB)是由阿里巴巴提供的基于开源Greenplum定制的MPP架构企业级通用数据仓库产品。node

本测试仅限于时间序列数据,结论不适用于更为通用的数据领域。算法

2. 测试环境

DolphinDB部署在5个ecs.r5.large节点上,每一个节点基本配置以下:数据库

  • 操做系统:Ubuntu 16.04
  • 处理器:Intel Xeon Platinum 8163 (2 Cores)
  • 内存:16 GB
  • 硬盘:150 GB SSD

HybridDB采用2C SSD配置,拥有4个计算节点,每一个节点基本配置以下:缓存

  • 处理器:2 Cores
  • 内存:16 GB
  • 硬盘:160 GB SSD

DolphinDB采用1个主节点,4个计算节点,配置8个worker和2个local executor,每一个计算节点限制使用12 GB内存。服务器

HybridDB直接使用,不作任何进一步的配置,每一个计算节点2个段数据库。通过测试开启Pivotal Query Optimizer时HybridDB表现更差,所以本报告中全部测试都默认只使用Legacy Query Optimizer。架构

压缩为gzip的CSV数据存放在阿里云OSS服务器上。DolphinDB经过内网得到OSS上的数据后解压并加载,HybridDB直接经过oss协议定义外部表从内网传输、解压并加载OSS上的数据。并发

3. 数据

咱们使用的数据是2007年8月的股票报价数据,大约有65.6亿条记录,天天的数据保存在一个CSV文件中。未压缩的CSV文件有273 GB,压缩为gzip的文件有23 GB。压缩后的数据被上传到阿里云OSS上。app

4. 数据加载对比

表4.1是DolphinDB和HybridDB加载CSV文件时各变量数据类型,分区方案以下分布式

  • DolphinDB使用date和symbol进行组合分区。根据date产生了23个值分区,根据symbol产生了128个范围分区。分区总数是23*128=2944个。每一个分区写入两个副本。
  • HybridDB根据symbol散列分布数据,根据date按日期范围分区,在压缩的状况下对symbol施加sort key有不到10%的性能降低,在不压缩的状况下对symbol施加sort key有不到10%的性能上升,随后的测试中都没有使用sort key。

两个平台的数据加载对比结果如表4.2所示,因为DolphinDB和HybridDB都从OSS上获取压缩数据,所以能够认为HybridDB的数据传输和解压时间与DolphinDB基本一致,则HybridDB的数据载入时间能够认为是90-9-12=69分钟。DolphinDB的数据载入速度约为HybridDB的3倍。ide

表4.1 数据类型对应关系

3ca663996ef63d16da6905cd0011533d.png

表4.2 数据处理并载入对比

aecedd677660f849e35cc4985800cd70.png

DolphinDB采用LZ4格式的压缩,HybridDB基于开源Greenplum,不支持QuickLZ格式,所以采用了ZLIB的3级压缩。压缩后的磁盘空间(28G)占用少于DolphinDB(51G)。上表中DolphinDB的空间占用达到了102G是由于有两个副本。

5. 查询性能对比

咱们在两个系统中分别测试了8种查询。这些查询涉及数据过滤、排序、分组和聚合,因为DolphinDB与HybridDB的语法有差别,具体查询语句见表5.1。

每条查询须要扫描不一样范围的数据,下述8条测试查询覆盖了局部扫描到全表扫描。遗憾的是在HybridDB中对第7条查询支持较差,在系统压力大的状况下会出现内部错误(Unexpected Internal Error),所以在HybridDB的测试中将除去第7条查询。

单个复杂查询的对比结果如表5.2所示,每条查询的测试连续进行2次,表中列出第1次的结果,DolphinDB比HybridDB快3~240倍,而且在缓存的支持下,第1至3条查询缓存后进行的第2次测试用时分别为26ms,16ms和16ms。

从结果中能够看出,第一、3和6条查询是DolphinDB显著领先的,这些查询在where分句中均指定了明确的symbol。回顾两个系统的分区策略,因为HybridDB不支持字符串类型的范围分区,所以涉及到不一样的symbol的查询就会由于分区不够灵活而致使部分节点实际扫描的数据远多于目标数据而性能劣化。

表5.1 具体执行的查询语句

68bd55d35987a0143cd504e12efdb133.png

表5.2 单独执行每一个查询的用时对比

739196532add47dc7a4ac9515b158764.png

6. 并发性能对比

6.1 多用户并发简单查询

在本节,咱们将进行多用户并发查询测试对比。结果代表,即便在多用户并发查询的状况下,DolphinDB仍然比HybridDB更具优点。

咱们首先进行简单的select查询并发测试。步骤以下:

(1)咱们从2007年8月的股票数据中选择了记录最多的100只股票。这100只股票的记录占了总记录的20%。

(2)创建n(1~32)个数据库链接。每一个数据库链接都是并发用户。在每一个数据链接中,先从步骤1获得的100只股票中随机选取10只(如AMZN),而后在2007年8月中随机选择一个交易日(如2007年8月21日)来生成简单查询。例如:

select * from quotes where date = 2007.08.21 and symbol="AMZN"

经过n(1~32)个数据库链接,把步骤2生成的10个查询的批处理请求同时发送给数据库。

(3)每一个并发用户数量的测试都执行三次,并取平均用时做为结果。

HybridDB集群每一个计算节点提供了2个CPU核心,从结果中能够看出,HybridDB在并发用户数每增长2个时,消耗时间显著增长,这是由于HybridDB底层由PostgreSQL实例构成,每条查询只会用到1个CPU核心,当只有奇数个并发用户时另外一个核心会处于空闲状态而不会被充分利用起来,致使了资源的浪费。同时HybridDB的MPP架构会将数据分散到各个节点,最后只有拥有相关数据的节点会执行查询,另外的节点会闲置。回顾第5节中的结论,因为简单select查询均涉及symbol,所以HybridDB也会有较大性能瓶颈。

表6.1 多用户并发简单查询用时对比

c5566467e1ae99e5ee3374ef7ee298cf.png

6.2 多用户并发复杂查询

在多用户并发简单查询的基础上,咱们还测试了前述的7个复杂查询(8个复杂查询除去没法在HybridDB上使用的第7条)的并发性能。单用户执行7个查询的耗时,与7个查询单独测试时的耗时累加相接近,符合预期。随着并发用户的增长,DolphinDB对HybridDB的优点一样不断扩大,与并发简单查询的结果吻合。

能够预见,随着并发数量的持续增长,DolphinDB对HybridDB的优点则会不断扩大。

表6.2 多用户并发复杂查询用时对比

b74f1f35370638957a55933db2003372.png

7. DolphinDB的性能优点分析

在本报告中,咱们对DolphinDB和HybridDB,在时间序列数据集上进行了性能对比测试。测试涵盖了CSV文件的加载、单个查询的执行、并发查询的执行等三方面。在咱们进行的全部测试中,DolphinDB均表现得更出色,主要结论以下:

  • 在加载数据的测试中,DolphinDB的速度是HybridDB的3倍
  • 在查询的测试中,DolphinDB的速度领先HybridDB约1~2个数量级
  • 在并发查询的测试中,DolphinDB仍然保持1个数量级以上的优点,并且随着并发用户的增长,优点更加明显。

DolphinDB database 对于HybridDB的性能优点来源于多个方面,包括内存管理优化、对字符串处理的优化、算法上的优化等等,但最主要的优点来源于DolphinDB database 基于分布式文件系统的架构设计。

基于Greenplum的HybridDB集群是由一个主节点(master node)和多个承载PostgreSQL实例的计算节点 (segment host node) 组成,采用传统的大规模并行处理(MPP)架构。这种结构设计上十分简洁。写入数据时,主节点肯定数据分发方式,随后每一个节点并发写入,并将不属于本身的数据传输给其余节点。查询时,主节点会把查询通过优化器处理后分配给计算节点。简单地说,HybridDB在数据存储和计算查询时采用树状结构;而DolphinDB采用更为扁平的网状结构,每一个节点不分主次。采用树状结构,容易出现数据分布的不均衡,或者在用户不饱和或查询的数据只存在于部分节点时反而会出现明显的资源闲置和系统瓶颈。

在分区上,HybridDB支持范围分区、值分区和组合分区,可是范围分区只支持数值或时间类型,灵活性不如DolphinDB。DolphinDB支持值分区、范围分区、散列分区和列表分区等多种分区方案,而且每一个表能够根据多个字段进行组合分区,同时范围分区支持字符串等非数值类型。在分区数量上,DolphinDB中的单表支持百万级以上的分区数,分区粒度更细,不易出现数据或查询集中到某几个节点的情况。在执行基于多个列的范围查询或者点查询时,DolphinDB须要扫描的数据块很是少,查询的响应时间更短,并发性更出色。

相关文章
相关标签/搜索