时序数据库-入门篇

原创 2018年04月15日 17:45:00

1.时序数据的定义

什么是时间序列数据(Time Series Data,TSD,以下简称时序)?从定义上来说,就是一串按时间维度索引的数据。用描述性的语言来解释什么是时序数据,简单的说,就是这类数据描述了某个被测量的主体在一个时间范围内的每个时间点上的测量值。它普遍存在于IT基础设施、运维监控系统和物联网中。
  
对时序数据进行建模的话,会包含三个重要部分,分别是:主体,时间点和测量值。套用这套模型,你会发现你在日常工作生活中,无时无刻不在接触着这类数据。

  • 如果你是一个股民,某只股票的股价就是一类时序数据,其记录着每个时间点该股票的股价。
  • 如果你是一个运维人员,监控数据是一类时序数据,例如对于机器的CPU的监控数据,就是记录着每个时间点机器上CPU的实际消耗值。

时序数据从时间维度上将孤立的观测值连成一条线,从而揭示软硬件系统的状态变化。孤立的观测值不能叫时序数据,但如果把大量的观测值用时间线串起来,我们就可以研究和分析观测值的趋势及规律。其意义体现在两方面:

(1)从时间轴往后看,时序数据可做成报表,观测数据变化规律、捕获异常。这里举两个例子:
下图为共享单车在旧金山某热门区域的每小时车辆的借还数量。通过分析该区域车辆数目的历史数据,单车公司可得知热点借车时间段是否需要车辆补给。
这里写图片描述

下图为某互联网服务的出入流量历史记录。从图中可以明显看到入流量(蓝色线)在某时间段有毛刺,服务提供商可基于此段时间排查服务有无异常。也可以进一步基于流量监控做告警,使运维人员能够及时处理线上问题。
这里写图片描述

(2)从时间轴向前看,时序数据可以建立数学模型、做统计分析,预测事物发展趋势。
举例,下图为联合国在2015年分析过往人口增长趋势后,发布的人口数字及预测报告。从图中可以看出未来非洲人口将持续增长,这是任何一个跨国企业都不该忽略的市场,也预示着当地政府面临重大挑战。
这里写图片描述

这个世界是由数据构成的,在这个世界上存在的每个物体,每时每刻都在产生着数据。而对这些数据的挖掘和利用,在这个时代,正在默默的改变人们的生活方式。例如通过可穿戴设备对个人健康的管理,就是通过设备不断采集你的个人健康数据,例如心跳、体温等等,收集完数据后套用模型计算来评估你的健康度。

如果你的视野和想象空间足够大,你会发现你能够挖掘并利用的数据充斥在你所生活的环境中。这些能够产生数据的对象,会包括你的手机、汽车、空调、冰箱等等。当前比较火热的物联网的核心思想,其实就是构建一个可以让所有物体生产数据并挖掘其价值的网络。而通过这个网络采集的数据,就是典型的时序数据。
  

2.时序数据的特点

2.1 时序数据的数学模型

上面介绍了时序数据的基本概念,也说明了分析时序数据的意义。那么时序数据该怎样存储呢?数据的存储要考虑其数学模型和特点,时序数据当然也不例外。所以这里先介绍时序数据的数学模型和特点。

