分享

时间序列数据库分析

 15所 2021-02-18

什么是时间序列数据

什么是时间序列(Time Series,以下简称时序)数据?从定义上来说,就是一串按时间维度索引的数据。用描述性的语言来解释什么是时序数据,简单的说,就是这类数据描述了某个被测量的主体在一个时间范围内的每个时间点上的测量值。

时序数据用于描述一个物体在历史的时间维度上的状态变化信息,而对于时序数据的分析,就是尝试掌握并把控其变化的规律的过程。随着物联网、大数据和人工智能技术的发展,时序数据也呈一个爆发式的增长。而为了更好的支持这类数据的存储和分析,在市场上衍生出了多种多样的新兴的数据库产品。这类数据库产品的发明都是为了解决传统关系型数据库在时序数据存储和分析上的不足和缺陷,这类产品被统一归类为时序数据库。

时序数据库本身是一个比较新的概念,直到5年前,DB-Engine才将时序数据库列为一个独立的分类。虽然时序数据库的概念比较新,但是时序数据却由来已久。从古至今,在我们的日常生活中,时序数据从未缺席。在十几年前,时序数据只能选择存放在关系型数据库中,但是随着通信技术的发展,特别是互联网技术的发展,时序数据的增长速度呈现指数级别,使用关系型数据库来存储时序数据显然跟不上时代的节奏了,所以时序数据库应运而生。时序数据库就是一类专门为处理时间序列数据而设计并优化的数据库管理系统。

主要用例

时间序列数据的应用非常广泛,包括:

  • IT运维
    各种IT的软硬件无时无刻不在产生大量的时间序列,主要表现为各种日志数据。
  • 物联网 IOT
    工业机器和设备上的传感器,可穿戴设备,车辆,物理容器,托盘,智能家居的消费设备等的数据。
    例如通过可穿戴设备对个人健康的管理,就是通过设备不断采集你的个人健康数据,例如心跳、体温等等,收集完数据后套用模型计算来评估你的健康度。
  • 股市和其它经济运行数据
    经典证券,较新的加密货币,支付,交易事件。
  • 应用程序事件
    用户/客户交互数据,如点击流,综合浏览量,登录,注册等。
  • 商业智能
    跟踪关键业务指标和业务的整体健康状况。
  • 环境监测
    例如温度,湿度,压力,pH值,花粉计数,空气流量,一氧化碳(CO),二氧化氮(NO2),颗粒物质(PM10)。

时序数据的特点

