时序数据库
1. 引文
百度无人车在运行时需要监控各种状态,包括坐标,速度,方向,温度,湿度等等,并且需要把每时每刻监控的数据记录下来,用来做大数据分析。每辆车每天就会采集将近8T的数据。如果单单只是存储下来不查询也还好(虽然已经是不小的成本),但如果需要快速查询“今天下午两点在后厂村路,速度超过60km/h的无人车有哪些”这样的多纬度分组聚合查询,使用其他数据库怎么样?其实时序数据库会是一个很好的选择!需要记录的数据是按时间排序的,而且数据不会覆盖以前的数据。
2. 为什么需要时序数据库?
为什么我不能用一个“常规”(也就是非时间序列)的数据库?
大部分调查对象使用时间序列数据库而不是常规数据库。主要有以下两个原因:
- 规模
时间数据的特点是累计速度非常快(例如,一辆联网汽车每小时能收集 25GB 数据),常规数据库在设计之初,并非是为了处理这种大规模的数据,而且关系型数据库在处理大规模的数据集的效果非常差。常规数据库不适合处理当前部署的大规模传感器网络产生的时间序列的速度和体积。此外,常规对并行查询处理的支持有限,而且不存在利用分布式计算的能力 - 使用特性
时序数据库能够提供一些通用的对时间序列数据分析的功能和操作,比如数据保留策略、连续查询、灵活的时间聚合,此外时序数据库以时间为维度,也提供更快的大规模查询、更好的数据压缩等。即使当下不考虑规模(例如,您刚开始收集数据),这些功能仍可提供更好的用户体验,使你的生活更轻松。而常规数据库对收集的时间序列的分析通常需要将数据导出到另一个应用程序(如R或SPSS),与RDBMS相比,这些应用程序为时间序列分析提供了额外的功能和更简单的接口,但增加了分析的复杂性。
3. 什么是时序数据库?
定义:时序数据库是专门用于存储和处理时间序列数据的数据库,支持时序数据高效读写、高压缩存储、插值和聚合等功能。
时间序列数据集跟踪整个系统的改动并不断插入新数据,而不是更新原有数据。
有些人将“时间序列数据”视为:按时间顺序存储的一连串、随时间推移、测量相同事物的数据点,这样解释没错,但只描述了浅层信息。
其他人可能会认为是一连串与时间戳配对的数值,这些数值由一个名称和一组归类维度(或称“标签”)所定义。这也许是一种为时间序列数据建模的方式,但不是数据自身的定义。
那到底什么是时间序列数据?
以下是一个基础示例,设想这个传感器从三个环境中收集数据:分别是城市、农场和工厂。在这里,每一个数据源定期发送新的读数,创建一系列随时间推移收集到的测量结果。
再看一个例子,2016 年前几秒纽约出租车乘坐数据:
观察这些数据集,主要有以下三个共同点:
- 抵达的数据几乎总是作为新条目被记录
- 数据通常按照时间顺序抵达
- 时间是一个主坐标轴(既可以是规则的时间间隔,也可以是不规则的)
因此,时间序列数据的处理过程通常是伴随数据的抵达而进行的。虽然在事后需要纠正错误的数据,或处理延迟数据或无序数据,但这些都是例外情况,不属于标准范畴。
那这些值与在非时序数据库中添加相应字段的值有何区别?
其实,这取决于你的数据集如何跟踪变化?是更新当前已有的条目,还是插入新的条目?
当你收集某些新读数时,是要覆盖以往的读数,还是在新的一行创建全新的读数?尽管这两种方法都能为你提供系统的当前状态,但只有第二种方法才能跟踪系统的所有状态。
简而言之:时间序列数据集跟踪整个系统的改动并不断插入新数据,而不是更新原有数据。
时间序列数据之所以如此强大,是因为将系统的每个变化都记录为新的一行,从而可以去衡量变化、分析过去的变化、监测现在的变化,以及预测未来将如何变化。
因此,我们这样定义时间序列数据:统一表示系统、过程或行为随时间变化的数据。
时序数据有如下几个特点:
- 基本上是插入操作较多且无更新的需求
- 数据带有时间属性,且数据量随着时间递增
- 插入数据多,每秒钟插入需要可到达千万甚至是上亿的数据量
- 查询、聚合等操作主要针对近期插入的数据
- 时序数据能够还原数据的变化状态
- 可以通过分析过去时序数据的变化、检测现在的变化,以达到预测未来如何变化的目的
时序数据库总体处理流程:
4. 时序数据库相关概念
- 度量 Metric:Metric 类似关系型数据库里的表(Table),代表一系列同类时序数据的集合,例如为空气质量传感器建立一个 Table,存储所有传感器的监测数据。
- 标签 Tag:Tag 描述数据源的特征,通常不随时间变化,例如传感器设备,包含设备 Device Id、设备所在的 Region 等 Tag 信息,数据库内部会自动为 Tag 建立索引,支持根据 Tag 来进行多维检索查询;Tag 由 Tag Key、Tag Value 组成,两者均为 String 类型。
- 时间戳 Timestamp:Timestamp代表数据产生的时间点,可以写入时指定,也可由系统自动生成;
- 测量值 Field:Field描述数据源的测量指标,通常随着时间不断变化,例如传感器设备包含温度、湿度等Field;
- 数据点Data Point: 数据源在某个时间产生的某个测量指标值(Field Value)称为一个数据点,数据库查询、写入时按数据点数来作为统计指标;类似关系型数据库中的行。
timestamp 加上所有的 tags 可以认为是 table 的 primary key。
上述名词主要分为两类,序列和数据点。
序列:标签,主要目的是方便进行搜索和筛选。
数据点:时间戳和测量值。
5. 时序数据库的使用场景
下面列举了一些时序数据库的应用场景:
- 公共安全:上网记录、通话记录、个体追踪、区间筛选;
- 电力行业:智能电表、电网、发电设备的集中监测;
- 互联网:服务器/应用监测、用户访问日志、广告点击日志;
- 物联网:电梯、锅炉、机械、水表等各种联网设备;
- 交通行业:实时路况、路口流量监测、卡口数据;
- 金融行业:交易记录、存取记录、ATM、POS机监测;
如果满足下列条件中的任意一条,那不太可能使用时序数据库:
- 只有简单的查询模式(例如,键值查找、一维汇总),其他数据库针对此类查询的优化更彻底。
- 有稀疏数据或完全非结构化的数据,如果你的数据一般是稀疏或完全非结构化的,那么其他数据库中还有更好的选择,比如键值存储。
6. 时序数据库遇到的挑战
大多数人可能认为在传统关系型数据库上加上时间戳一列就能作为时序数据库,数据量少的时候确实是这样,但少量数据所展现的维度有限,细节少,可置信低,更加不适合做大数据分析。因此,时序数据库是为了解决海量数据场景而设计的。
可以看到时序数据库需要解决以下几个问题:
- 时序数据的写入:如何支持每秒钟上千万上亿数据点的写入。
- 时序数据的读取:又如何支持在秒级对上亿数据的分组聚合运算。
- 成本敏感(存储):由海量数据存储带来的是成本问题。如何更低成本的存储这些数据,将成为时序数据库需要解决的重中之重。
参考资料:
时序数据库综述
LSM tree核心思想就是通过内存写和后续磁盘的顺序写入获得更高的写入性能,避免了随机写入。
数据库的模型包含关系型、key-value 型、Document 型等很多种,新型的时序数据库成为监控数据存储的新宠。
一些基础知识
数据库热度排名
一些时序数据库
为什么需要时序数据库