下图为一段时序数据,记录了一段时间内的某个集群里各机器上各端口的出入流量,每半小时记录一个观测值。这里以图中的数据为例,介绍下时序数据的数学模型(不同的时序数据库中,基本概念的称谓有可能不同,这里以腾讯CTSDB为准):

  • metric: 度量的数据集,类似于关系型数据库中的 table;
  • point: 一个数据点,类似于关系型数据库中的 row;
  • timestamp: 时间戳,表征采集到数据的时间点;
  • tag: 维度列,代表数据的归属、属性,表明是哪个设备/模块产生的,一般不随着时间变化,供查询使用;timestamp 加上所有的 tags 可以认为是 table 的 primary key。
  • field: 指标列,代表数据的测量值,随时间平滑波动,不需要查询。
    这里写图片描述
    如上图所示,这组数据的metric为Network,每个point由以下部分组成:

  • timestamp:时间戳

  • 两个tag:host、port,代表每个point归属于哪台机器的哪个端口
  • 两个field:bytes_in、bytes_out,代表piont的测量值,半小时内出入流量的平均值
    同一个host、同一个port,每半小时产生一个point,随着时间的增长,field(bytes_in、bytes_out)不断变化。如host:host4,port:51514,timestamp从02:00 到02:30的时间段内,bytes_in 从 37.937上涨到38.089,bytes_out从2897.26上涨到3009.86,说明这一段时间内该端口服务压力升高。

2.2 时序数据特点

  • 数据模式: 时序数据随时间增长,相同维度重复取值,指标平滑变化:这点从上面的Network表的数据变化可以看出。
  • 写入: 持续高并发写入,无更新操作:时序数据库面对的往往是百万甚至千万数量级终端设备的实时数据写入(如摩拜单车2017年全国车辆数为千万级),但数据大多表征设备状态,写入后不会更新。
  • 查询: 按不同维度对指标进行统计分析,且存在明显的冷热数据,一般只会频繁查询近期数据。

3.时序数据的存储

3.1 传统关系型数据库存储时序数据的问题

有了时序数据后,该存储在哪里呢?首先我们看下传统的解决方案在存储时序数据时会遇到什么问题。

很多人可能认为在传统关系型数据库上加上时间戳一列就能作为时序数据库。数据量少的时候确实也没问题。但时序数据往往是由百万级甚至千万级终端设备产生的,写入并发量比较高,属于海量数据场景。MySQL在海量的时序数据场景下存在如下问题:

  • 存储成本大:对于时序数据压缩不佳,需占用大量机器资源;
  • 维护成本高:单机系统,需要在上层人工的分库分表,维护成本高;
  • 写入吞吐低:单机写入吞吐低,很难满足时序数据千万级的写入压力;
  • 查询性能差:适用于交易处理,海量数据的聚合分析性能差。

另外,使用Hadoop生态(Hadoop、Spark等)存储时序数据会有以下问题:

  • 数据延迟高:离线批处理系统,数据从产生到可分析,耗时数小时、甚至天级;
  • 查询性能差:不能很好的利用索引,依赖MapReduce任务,查询耗时一般在分钟级。

可以看到时序数据库需要解决以下几个问题:

  • 时序数据的写入:如何支持每秒钟上千万上亿数据点的写入。
  • 时序数据的读取:又如何支持在秒级对上亿数据的分组聚合运算。
  • 成本敏感:由海量数据存储带来的是成本问题。如何更低成本的存储这些数据,将成为时序数据库需要解决的重中之重。

3.2 时序数据库

时序数据库产品的发明都是为了解决传统关系型数据库在时序数据存储和分析上的不足和缺陷,这类产品被统一归类为时序数据库。针对时序数据的特点对写入、存储、查询等流程进行了优化,这些优化与时序数据的特点息息相关:

1) 存储成本:
利用时间递增、维度重复、指标平滑变化的特性,合理选择编码压缩算法,提高数据压缩比;
通过预降精度,对历史数据做聚合,节省存储空间。

2) 高并发写入:
批量写入数据,降低网络开销;
数据先写入内存,再周期性的dump为不可变的文件存储。

3) 低查询延时,高查询并发:
优化常见的查询模式,通过索引等技术降低查询延时;
通过缓存、routing等技术提高查询并发。

3.3 时序数据的数据存储原理

传统数据库存储采用的都是 B tree,这是由于其在查询和顺序插入时有利于减少寻道次数的组织形式。我们知道磁盘寻道时间是非常慢的,一般在 10ms 左右。磁盘的随机读写慢就慢在寻道上面。对于随机写入 B tree 会消耗大量的时间在磁盘寻道上,导致速度很慢。我们知道 SSD 具有更快的寻道时间,但并没有从根本上解决这个问题。