时间序列数据具有以下的主要特点

  • 以时间为中心,必须拥有时间戳
    • 时间戳可以是事件产生的时间(event time),时间摄取的时间(ingestion time)和事件处理的时间(processing time)。通常事件产生的时间是时间序列最重要的时间。
  • 数据写入的特点
    • 写入平稳、持续、高并发高吞吐:时序数据的写入是比较平稳的,这点与应用数据不同,应用数据通常与应用的访问量成正比,而应用的访问量通常存在波峰波谷。时序数据的产生通常是以一个固定的时间频率产生,不会受其他因素的制约,其数据生成的速度是相对比较平稳的。时序数据是由每个个体独立生成,所以当个体数量众多时,通常写入的并发和吞吐量都是比较高的,特别是在物联网场景下。写入并发和吞吐量,可以简单的通过个体数量和数据生成频率来计算,例如若你有1000个个体以10秒的频率产生数据,则你平均每秒产生的并发和写入量就是100。
    • 写多读少:时序数据上95%-99%的操作都是写操作,是典型的写多读少的数据。这与其数据特性相关,例如监控数据,你的监控项可能很多,但是你真正去读的可能比较少,通常只会关心几个特定的关键指标或者在特定的场景下才会去读数据。
    • 实时写入最近生成的数据,无更新,只添加:时序数据的写入是实时的,且每次写入都是最近生成的数据,这与其数据生成的特点相关,因为其数据生成是随着时间推进的,而新生成的数据会实时的进行写入。数据写入无更新,在时间这个维度上,随着时间的推进,每次数据都是新数据,不会存在旧数据的更新,不过不排除人为的对数据做订正。
  • 数据查询和分析的特点
    • 按时间范围读取:通常来说,你不会去关心某个特定点的数据,而是一段时间的数据。所以时序数据的读取,基本都是按时间范围的读取。
    • 最近的数据被读取的概率高:最近的数据越有可能被读取,以监控数据为例,你通常只会关心最近几个小时或最近几天的监控数据,而极少关心一个月或一年前的数据。
    • 多精度查询:按数据点的不同密集度来区分不同的精度,例如若相邻数据点的间隔周期是10秒,则该时序数据的精度就是10秒,若相邻数据点的时间间隔周期是30秒,则该时序数据的精度就是30秒。时间间隔越短,精度越高。精度越高的数据,能够还原的历史状态更细致更准确,但其保存的数据点会越多。这个就好比相机的像素,像素越高,照片越清晰但是相片大小越大。时序数据的查询,不需要都是高精度的,这是实际的需求,也是一种取舍,同样也是成本的考虑。还是拿监控数据举例,通常监控数据会以曲线图的方式展现,由人的肉眼去识别。在这种情况下,单位长度下若展示的数据点过于密集,反而不利于观察,这是实际的需求。而另外一种取舍是,若你查询一个比较长的时间范围,比如是一个月,若查询10秒精度的数据需要返回259200个点,而若查询60秒精度的数据则只要返回43200个点,这是查询效率上的一种取舍。而成本方面的考虑,主要在存储的数据量上,存储高精度的数据需要的成本越高,通常对于历史数据,可以不需要存储很高精度的数据。总的来说,在查询和处理方面,会根据不同长度的时间范围,来获取不同精度的数据,而在存储方面,对于历史的数据,会选择降精度的数据存储。
    • 多维分析:时序数据产生自不同的个体,这些个体拥有不同的属性,可能是同一维度的,也可能是不同维度的。还是举个监控的例子,我有个对某个集群上每台机器的网络流量的监控,此时可以查询这个集群下某台机器的网络流量,这是一个维度的查询,而同时还需要查询这个集群总的网络流量,这是另外一个维度的查询。
    • 数据挖掘:随着大数据和人工智能技术的发展,在存储、计算能力以及云计算发展的今天,数据的高附加值的挖掘已经不再有一个很高门槛。而时序数据蕴含着很高的价值,非常值得挖掘。
  • 数据存储的特点
    • 数据量大:拿监控数据来举例,如果我们采集的监控数据的时间间隔是1s,那一个监控项每天会产生86400个数据点,若有10000个监控项,则一天就会产生864000000个数据点。在物联网场景下,这个数字会更大。整个数据的规模,是TB甚至是PB级的。
    • 冷热分明:时序数据有非常典型的冷热特征,越是历史的数据,被查询和分析的概率越低。
    • 具有时效性:时序数据具有时效性,数据通常会有一个保存周期,超过这个保存周期的数据可以认为是失效的,可以被回收。一方面是因为越是历史的数据,可利用的价值越低;另一方面是为了节省存储成本,低价值的数据可以被清理。
    • 多精度数据存储:在查询的特点里提到时序数据出于存储成本和查询效率的考虑,会需要一个多精度的查询,同样也需要一个多精度数据的存储。

时间序列模型

许多应用程序或数据库实际上采用的是过于狭窄的视图,并将时间序列数据与特定形式的服务器度量值等同起来。

但事实上,在许多监控应用中,不同的度量经常被收集在一起(例如CPU、内存、网络统计、电池寿命)。因此,单独考虑每个度量并不总是有意义的。考虑这种可替代的“更广泛”的数据模型,它保持了同时收集的度量之间的相关性。

