时序数据库是一种专门面向时序数据进行优化的数据库管理系统。
主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据,具有下面特征之一的时序型特征的数据可以考虑使用:
- 大量高性能的写入;
- 聚合实时分析;
- 数据实时可视化分析;
- 数据量巨大,需要压缩存储;
- 历史数据需要高效地删除;
2022年12月时序数据库排行榜
https://db-engines.com/en/ranking/time+series+dbms
业界常见时序数据库
1、 Influxdb
在 https://www.influxdata.com/ 可以看到有三个产品:
- InfluxDB Cloud 云模式。
- InfluxDB OSS 独立部署集群版。
- InfluxDB OSS 独立部署单机版,开源。https://github.com/influxdata/influxdb 官方数据单机性能27W,
star 24.6K
https://awesome.influxdata.com/docs/part-1/introduction-to-influxdb/
TICK 架构 是 InfluxData 平台的组件的集合首字母缩写,该集合包括 Telegraf、InfluxDB、Chronograf 和 Kapacitor。
TICK 架构以及各组件分工情况如图所示:
目前业界大厂(阿里、360...)的做法基本上是基于influxdb做二次开发, 实现分布式的集群方案。
部分互联网公司会基于proxy方案实现高可用和容灾能力
相关开源的:
- https://github.com/influxdata/influxdb-relay
- https://github.com/shell909090/influx-proxy
- https://github.com/chengshiwen/influx-proxy
- https://github.com/Qihoo360/influx-proxy https://www.infoq.cn/article/IcvfEmGM8WzS8PO72ZwR
2、Kdb+
1998年,Kx Systems(https://kx.com/)发布了kdb。
Kx Systems在2003年发布了64位版本的kdb+。
它是用q语言写的。Kdb+是为处理金融、物联网等领域的大量时间序列数据而构建的。
kdb+时间序列数据库是世界上最小(只有几十KB)和最快的。它的单一集成平台使其非常有效地分析超大型数据集,并加快了基于我们的高性能核心技术构建的Kx解决方案的开发和部署(官方描述)。
特点:
- 内存数据库(In Memory Database),将数据放置在内存中
- 解释型语言(Interpreted)
- 有序列表(Ordered Lists), 实现高速处理数据的关键,区别于传统数据库。
- 赋值顺序(Evaluation Order)
- 面向表编程(Table Oriented)
- 面向列编程(Column Oriented)
- 强类型(Types)
3、Graphite
根据官方文档(http://graphite.readthedocs.io/en/latest/overview.html#about-the-project),它只做两件事:
- 存储数字时间序列数据
- 呈现此数据的图形
4、Prometheus
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。
根据其官方文档(https://github.com/prometheus/prometheus/blob/master/README.md),Prometheus因具备如下的特征而得以将自己与其他监控系统区别开来:
- 多维数据模型,其时序数据由指标名称和键/值维度定义;
- 灵活的查询语言;
- 自治的单服务器节点,不依赖于分布式存储;
- 通过HTTP之上的pull model进行数据收集;
- 时间序列数据推通过中介网关传送到其他数据目的地和存储介质;
- 服务发现和静态配置来发现目标节点;
- 对图表和仪表板的多种支持模式;
- 垂直和水平上支持Federation。
开源 https://github.com/prometheus/prometheus
star 45.8K
5、 TimescaleDB
- 基于时序优化
- 自动分片(自动按时间、空间分片(chunk)),自动调整 CHUNK 的大小
- 全 SQL 接口
- 支持垂直于横向扩展
- 支持时间维度、空间维度自动分区。空间维度指属性字段(例如传感器 ID,用户 ID 等)
- 支持多个 SERVER,多个 CHUNK 的并行查询。分区在 TimescaleDB 中被称为 chunk。
- 内部写优化(批量提交、内存索引、事务支持、数据倒灌)。
内存索引,因为 chunk size 比较适中,所以索引基本上都不会被交换出去,写性能比较好。
数据倒灌,因为有些传感器的数据可能写入延迟,导致需要写以前的 chunk,timescaleDB 允许这样的事情发生(可配置)。 - 利用已有的 PostgreSQL 特性(支持 GIS,JOIN 等),方便的管理(流复制、PITR)
6、DolphinDB
DolphinDB是由浙江智臾科技有限公司研发的一款高性能分布式时序数据库
7、Monarch
来自Google的闭源内存时序数据库,全局配置,靠分zone来实现大规模的监控管理。
参看:时序数据库 | Monarch: 谷歌的全球级内存时序数据库
8、beringei
来自facebook的开源内存时序数据库。
https://github.com/facebookarchive/beringei
star 3.1K
9、 OpenTSDB
来自 SoundCloud 开源
https://github.com/OpenTSDB/opentsdb
star 4.8K
基于Hbase数据库作为底层存储,向上封装自己的逻辑层和对外接口层。这种架构可以充分利用Hbase的特性实现了数据的高可用和较好的写入性能。但相比Influxdb,OpenTSDB数据栈较长,在读写性能和数据压缩方面都还有进一步优化的空间。 整体架构如下:
10、 涛思数据 TDengine
来自 涛思 开源
https://github.com/taosdata/TDengine
star 20.2K
一个采集点是一个表,根据表维度做分片,根据时间维度做分区。
每个物理节点上可有多个分片,一个分片的副本分布在不同的机器上。
meta data 协调分片,以及存储存储表、超级表、节点信息。
11、阿里云 时序数据库 TSDB
来自 阿里云 闭源
https://help.aliyun.com/product/54825.html
自研+提供influx版本
和官方集群版描述的一样,任意数据节点可以承接流量然后通过meta节点来协调,转发部分请求到其他的数据节点,
最后汇总结果信息,将最终结果返回给client。
12、 腾讯云 CTSDB
来自 腾讯云 闭源 基于influx版本自研
https://cloud.tencent.com/product/ctsdb
和官方集群版描述的一样,任意数据节点可以承接流量然后通过meta节点来协调,转发部分请求到其他的数据节点,最后汇总结果信息,将最终结果返回给client。
13、 GaussDB(for Influx)
来自 华为云 闭源
https://www.huaweicloud.com/product/gaussdbforinflux.html
基于influx版本自研
http://www.opengemini.org/(计划开源)
14、 Apache Druid
来自 Apache 开源, 更侧重于多元分析
https://github.com/apache/druid
star 12.2K
15、 饿了么 LinDB
broker更像一个proxy,storage是数据节点,并且通过etcd作为媒介进行沟通,broker收到请求后根据分片配置。
生成执行计划,然后在etcd里面生成查询任务,数据节点watch etcd的task相关的key进行查询并更新task状态机。
整个task的执行都是etcd进行异步处理的,有点儿像k8s的调度策略,broker最终汇总结果返回给client。
InfluxDB 更适合的用途:
- 需要 logging 监控;
- 需要精细的时间尺度;
- 需要 TICK 生态的易用性;
LinDB 更适合的用途:
- 需要查询速度更快;
- 需要解决海量数据的时序场景;
- 对时序数据时间精度不敏感,比如监控领域;
总结
Influxdb在各个大云厂商里面已经被广泛使用,并且社区活跃度比较高,产品的稳定性经过了充分的验证,值得推荐。
主要风险为,influxdb官方只开源单机版本,分布式版本是闭源的,各大厂商都自行扩展了集群版本。