什么是时序数据
所谓时序数据,非常通俗的角度来讲,就是一些随着时间变化而变化的值 (Value),同时这些值上面附带有一些 Key=Value 组成的 标签。
一般包括下列三个属性(来自 Wikipedia):
时间线(Time series)
一个名称(通常称为指标,metric)和一系列 Key=Value 标签( Label,或者一般称之为 Tag)组成的唯一标识。
键值对(Timestamp, Value)
时间戳和值组成的键值对,并且按照时间戳自然排序,这些键值对一般称为采样(Sample)。
数值(Value)
第 2 点中的 Value 一般是数值,比如气温、湿度、CPU、内存占用等,但是也可能是任意的数据结构(结构化,非结构化都有可能)。
时序数据的特点
- 数据是相对高频、稳定地产生,并且频率一般较为稳定,不随人们的昼夜活动周期而变化。传感器的种类众多,叠加上行业、地理位置的大量标签,数据和时间线的规模膨胀都极其庞大。并且这样的数据规模随着智能设备(可穿戴设备、智能汽车、智能制造)的普及以及人们对这些数据应用提出的更精细的需求而迅速增长。
- 数据的变更特征上是更类似 Append-Only 的方式,数据源源不断地添加上去, 更新的场景较少(但是仍然有,特别是弱网环境下的数据延迟),数据的删除通常是以过期时间为周期批量地删除。
- 数据应用上,最常见的还是日常和异常监控,基于这些数据搭建可视化监控报表和告警系统,其次是未来趋势的预测,也就是时序预测,特别是在金融领域
什么是时序数据库
时序数据库(Time Series Database)如果按照 Wikipedia 的定义就是专门面向时序数据处理优化的数据库,它是领域数据库的一种,都是为了特定业务领域的数据处理服务,比如图数据库处理图的存储和检索,文档数据库用于半结构化的文档的存储和检索,搜索引擎专门用于非结构化文本的检索等。
时序数据库的特点
为了应对上述时序数据的特点和所涉及的挑战,TSDB 采用了一些技术。其中一些典型特征包括:
-
Log-Structured Merge-tree(LSM-tree)
LSM-tree 是一种基于磁盘的数据结构,为写入量较大的工作负载进行了优化,通过在一系列层次中合并和压缩数据,实现了高效的数据摄取和存储。与传统的 B-tree 相比,这减少了写入放大率,提供了更好的写入性能。 -
基于时间的分区
时序数据库通常基于时间间隔对数据进行分区,使查询更快速、更高效,也更容易保留和管理数据。这种方法有助于将最近的、经常访问的数据与较早的、不常访问的数据区隔开来,优化了存储和查询性能。 -
数据压缩
时序数据库采用各种压缩技术,如 delta 编码、Gorilla 压缩或字典编码,以减少存储空间需求。这些技术利用了时序数据中的时间和基于价值的模式,实现高效存储,同时又不丢失数据的保真度。 -
内置基于时间的函数和聚合
时序数据库对基于时间的函数的提供了本地支持,如移动平均数、百分比和基于时间的聚合。与传统数据库相比,这些内置功能使用户能够更有效地执行复杂的时间序列分析,并减少计算开销。
常见的tsdb
-
influxdb 老牌TSDB,但是我还没用过。
-
timescaleDB pg的一个插件式,也没有用过,但也很有名。
-
Promdb 这个用得比较多, 它的promql某些方面来说还是挺好用的。
-
VictoriaMetrics 据称可以轻松组成集群,适合大数据量场景, 另外VictoriaLogs是对应的日志存储方案
-
GreptimeDB 研究HertzBeat时了解到的一个新DB, 用rust编写,似乎是国内开源,据称可以同时存储ts数据与日志数据,这一点很有吸引力,但是它的知名度还不太高
-
Elasticsearch 实际上这个应该是以文档型数据库开始的,但是它也有tsdb的一些使用方式 。 不过ES总的来说消耗资源,存储成本都比较高,不太喜欢用它。
-
clickhouse 在研究ES替代方案时曾经了解过,应该说比ES的存储性价比要高不少,不过我们用得不好, 在存大量数据时的性能并不理想,因为不是我主导的项目,一直没有去深入研究找到解决办法。