目录
- 一、当前主流的时序数据库
- 二、各库特性
- 1、Influxdb
- 2、Timescale
- 3、Druid
- 4、Kdb+
- 5、Graphite
- 6、RRDtool
- 7、OpenTSDB
- 8、TDengine
- 9、DolphinDB
- 三、优缺点对比
因为个人用的go,所以调研及对比主要针对适配了go语言的数据库。
一、当前主流的时序数据库
排名参考于https://db-engines.com
二、各库特性
1、Influxdb
流行度很高,支持Go语言,社区活跃度高。
特性:
- 高效的时间序列数据写入性能。自定义TSM引擎,快速数据写入和高效数据压缩。
- 无额外存储依赖。
- 简单,高性能的HTTP查询和写入API。
- 以插件方式支持许多不同协议的数据摄入,如:graphite,collectd,和openTSDB
- SQL-like查询语言,简化查询和聚合操作。
- 索引Tags,支持快速有效的查询时间序列。
- 保留策略有效去除过期数据。
- 连续查询自动计算聚合数据,使频繁查询更有效。
缺点:
- 分布式未开源
2、Timescale
【不支持GO】
一个基于传统关系型数据库postgresql改造的时间序列数据库
优点:
- PostgreSQL原生支持的所有SQL,包含完整SQL接口(包括辅助索引,非时间聚合,子查询,JOIN,窗口函数)
- 用PostgreSQL的客户端或工具,可以直接应用到该数据库,不需要更改。
- 时间为导向的特性,API功能和相应的优化。
- 透明时间/空间分区,用于放大(单个节点)和扩展
- 高数据写入速率(包括批量提交,内存中索引,事务支持,数据备份支持)
- 单个节点上的大小合适的块(二维数据分区),以确保即使在大数据量时即可快速读取。
- 块之间和服务器之间的并行操作
劣势:
- 因为TimescaleDB没有使用列存技术,它对时序数据的压缩效果不太好,压缩比最高在4X左右
- 目前暂时不完全支持分布式的扩展(正在开发相关功能),所以会对服务器单机性能要求较高
3、Druid
【不支持GO】
Druid是一个实时在线分析系统(LOAP)。其架构融合了实时在线数据分析,全文检索系统和时间序列系统的特点,使其可以满足不同使用场景的数据存储需求。
优点:
- 采用列式存储:支持高效扫描和聚合,易于压缩数据。
- 可伸缩的分布式系统:Druid自身实现可伸缩,可容错的分布式集群架构。部署简单。
- 强大的并行能力:Druid各集群节点可以并行地提供查询服务。
- 实时和批量数据摄入:Druid可以实时摄入数据,如通过Kafka。也可以批量摄入数据,如通过Hadoop导入数据。
- 自恢复,自平衡,易于运维:Druid自身架构即实现了容错和高可用。不同的服务节点可以根据响应需求添加或减少节点。
- 容错架构,保证数据不丢失:Druid数据可以保留多副本。另外可以采用HDFS作为深度存储,来保证数据不丢失。
- 索引:Druid对String列实现反向编码和Bitmap索引,所以支持高效的filter和groupby。
- 基于时间分区:Druid对原始数据基于时间做分区存储,所以Druid对基于时间的范围查询将更高效。
- 自动预聚合:Druid支持在数据摄入期就对数据进行预聚合处理。
缺点:
- 不支持多时间维度,所有维度为String类型
- 只支持流式写入,不支持实时数据更新,更新可以使用批处理作业完成。
- 不支持精准去重
4、Kdb+
kdb+ 号称最快的内存数据库之一。列式存储的特性,使得对于某个列的统计分析操作异常方便。
优点:
- 单体架构,轻松支持 billion以上数据
- 分布式扩展,无性能损耗
- 超低延迟+高并发支持
- 列式存储+内存数据库
- 灵活的Q语言,内置非常多的统计计算方法
缺点:
- 搭配的Q 语言,学习难度较高
5、Graphite
【不支持GO】
Graphite通常用于监控基础设施级别的度量,比如CPU、内存、I/O利用率、网络吞吐量和延迟,当然Graphite在应用程序级的度量和业务级的度量方面也很不错。
6、RRDtool
【不支持GO】
RRDtool 代表 “Round Robin Database tool” , 所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向新的数据的位置。
优点:
- 使用RRD(Round Robin Database)存储格式,数据等于放在数据库中,可以方便地调用。比如,将一个RRD文件中的数据与另一个RRD文件中的数据相加。
- 可以定义任意时间段画图,可以用半年数据画一张图,也可以用半小时内的数据画一张图。
- 能画任意个DS,多种图形显示方式。
- 数据存储与绘图分开,减轻系统负载。
- 能任意处理RRD文件中的数据,比如,在浏览监测中我们需要将数据由Bytes转化为bits,可以将原始数据乘8
缺点:
- RRDTool的作用只是存储数据和画图,它没有MRTG中集成的数据采集功能
- 在命令行下的使用非常复杂,参数极多
- 无用户、图像管理功能
7、OpenTSDB
OpenTSDB 是一个开源框架,使用 HBase 作为核心平台来存储和检索所收集的指标数据,可以灵活地增加指标,也可以支持采集上万台机器和上亿个数据点,具有高可扩展性。
优点:
- 在数据压缩上,时间戳采用 delta 编码进行压缩,数据值采用 XOR 进行压缩
- 存储与计算解耦,为 IoT 场景海量数据、动态热点的数据特征量身打造,方便按照并发度和存储量按需独立扩容。采用分布式架构,支持横向水平扩展
- 较强的时序数据计算能力,主要体现为:插值,缺失的数据点,支持线性插值数据补全
- 降精度,支持预降精度和实时降精度计算,满足高效查询需求
- 空间聚合,支持按照不同的 tag 进行空间聚合和分组计算
缺点:
- 数据查询和分析的能力不足,不是所有的查询场景都能适用,在GroupBy和Downsampling的查询上,也未提供Pre-aggregation和Auto-rollup的支持,查询效率不如其他数据库
- 依赖HBase,较为笨重
8、TDengine
TDengine 是一款开源、高性能、分布式、支持 SQL 的时序数据库,其时序数据库核心代码包括集群功能全部开源,同时 TDengine 还带有内建的缓存、流式计算、数据订阅等系统功能,能大幅减少研发和运维的复杂度
优点:
- 支持水平扩展,有开源的分布式集群解决方案
- 读写性能远高于InfluxDB,压缩率高
- 采用标准 SQL 做查询语言(不完全兼容),并且采用关系数据库模型,学习成本低
缺点:
- 单条插入性能很低,必须成批写入,增加了系统开发和维护的复杂度与运营成本
(调研的时候相关的软广较多,号称性能吊打其他所有库,暂不知真假)
9、DolphinDB
DolphinDB是一款高性能分布式时序数据库。DolphinDB集成了功能强大的编程语言和高容量高速度的流数据分析系统,为海量数据(特别是时间序列数据)的快速存储、检索、分析及计算提供一站式解决方案。
优点:
- 列式混合引擎(基于内存和磁盘),支持单表百万级别的分区数,大大缩减对海量数据的检索响应时间
- 内嵌的分布式文件系统自动管理分区数据及其副本,为分布式计算提供负载均衡和容错能力
- 支持命令式编程、函数式编程、向量编程、SQL编程和RPC(远程函数调用)编程
- 内置Web服务器,用于集群管理、性能监控和数据访问
缺点:
- 安装复杂
- 默认把数据存到内存,对数据源大小有限制,一旦关闭软件,自动释放
- 对收费用户提供高质量的服务
三、优缺点对比
InfluxDB | OpenTSDB | DolphinDB | TDengine | |
---|---|---|---|---|
成熟度 | 成熟 | 一般 | 一般 | 一般 |
集群 | 付费支持 | 支持(HBase) | 支持 | 支持 |
读写速度 | 慢 | 较快 | 较快 | 快 |
使用复杂性 | 一般(类sql) | 较高 | 一般(类sql) | 低(标准sql) |
部署复杂性 | 简单 | 复杂 | 较复杂 | 较简单 |