对于 90% 以上场景都是写入的时序数据库,B tree 很明显是不合适的。

业界主流都是采用 LSM tree 替换 B tree,比如 Hbase, Cassandra 等 nosql 中。这里我们详细介绍一下。

LSM tree 包括内存里的数据结构和磁盘上的文件两部分。分别对应 Hbase 里的 MemStore 和 HLog;对应 Cassandra 里的 MemTable 和 sstable。

LSM tree 操作流程如下:

  1. 数据写入和更新时首先写入位于内存里的数据结构。为了避免数据丢失也会先写到 WAL 文件中。
  2. 内存里的数据结构会定时或者达到固定大小会刷到磁盘。这些磁盘上的文件不会被修改。
  3. 随着磁盘上积累的文件越来越多,会定时的进行合并操作,消除冗余数据,减少文件数量。
    这里写图片描述

可以看到 LSM tree 核心思想就是通过内存写和后续磁盘的顺序写入获得更高的写入性能,避免了随机写入。但同时也牺牲了读取性能,因为同一个 key 的值可能存在于多个 HFile 中。为了获取更好的读取性能,可以通过 bloom filter 和 compaction 得到,这里限于篇幅就不详细展开。

3.4 分布式存储

时序数据库面向的是海量数据的写入存储读取,单机是无法解决问题的。所以需要采用多机存储,也就是分布式存储。

分布式存储首先要考虑的是如何将数据分布到多台机器上面,也就是分片(sharding)问题。下面我们就时序数据库分片问题展开介绍。分片问题由分片方法的选择和分片的设计组成。

3.4.1 分片方法

时序数据库的分片方法和其他分布式系统是相通的。

  • 哈希分片:这种方法实现简单,均衡性较好,但是集群不易扩展。
  • 一致性哈希:这种方案均衡性好,集群扩展容易,只是实现复杂。代表有 Amazon 的 DynamoDB 和开源的 Cassandra。
  • 范围划分:通常配合全局有序,复杂度在于合并和分裂。代表有 Hbase。

3.4.2 分片设计

分片设计简单来说就是以什么做分片,这是非常有技巧的,会直接影响写入读取的性能。

结合时序数据库的特点,根据 metric+tags 分片是比较好的一种方式,因为往往会按照一个时间范围查询,这样相同 metric 和 tags 的数据会分配到一台机器上连续存放,顺序的磁盘读取是很快的。再结合上面讲到的单机存储内容,可以做到快速查询。

进一步我们考虑时序数据时间范围很长的情况,需要根据时间范围再分成几段,分别存储到不同的机器上,这样对于大范围时序数据就可以支持并发查询,优化查询速度。

如下图,第一行和第三行都是同样的 tag(sensor=95D8-7913;city= 上海),所以分配到同样的分片,而第五行虽然也是同样的 tag,但是根据时间范围再分段,被分到了不同的分片。第二、四、六行属于同样的 tag(sensor=F3CC-20F3;city= 北京)也是一样的道理。
这里写图片描述

3.4 开源时序数据库对比

目前行业内比较流行的开源时序数据库产品有 InfluxDB、OpenTSDB、Prometheus、Graphite等,其产品特性对比如下图所示:
这里写图片描述

InfluxDB:
非常优秀的时序数据库,但只有单机版是免费开源的,集群版本是要收费的。从单机版本中可以一窥其存储方案:在单机上 InfluxDB 采取类似于 LSM tree 的存储结构 TSM;而分片的方案 InfluxDB 先通过+(事实上还要加上 retentionPolicy)确定 ShardGroup,再通过+的 hash code 确定到具体的 Shard。

这里 timestamp 默认情况下是 7 天对齐,也就是说 7 天的时序数据会在一个 Shard 中。
这里写图片描述

