时刻序列数据的存储和核算ITeye - 众发娱乐

时刻序列数据的存储和核算ITeye

2019-01-10 12:56:49 | 作者: 鸿畴 | 标签: 数据,存储,时刻 | 浏览: 919

 

  如图是17年6月在db-engines上时序数据库的排名,我会挑选开源的、分布式的时序数据库做详细的解析。前十的排名中,RRD是一个老牌的单机存储引擎,Graphite底层是Whisper,能够认为是一个优化的更强壮的RRD数据库。kdb+、eXtremeDB和Axibase都未开源,不做解析。InfluxDB开源版和Prometheus的底层都是依据levelDB自研的单机的存储引擎,InfluxDB的商业版支撑分布式,Prometheus的roadmap上也规划了分布式存储引擎的支撑方案。
  归纳看下来,我会挑选OpenTSDB、KairosDB和InfluxDB做一个详细的解析。我对OpenTSDB比较了解,研讨过它的源码,所以对OpenTSDB会描绘的分外详细,而对其他时序数据库了解的没那么深化,假如有描绘错的当地,欢迎纠正。

OpenTSDB

  OpenTSDB是一个分布式、可弹性的时序数据库,支撑高达每秒百万级的写入才能,支撑毫秒级精度的数据存储,不需求降精度也能够永久保存数据。其优胜的写功用和存储才能,得益于其底层依靠的HBase,HBase选用LSM树结构存储引擎加上分布式的架构,供给了优胜的写入才能,底层依靠的彻底水平扩展的HDFS供给了优胜的存储才能。OpenTSDB对HBase深度依靠,而且依据HBase底层存储结构的特性,做了许多奇妙的优化。关于存储的优化,我在中有详细的解析。在最新的版别中,还扩展了对BigTable和Cassandra的支撑。



  如图是OpenTSDB的架构,中心组成部分便是TSD和HBase。TSD是一组无状况的节点,能够恣意的扩展,除了依靠HBase外没有其他的依靠。TSD对外露出HTTP和Telnet的接口,支撑数据的写入和查询。TSD自身的布置和运维是很简略的,得益于它无状况的规划,不过HBase的运维就没那么简略了,这也是扩展支撑BigTable和Cassandra的原因之一吧。

  OpenTSDB选用按目标建模的方法,一个数据点会包括以下组成部分:

metric:时序数据目标的称号,例如sys.cpu.user,stock.quote等。 timestamp:秒级或毫秒级的Unix时刻戳,代表该时刻点的详细时刻。 tags:一个或多个标签,也便是描绘主体的不同的维度。Tag由TagKey和TagValue组成,TagKey便是维度,TagValue便是该维度的值。 value:该目标的值,现在只支撑数值类型的值。

  OpenTSDB底层存储的优化思维,能够参阅,简略总结便是以下这几个要害的优化思路:

对数据的优化:为Metric、TagKey和TagValue分配UniqueID,树立原始值与UniqueID的索引,数据表存储Metric、TagKey和TagValue对应的UniqueID而不是原始值。 对KeyValue数的优化:假如对HBase底层存储模型非常了解的话,就知道行中的每一列在存储时对应一个KeyValue,削减行数和列数,能极大的节约存储空间以及提高查询功率。 对查询的优化:运用HBase的Server Side Filter来优化多维查询,运用Pre-aggregation和Rollup来优化GroupBy和降精度查询。 UIDTable

  接下来看一下OpenTSDB在HBase上的几个要害的表结构的规划,首先是tsdb-uid表,结构如下:



 

Metric、TagKey和TagValue都会被分配一个相同的固定长度的UniqueID,默许是三个字节。tsdb-uid表运用两个ColumnFamily,存储了Metric、TagKey和TagValue与UniqueID的映射和反向映射,总共是6个Map的数据。

从图中的比如能够解读出:

TagKey为host,对应的UniqueID为001 TagValue为static,对应的UniqueId为001 Metric为proc.loadavg.1m,对应的UniqueID为052

  为每一个Metric、TagKey和TagValue都分配UniqueID的优点,一是大大下降了存储空间和传输数据量,每个值都只需求3个字节就能够表明,这个压缩率是很客观的;二是选用固定长度的字节,能够很便利的从row key中解分出所需求的值,而且能够大大削减Java堆内的内存占用(bytes比较String能节约许多的内存占用),下降GC的压力。
  不过选用固定字节的UID编码后,关于UID的个数是有上限要求的,3个字节最多只允许有16777216个不同的值,不过在大部分场景下都是够用的。当然这个长度是能够调整的,不过不支撑动态更改。

DataTable

第二张要害的表是数据表,结构如下:


 

  该表中,同一个小时内的数据会存储在同一行,行中的每一列代表一个数据点。假如是秒级精度,那一行最多会有3600个点,假如是毫秒级精度,那一行最多会有3600000个点。
  这张表规划的精妙之处在于row key和qualifier(列名)的规划,以及对整行数据的compaction战略。row key格局为:

metric timestamp tagk1 tagv1 tagk2 tagv2 ... tagkn tagvn

  其间metric、tagk和tagv都是用uid来表明,因为uid固定字节长度的特性,所以在解析row key的时分,能够很便利的经过字节偏移来提取对应的值。Qualifier的取值为数据点的时刻戳在这个小时的时刻误差,例如假如你是秒级精度数据,第30秒的数据对应的时刻误差便是30,所以列名取值便是30。列名选用时刻误差值的优点,首要在于能大大节约存储空间,秒级精度的数据只需占用2个字节,毫秒精度的数据只需占用4个字节,而若存储完好时刻戳则要6个字节。整行数据写入后,OpenTSDB还会采纳compaction的战略,将一行内的一切列合并成一列,这样做的首要意图是削减KeyValue数目。

  HBase仅供给简略的查询操作,包括单行查询和规模查询。单行查询有必要供给完好的RowKey,规模查询有必要供给RowKey的规模,扫描获得该规模下的一切数据。一般来说,单行查询的速度是很快的,而规模查询则是取决于扫描规模的巨细,扫描个几千几万行问题不大,可是若扫描个十万上百万行,那读取的推迟就会高许多。
  OpenTSDB供给丰厚的查询功用,支撑恣意TagKey上的过滤,支撑GroupBy以及降精度。TagKey的过滤归于查询的一部分,GroupBy和降精度归于对查询后的成果的核算部分。在查询条件中,首要的参数会包括:metric称号、tag key过滤条件以及时刻规模。上面一章中指出,数据表的rowkey的格局为: metric timestamp tagk1 tagv1 tagk2 tagv2 ... tagkn tagvn ,从查询的参数上能够看到,metric称号和时刻规模确认的话,咱们至少能确认row key的一个扫描规模。可是这个扫描规模,会把包括相同metric称号和时刻规模内的一切的tag key的组合悉数查询出来,假如你的tag key的组合有许多,那你的扫描规模是不可控的,可能会很大,这样查询的功率基本是不能承受的。

咱们详细看一下OpenTSDB对查询的优化办法:

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    MySQL 1064 过错ITeye

    关键字,单引号,呈现
  • 2

    用批处理文件履行SQL脚本ITeye

    履行,文件,批处理
  • 3
  • 4
  • 5

    oracle搜集ITeye

    假如,查询,成果
  • 6

    db2move 指令无法导出表ITeye

    导出,数据,字符
  • 7
  • 8

    Memcached的定位ITeye

    定位,数据,一个
  • 9

    PGA内存办理战略ITeye

    内存,办理,时刻
  • 10

    MySQL命令行ITeye

    输入,数据库,指令