时序数据的数据模型主要有这么几个主要的部分组成:

  • 主体 (Metrics): 被测量的主体,一个主体会拥有多个维度的属性(Label/Tag/Dimension)。以服务器状态监控场景举例,测量的主体是服务器,其拥有的属性可能包括集群名、Hostname等。
  • 测量值(Measure/Value): 一个主体可能有一个或多个测量值,每个测量值对应一个具体的指标。还是拿服务器状态监控场景举例,测量的指标可能会有CPU使用率,IOPS等,CPU使用率对应的值可能是一个百分比,而IOPS对应的值是测量周期内发生的IO次数。
  • 时间戳(TimeStamp): 每次测量值的汇报,都会有一个时间戳属性来表示其时间。
时间序列数据库分析

上图是两种时序数据的模型,一种每一条包含多个测量值,另一种每一条只包含一个测量值。

产品和公司

主要数据库自2013年以来的趋势(dbengine)

时间序列数据库分析

通过上图我们可以看出,图数据库和时序数据库在最近几年上升趋势明显,而搜索引擎和传统的关系型数据库发展缓慢。

时间序列数据库dbengine的排名

时间序列数据库分析

时间序列数据库dbengine的趋势

时间序列数据库分析

对于时序数据库,我们主要从领导者,大厂,开源,多模型和新兴产品来分析以下。

领导者

InfluxDB是时序数据库的领导者,它背后的公司是influxdata,他的产品采用了开源和商业产品混合的模式,基本功能开源,对于扩展的多实例部署进行收费。

Influxdata主要提供产品包括:

  • 开源的influxdb
  • influxDB企业版
  • InfluxDB 云
  • 开源指标采集工具telegraph

KDB+是由Kx Systems开发的基于列的关系时间序列数据库。 Kdb +数据库设计用于财务领域,以存储时间序列数据并在数据增加时进行扩展/扩展。Kdb +是基于有序列表的概念的面向列的内存数据库。内存中意味着它主要将数据存储在RAM中。使用简化的数据库引擎,它可以非常快速地运行,但是它需要大量的RAM(这不再是一个问题,因为具有大量RAM的服务器现在很便宜)。

kdb+时间序列数据库是世界上最小(只有几十MB)和最快的。它的单一集成平台使其非常有效地分析超大型数据集,并加快了基于我们的高性能核心技术构建的Kx解决方案的开发和部署(官方描述)。

kdb+(基于q或者k语言的db, 增强版,也简称kdb)被官方称为世界上最快的时间序列数据库,它有非常高的性能和丰富高效的时间序列函数。列式存储的特性,使得对于某个列的统计分析操作异常方便。全球顶尖的投行、高盛、摩根、国内许多证券公司和私募基金也开始使用,在延迟性上有着苛刻要求的金融领域,kdb+有着独特的优势。

特点:

1、内存数据库(In Memory Database),将数据放置在内存中

2、解释型语言(Interpreted)

3、有序列表(Ordered Lists), 实现高速处理数据的关键,区别于传统数据库。

4、赋值顺序(Evaluation Order)

5、面向表编程(Table Oriented)

6、面向列编程(Column Oriented)

7、强类型(Types)

开源时序数据库

除了之前提到的influx,还有以下的一些开源的时序数据库

  • Prometheus
    https:///
    Prometheus 是一个完整的监控和趋势系统,包括内置和活动的抓取、存储、查询、绘图和基于时间序列数据的报警。它知道监控应该是什么样子(监控点应该存在,时间序列模式意味着什么问题,等等),并积极地寻找错误。Prometheus有一个监控系统和自带的时序数据库组成。
    • 1.Prometheus获取数据的方式只有一种,就是scrape,也称作pull,意为拉取。Prometheus每隔一段时间会从目标(target)这里以Http协议拉取指标(metrics),这些目标可以是应用,也可以是代理,缓存中间件,数据库等等一些中间件。
    • 2.拉取出来的数据Prometheus会存到自己的TSDB数据库。自己的WebUI控制台以及Grafana可以对其数据进行时间范围内的不断查询,绘制成实时图表工展现。
    • 3.Prometheus 支持例如zookeeper,consul之类的服务发现中间件,用以对目标(target)的自动发现。而不用一个个去配置target了。
    • 4.AlertManager组件支持自定义告警规则,告警渠道也支持很多种