和prometheus对比:
InfluxDB开源版和Prometheus的底层都是基于levelDB自研的单机的存储引擎,InfluxDB的商业版支持分布式,Prometheus的roadmap上也规划了分布式存储引擎的支持计划。

参考:

http://www.infoq.com/cn/articles/storage-in-sequential-databases
https://zhuanlan.zhihu.com/p/32627177

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liukuan73/article/details/79950329

分布式时序数据库InfluxDB

InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。 它有三大特性: 1. Time Series (时间序...
  • cxzhq2002
  • cxzhq2002
  • 2016-08-05 11:22:14
  • 2209

关于时序数据库

看了一些时序数据库,没有太深入,有一些大概认识,记录下来。 1.  核心 数据存储分为行存储或者列存储,由于列存储的高压缩比,现在使用列存储的比较多一些。 当前有很多时序数据库采用了在底层...
  • ransom0512
  • ransom0512
  • 2017-09-27 16:19:25
  • 1851

Hummer TimeSeries DB (蜂鸟时序数据库)技术介绍

Hummer TimeSeries DB (蜂鸟时序数据库)技术介绍 1. 背景介绍     不知不觉中,我们已经跨入“大数据”时代,而大数据的主要来源是来自于各种“传感器”所产生的时序数据记录。这...
  • kanghua
  • kanghua
  • 2015-03-26 18:44:36
  • 13313

influxdb中文文档

  • 2018年01月02日 23:50
  • 1.62MB
  • 下载

时序数据库简介

这个小文章里尽量避免使用数据挖掘的概念, 争取用简单的语言解释出来, 如果以后有时间, 再仔细介绍几种开源时序数据库的结构和关键技术。 时序数据简单的说, 就是随着时间流而不断产生的数据, 比如一台...
  • qq_19483431
  • qq_19483431
  • 2015-04-08 08:15:12
  • 5496

查询时序数据库中的数据

查询时序数据库中的数据上一篇,我们实际上传了50,000个数据点。本文,我们了解如何查询时序数据库中海量的数据。查询数据的使用场景时序数据库主要的使用场景就是管理机器运行的实时数据和其他场景中的时序数...
  • PredixCN
  • PredixCN
  • 2017-07-17 21:00:31
  • 691

工业大数据漫谈12:实时数据库与时序数据库

在工业大数据数据库存储领域,除了传统的关系型数据库和分布式数据库以外,还有一种类型的数据库是非常常用,而且是非常有必要的,就是实时数据库和时序数据库。 实时数据库诞生于美国,主要是因为现代工业制造流...
  • guanhui1997
  • guanhui1997
  • 2017-06-02 08:14:12
  • 4625

一款时序数据库 MyData

MyData Server,主要用于存储有时间标记的仪器仪表数据和日志数据。我利用开发的业余时间,共7个月完成开发和测试。 如果您发现关系数据库在存储仪表数据时的性能不理想,那么这可能就是您在找的替...
  • wzh191920
  • wzh191920
  • 2017-12-17 16:02:37
  • 196

时序数据库场景下的Elasticsearch(一):技术特点简介

点击有惊喜 时序数据库简介 时间序列数据最简单的定义就是数据格式里包含timestamp字段的数据。比如股票市场的价格,环境中的温度,主机的CPU使用率等。几乎所有的数据都...
  • weixin_40674835
  • weixin_40674835
  • 2018-01-17 15:31:42
  • 232

时间序列数据的存储和计算 - 开源时序数据库解析(一)

摘要: 开源时序数据库   如图是17年6月在db-engines上时序数据库的排名,我会挑选开源的、分布式的时序数据库做详细的解析。前十的排名中,RRD是一个老牌的单机存储引擎,Graphite底层...
  • yunqishequ1
  • yunqishequ1
  • 2017-06-16 14:37:03
  • 1775
收藏助手
不良信息举报
您举报文章:时序数据库-入门篇
举报原因:
原因补充:

(最多只允许输入30个字)