1. 前言
可能很多人都没有听过时序数据库(time series database), 其实,已经存在很多不同的数据数据库, 通过DB-ENGINES 网站排名, 可以看到很多时序数据库。 而究竟什么是时序数据库, 时序数据带来的好处是什么? 让我们一探究竟。
2. 内容概要
在这里, 我将从以下几点讲述本次的主题。
- 物联网数据之mysql
- 时序数据库简介
- 时序数据库的应用场景及示例
在企业中, mysql 应该是最受欢迎的数据存储介质之一,作为千万级数据存储的关系数据库能够适合绝大多数应用场景, 简单的sql, 关联查询,事务支持,丰富的类型等 使得其成为数据持久的利器。
而不得不说, 在物联网的行业中, 数据的存储也是尤为关键,下面就来谈谈物联网的数据存储。
3. 物联网数据之mysql
物联网的数据主要是通过传感器采集的数据, 经过解析, 清洗, 以结构化的格式进行存储, 但是数据中有一个特点, 那就是每条数据都会带一个时间戳, 代表数据被采集的时间。
3.1 数据查询
假设数据的格式是这样的:
a b value1 time1
a b value2 time2
a c value3 time3
对于我们要筛选某段时间很容易写出下列sql:
select * from table where time between A and B [and other filter condition ]
如果我们要查询离某个时间点后最近的一条,可能会写出如下sql:
select * from table where time > A [ and other filter condition ] limit 0,1
可是这么写可能是有问题, 这样默认是根据id进行排序, 而不是时间进行排序, 所以正确的应该是:
比如当间隔为1年时取每天的平均值作为一个样点, 我们发现可能会这样写
select * from table where time > A [ and other filter condition ] order by time asc limit 0,1
在不考虑性能的情况下, 用mysql似乎能满足我们大部分的需求。
3.2 数据可视化
考虑下面一种情况: 假设我们筛选某段时间的间隔很长, 可能几个月, 可能一年,并且, 我们想要将这些点以时间为主轴进行展示, 那么我们可能看到的将会是下面的效果:
可以看到, 点是相当密集的, 可视化程度比较差,有时甚至无法从展示的图中获取任何可用的价值, 同时如果是网页显示, 渲染数十万的点可能导致游览器很卡, 很影响交互体验。
这时候我们会想, 如何用sql 来降精度, 比如当间隔为1年时取每天的平均值作为一个样点, 我们发现可能会这样写
select avg(value), time from table where time between A and B [ and other filter condition ] group by date_format(time, '%m-%d-%Y') order by time asc
按照每天的可能好写, 可是按照每小时的该怎么写呢, 以及其他的呢, 我们会发现sql可能已经满足不了我们的要求了。
3.3 性能
除此之外, 我们之前一直未考虑一个问题: ==性能==
物联网,时时刻刻在产生数据, 如果是传感器, 可能频率短的几秒中, 长的也可能只有数分钟, 这只是1个传感器, 在大量的传感器短时间的会上传大量数据, 久而久之, 这个数据库会有上百万甚至上千万的的数据, 并且历史的数据有其存在的价值。如未来大数据的离线分析。
如果此时我们再通过这些sql,甚至使用order by, 在长时间的查询下, 一条sql可能会相应数秒中甚至数分钟才能相应出来。
因为对于mysql, 数据之间并没有时间上的概念, 一条记录就是一个点。 对于其要从时间上筛选出点来, 使得查询效率上不尽如意。
添加索引:
我们发现,时间是一个必加的索引。 而根据哪些条件筛选, 每个字段都有可能成为筛选条件, 这时候, 我们会对除主键意外的字段都加索引, 也就是一个除主键以外的其他字段的联合索引。但索引的建立, 就会影响插入的性能。
总的来说, 对于这些在时间序列的点, 使用mysql 总是有些要求满足不了,那么有什么更好的存储介质呢?
时序数据库
时序数据库仿佛就是为物联网诞生的一件利器, 目前使用的越来越广泛, 可以从这个网站看到各种时序数据库及排名
4. 时序数据库
4.1 什么是时序数据库&应用场景
顾名思义, 就是存储与时间相关的数据,该数据是在时间上分布的一系列值。
例如股票价格, 随时间的温度变化等等。 而在物联网中, 数据网网是以时间维度度量的。 除了时间和值这个维度, 携带的还可能有其他部分, 比如温度测量可能会携带是哪里的温度等等,因为不同的地方的温度或者由不同温度计采集上来的点没有直接的关联。
4.2 时间序列处理
在对时间序列的数据有些操作是比较特别的, 在传统数据库可能是不存在的, 或者很难去实现
4.2.1 降精度
时序数据在可视化上一般是一些点连成的线, 当时间越长, 能够取出的点越多,当我们取1年的时间甚至更长, 需要把精度降到一天或者一周,我们只选这一天或一周中的最大值或者最小值或者平均值作为这一天或一周的气温。 用算法或者把时序数据转换成精度比较低的时间序列以便于观察和理解它,这是在传统数据库里没有的一种方式。
插值
比如说中间丢失了一个点,比较简单的方法是中间插一个值,常用的方法是线性插值,就是在时间轴上画一个直线中间的点就插出来了。
其他操作
聚合
将多个点通过一定的算法得到一个值, 比如count, distinct, mean等函数。
4.3 时序数据库的好处
任何事物的诞生必定有其要解决的问题, 而时序数据库的产生也一定是为了解决一些问题。
4.3.1 存储空间
往往在时序数据库的设计上, 对于数据的存储进行了优化, 如何优化在这里不考虑
4.3.2 入库和查询
由于大量的传感器采集的大量设备在源源不断的到来,传统数据库对于大量的随机数据实时写入的性能是欠佳的(入库速度不够), 而在插入的同时进行读写的效率将大打折扣。
当然不同的时序数据库所针对的问题也可能不一样。下面来看一下实实在在的例子。
4.4 运用时序数据库的例子
在一些应用场景中,其实已经运用了时序数据库
-
aliyun 监控
以下是阿里云服务器监控的CPU截图展示
我们可以看到, 在短时间的范围内, 数据点以每整分显示, 在长时间的范围内(大于1天), 数据点以每10分钟及每1小时进行显示。
而阿里云上也推出了相应的时序数据库产品: HiTSDB
相信大家对时序数据库有了一定的认识, 在后续我会就我应用的Opentsdb时序数据库进行分享。