thanos 是常见的Prometheus的开源存储引擎 https://github.com/thanos-io/thanos

  • Graphite
    https:///
    Graphite 专注于成为一个具有查询语言和绘图功能的被动时间序列数据库。任何其他问题都由外部组件处理。
    Graphite主要由三个部分组成:
    • Carbon 高性能时序数据监听服务
    • Gaphite-web Web查询服务
    • Whisper 高性能时序数据库引擎
时间序列数据库分析
  • Apache Druid
    https://github.com/apache/druid
    https://druid./
    Druid是一个高性能实时分析数据库。Druid专为真正需要快速查询和摄取的工作流而设计。 Druid擅长于为UI提供动力,运行可操作(临时)查询或处理高并发性。在各种使用案例中,将Druid视为数据仓库的开源替代方案。
    Druid主要由主服务,查询服务,数据服务组成。存储系统由外部系统提供。
  • TimeScaleDB
    https://github.com/timescale/timescaledb
    类似于Influx,TimescaleDB也同时提供开源和商业化版本的时序数据库,同时也提供云的部署。
    TimescaleDB 是基于PostgresSQL来构建和扩展,这意味着它在整个PostgreSQL实例中运行。扩展模型使数和据库可以利用PostgreSQL的许多属性,例如可靠性,安全性以及与各种第三方工具的连接性。同时,TimescaleDB通过在PostgreSQL的查询计划程序,数据模型和执行引擎中添加钩子,从而充分利用了扩展可利用的高度定制。从用户的角度来看,TimescaleDB公开了看起来像单表的表,称为超表,实际上是包含数据的许多单个表(称为)的抽象或虚拟视图。
    块是通过将超表的数据划分为一个或多个维度来创建的:所有超表均按一个时间间隔进行分区,并且可以另外通过键(例如设备ID,位置,用户ID等)进行分区。我们有时将其称为分区跨越“时间-空间”。
  • Open TSDB
    http:///
    OpenTSDB是老牌的开源时序数据库,最近已经不是很活跃,上一个release是2018年了。

大厂的时序数据库

因为时序数据库的迅速发展,各个的大厂都推出了自己的时序数据库的产品,包括:

  • 亚马逊 Timestream
    https://aws.amazon.com/timestream/
    Amazon Timestream 是一种快速、可扩展的无服务器时间序列数据库服务,适用于物联网和运营应用程序,使用该服务每天可以轻松存储和分析数万亿个事件,速度提高了 1000 倍,而成本仅为关系数据库的十分之一。通过将近期数据保留在内存中,并根据用户定义的策略将历史数据移至成本优化的存储层,Amazon Timestream 为客户节省了管理时间序列数据生命周期的时间和成本。Amazon Timestream 专门构建的查询引擎可用于访问和分析近期数据和历史数据,而无需在查询中显式指定数据是保存在内存中还是成本优化层中。Amazon Timestream 内置了时间序列分析函数,可帮助您近乎实时地识别数据的趋势和模式。Amazon Timestream 是无服务器服务,可自动缩放以调整容量和性能,因此您无需管理底层基础设施,让您可以专注于构建应用程序。
  • 阿里 Cloud TSDB
    阿里提供时序数据库TSDB,提供百万级时序数据秒级写入、高性能、低成本、稳定可靠的在线时序数据库服务。同时阿里也提供了InfluxDB的云部署。
  • IBM DB2 event store
    https://www.ibm.com/products/db2-event-store
    IBMDb2®Event Store是一个内存优化的数据库,旨在为事件驱动的应用程序快速摄取和分析流数据。 IBM Watson Studio内置在IBM Db2 Event Store中,以提供集成的协作开发体验,并支持创建机器学习模型。
  • 腾讯 CTSDB
    https://cloud.tencent.com/product/ctsdb
    时序数据库 CTSDB(TencentDB for CTSDB)是腾讯云推出的一款分布式、可扩展、支持近实时数据搜索与分析的时序数据库。该数据库为非关系型数据库,提供高效读写、低成本存储、强大的聚合分析能力、实例监控以及数据查询结果可视化等功能。整个系统采用多节点多副本的部署方式,有效保证了数据的高可用性和安全性。
    根据腾讯自己发布的测试数据,性能优于InfluxDB

