https://www.jianshu.com/p/31afb8492eff
2017年时序数据库突然火了起来。开年2月Facebook开源了beringei时序数据库;到了4月基于PostgreSQL打造的时序数据库TimeScaleDB也开源了,而早在2016年7月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品TSDB,成为支持其发展制造,交通,能源,智慧城市等产业领域的核心产品,同时也成为百度战略发展产业物联网的标志性事件。
例如:html
随着分布式系统监控、物联网的发展,TSDB开始受到更多的关注。
维基百科上对于时间序列的定义是‘一系列数据点按照时间顺序排列’mysql
时间序列数据就是历史烙印,具备不变性,、惟一性、时间排序性git
时间序列数据跟关系型数据库有太多不一样,可是不少公司并不想放弃关系型数据库。 因而就产生了一些特殊的用法,好比用 MySQL 的 VividCortex, 用 Postgres 的 Timescale。 不少人以为特殊的问题须要特殊的解决方法,因而不少时间序列数据库从头写起,不依赖任何现有的数据库, 好比 Graphite,InfluxDB。github
mysql 的引擎,除了常见的 innodb 和 myisam ,还有一个引擎叫 archive ,它的做用和 rrd 差很少,支持插入和查询操做。web
时序数据是基于时间的一系列的数据。在有时间的坐标中将这些数据点连成线,往过去看能够作成多纬度报表,揭示其趋势性、规律性、异常性;往将来看能够作大数据分析,机器学习,实现预测和预警。sql
时序数据库就是存放时序数据的数据库,而且须要支持时序数据的快速写入、持久化、多纬度的聚合查询等基本功能。shell
RRDTool 是最先的时间序列数据库,它自带画图功能,如今大部分时间序列数据库都使用Grafana来画图。数据库
Graphite 是用 Python 写的 RRD 数据库,它的存储引擎 Whisper 也是 Python 写的, 它画图和聚合能力都强了不少,可是很难水平扩展。
OpenTSDB 使用 HBase 解决了水平扩展的问题
KairosDB 最初是基于OpenTSDB修改的,可是做者认为兼容HBase致使他们不能使用不少 Cassandra 独有的特性, 因而就抛弃了HBase仅支持Cassandra。
新发布的 OpenTSDB 中也加入了对 Cassandra 的支持。 故事还没完,Spotify 的人原本想使用 KairosDB,可是以为项目发展方向不对以及性能太差,就本身撸了一个 Heroic。数组
InfluxDB 早期是彻底开源的,后来为了维持公司运营,闭源了集群版本。 在 Percona Live 上他们作了一个开源数据库商业模型正面临危机的演讲,里面调侃红帽的段子很不错。 而且今年的 Percona Live 还有专门的时间序列数据库单元。服务器
时间序列数据能够分红两部分
以下图,度量为Wind,每个数据点都具备一个timestamp,两个field:direction和speed,两个tag:sensor、city。它的第一行和第三行,存放的都是sensor号码为95D8-7913的设备,属性城市是上海。随着时间的变化,风向和风速都发生了改变,风向从23.4变成23.2;而风速从3.4变成了3.3。
全部有时序数据产生,而且须要展示其历史趋势、周期规律、异常性的,进一步对将来作出预测分析的,都是时序数据库适合的场景。
例:
在工业物联网环境监控方向,百度天工的客户就遇到了这么一个难题,因为工业上面的要求,须要将工况数据存储起来。客户每一个厂区具备20000个监测点,500毫秒一个采集周期,一共20个厂区。这样算起来一年将产生惊人的26万亿个数据点。假设每一个点50Byte,数据总量将达1P(若是每台服务器10T的硬盘,那么总共须要100多台服务器)。这些数据不仅是要实时生成,写入存储;还要支持快速查询,作可视化的展现,帮助管理者分析决策;而且也可以用来作大数据分析,发现深层次的问题,帮助企业节能减排,增长效益。最终客户采用了百度天工的时序数据库方案,帮助他解决了难题。
(这个高逼格)
不少人可能认为在传统关系型数据库上加上时间戳一列就能做为时序数据库。数据量少的时候确实也没问题,但少许数据是展示的纬度有限,细节少,可置信低,更加不能用来作大数据分析。很明显时序数据库是为了解决海量数据场景而设计的。
能够看到时序数据库须要解决如下几个问题
时序数据的写入:如何支持每秒钟上千万上亿数据点的写入。
时序数据的读取:又如何支持在秒级对上亿数据的分组聚合运算。
成本敏感:由海量数据存储带来的是成本问题。如何更低成本的存储这些数据,将成为时序数据库须要解决的重中之重。
这些问题不是用一篇文章就能含盖的,同时每一个问题均可以从多个角度去优化解决。在这里只从数据存储这个角度来尝试回答如何解决大数据量的写入和读取。
RRD (Round Robin Database)数据库是一个环形的数据库,数据库由一个固定大小的数据文件来存放数据,此数据库不会像传统数据库同样为随着数据的增多而文件的大小也在增长,RRD在建立好后其文件大小就固定,能够把它想像成一个圆,圆的众多直径把圆划分红一个个扇形,每一个扇形就是能够存数据的槽位,每一个槽位上被打上了一个时间戳,在圆心上有一个指针,随着时间的流逝,取回数据后,指针会负责把数据填充在相应的槽位上,当指针转了360度后,最开始的数据就会被覆盖,就这样RRD循环填充着数据。
以一个图来讲明PDP、CDP、RRA之间的关系:
PDP是以规定的时间间隔(默认为300秒)搜集的源数据,第一个RRA以4个PDP(即4*300秒)为一组作CF后组成的数据,第二个RRA则是以10个PDP为一组作CF后组成的数据。
InfluxDB 在存储引擎上纠结了好久, leveldb, rocksdb, boltdb 都玩了个遍,最后决定本身造个轮子叫 Time Structured Merge Tree。
Time Structured Merge Tree (TSM) 和 Log Structured Merge Tree (LSM) 的名字都有点误导性,关键并非树,也不是日志或者时间,而是 Merge。
若是只是存储起来,直接写成日志就行。但由于后续还要快速的查询,因此须要考虑存储的结构。
传统数据库存储采用的都是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操做流程以下:
数据写入和更新时首先写入位于内存里的数据结构。为了不数据丢失也会先写到WAL文件中。
内存里的数据结构会定时或者达到固定大小会刷到磁盘。这些磁盘上的文件不会被修改。
随着磁盘上积累的文件愈来愈多,会定时的进行合并操做,消除冗余数据,减小文件数量。
分布式存储首先要考虑的是如何将数据分布到多台机器上面,也就是 分片(sharding)问题
时序数据库的分片方法和其余分布式系统是相通的。
哈希分片:这种方法实现简单,均衡性较好,可是集群不易扩展。
一致性哈希:这种方案均衡性好,集群扩展容易,只是实现复杂。表明有Amazon的DynamoDB和开源的Cassandra。
范围划分:一般配合全局有序,复杂度在于合并和分裂。表明有Hbase。
结合时序数据库的特色,根据metric+tags分片是比较好的一种方式,由于每每会按照一个时间范围查询,这样相同metric和tags的数据会分配到一台机器上连续存放,顺序的磁盘读取是很快的。
考虑时序数据时间范围很长的状况,须要根据时间范围再分红几段,分别存储到不一样的机器上,这样对于大范围时序数据就能够支持并发查询,优化查询速度。
以下图,第一行和第三行都是一样的tag(sensor=95D8-7913;city=上海),因此分配到一样的分片,而第五行虽然也是一样的tag,可是根据时间范围再分段,被分到了不一样的分片。
在单机上InfluxDB采起相似于LSM tree的存储结构TSM;而分片的方案InfluxDB先经过<database>+<timestamp>(事实上还要加上retentionPolicy)肯定ShardGroup,再经过<metric>+<tags>的hash code肯定到具体的Shard。
时间序列数据库主要是用来分析的,因此提升响应速度对于诊断生产环境的问题是十分重要的。
Facebook 写了叫 Gorilla 的纯内存时间序列数据库发表在 VLDB 上,如今已经开源,更名为 Beringei(都是猩猩…)
由于查询中常常须要对一个很长的时间区间取一些粗粒度的值,好比6月到8月天天的平均CPU使用率。 这些聚合值(均值,最大,最小) 均可以在存储数据的时候计算出来。BtrDB 和 Akumuli都在内部节点中存储聚合值,这样在不少查询中底层的节点不须要被访问就能够获得结果。
Ref:
https://zhuanlan.zhihu.com/p/29367404
https://github.com/xephonhq/awesome-time-series-database
https://blog.csdn.net/qq_33326449/article/details/79568014
https://zhuanlan.zhihu.com/p/32709932