除了上述产品,华为,百度也都有自己的时序数据库产品。

新兴时序数据库产品

  • 涛思数据的TDengine
    https://www./cn/
    https://github.com/taosdata/TDengine
    TDengine是涛思数据专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度,且核心代码,包括集群功能全部开源。TDengine的模块之一是时序数据库。但除此之外,为减少研发的复杂度、系统维护的难度,TDengine还提供缓存、消息队列、订阅、流式计算等功能,为物联网、工业互联网大数据的处理提供全栈的技术方案,是一个高效易用的物联网大数据平台。
    根据涛思数据自己发布的数据,其写入和查询性能皆优于Clickhouse和InfluxDB
  • VictoriaMetrics
    https:///
    https://github.com/VictoriaMetrics/VictoriaMetrics
    VictoriaMetrics是快速,经济高效且可扩展的监视解决方案和时间序列数据库,它也提供开源和商业化的时序数据库解决方案。
  • Apache IoTDB
    https://iotdb./
    https://github.com/apache/iotdb
    IoTDB(物联网数据库)是用于时间序列数据的数据管理系统,可以为用户提供特定的服务,例如数据收集,存储和分析。凭借其轻巧的结构,高性能和可用功能以及与Hadoop和Spark生态的无缝集成,IoTDB满足了工业IoT领域中海量数据集存储,高吞吐量数据输入和复杂数据分析的要求。

另外在某些场合,我么也可以把Splunk和ES作为时序数据库来使用,用作时序数据的分析。

功能和架构设计

从架构上来看,为了支持时序数据的使用特点,主要需要考虑以下的架构设计:

数据的存储和索引

根据时序数据的访问特点,主要的数据存储的设计有:

  • 列存储,支持分析和聚合的场景,也同时支持数据压缩
  • LSM tree, 利用顺序写要远比随机写性能高出很多的特点,可以有效的支持Append only的用例
  • 基于已有的关系数据库或者KV数据库构建
  • 基于特定的数据文件构建

一般对针对时间对数据进行分片,提高数据写入和访问的效率,并可以有效的按照时间范围管理数据。

分布式的水平扩展

大部分的时序数据库都支持水平扩展的集群部署,Influx和TimeScaleDB都把集群部署作为商业版特有的功能

基于SQL的访问

大部分的的时序数据库都提供SQL或者类似SQL的查询语言,提高访问的易用性。基于时间纬度的上卷和下钻, AVG、SUM、MAX、MIN等聚合函数是时序分析的标配。

数据压缩,降采样和聚合

因为时序数据的产生量巨大,对于数据的压缩要求比较高。降采样可以有效的降低查询时间和存储的占用,有很多的时序数据库内置了降采样的功能,另一些时序库采用预聚合的功能来实现类似功能。

注: Downsampling就是将一个高精度的时序数据转换为一个低精度的时序数据的过程,这个过程被称作Rollup。它与GroupBy的过程比较类似,核心区别是GroupBy是基于相同的时间粒度,把同一时间层面上的不同维度的数据做聚合,转换后的结果还是相同时间粒度的数据,只不过是更高的一个维度。而Downsampling是不同时间层面上把相同维度的数据做聚合,转换为更粗时间粒度的数据,但是还是拥有相同的维度。

数据生命周期和时效管理

基于时序数据的特点,我们希望对数据按照时间的新旧进行生命周期的管理,分冷,温,热数据。

权限和安全管理

基于表级别的权限管理

智能化和机器学习

提供对时间序列预测的能力只出现在少数时序数据库的商业化版本中

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多