opentsdb

作者: 六层 | 来源:发表于2018-11-30 18:23 被阅读0次

    简介

    opentsdb是基于Hbase的时序数据库[时间序列数据库]。不具备通用性,主要针对具有时间特性和需求的数据,如监控数据、温度变化数据等。opentsdb说是数据库,但并不能称作为数据库,他是在Hbase(HBase才是具有存储功能的)的基础上,进行数据结构的优化和处理,从而适合存储具有时间特性的数据,同时提供特定的工具进行查询等操作。

    基础概念
    1. 时间戳(时间序列),指明时间点
    2. 指标名称 :数据的作用,是这个数据的抽象概括,指明监控内容,如温度,湿气,大小
    3. 标签 : 对象,指明监控对象 ,如某个城市,某个CPU,某块区域
    4. 值 : 存储值

    以上组合表明 : 某个对象在某时间点对xxx监控的数据。如 : 福州在2018年11月29日12点30分00秒的温度是21摄氏度。

    这些也都是 opentsdb 中存储的基础数据类型,opentsdb使用tsdb表及tsdb-uid表存储这些数据,在Hase中会具体讲解opentsdb如何进行存储优化这些数据。

    总体架构

    1. servers : 不知道干嘛的。好像跟http api 没关系
    2. TSD : 还是不知道干嘛的 。应该是处理程序
    3. HBase : 存储数据库
    HBase

    Hbase 是Hadoop 的子项目,负责数据存储。是一种基于列的NoSQL数据库,在opentsdb中HBase 为其提供了高效的数据存储。

    1. tsdb-uid表 : opentsdb 将指标、时间戳、标签名及标签值使用 3个字节的uid 进行存储,而tsdb-uid表就是存储的就是做uid 和 真实值之间的映射关系,使用uid是为了优化HBase 中的Rowkey (行键)
    2. tsdb 表 : 用来保存数据,这图其实是看不懂的。只是知道 Row Key 是用来时存储指标、时间戳、标签的uid映射的,Column Family 存储了是1个小时内的数据(一小时 = 60秒 * 60分钟 = 3600 秒 ) image-20181130172939991.png

    注: 存储时间戳的方式有点特别。opentsdb将获取存储时间戳的所在小时时间戳进行存储到RowKey ,小时时间戳与存储时间戳的差值映射到Column Family 的时间值,表示是在这个小时中的第几秒,这种方式可以开始查找到数据库

    HTTP API 使用

    Opentsdb 的http aip 接口使用的是非规范的RESTful,不同的请求方法有不同的作用

    (关于 RESTful规范可查阅 : http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

    API 描述
    /api/put 写入数据
    /api/query 查询数据
    /api/suggest 查询Metric.Tagk,TagV
    /api/dump_meta 查询Tagk下的TagV
    /api/query/last 查询最近一个数据(查不出来)

    写入数据

    api 请求方法 描述
    /api/put POST 新增数据

    支持多条数据或单条数据插入,注多条数据是需要使用[] 表示数组的。

    每个参数都是必传的,因为只有所有参数都具备才能说明该数据的精确信息

    注 : 值value 从小位数 换成大位数 ,查询是会发生错误,暂无研究其中规律,猜测跟存储的基础类型有关

    如 : 12 转 25595461081

    删除数据

    api 请求方法 描述
    /api/query DELETE 删除数据

    删除数据的方法也是使用 /api/query但请求方法是DELETE,也就是说使用 POST 查询出来的数据,换成 DELETE ,就会被删除。好奇葩,要想符合RESTful ,接口取 /api/data ,用/api/query。

    而且DELETE 是需要开启配置才能使用,默认下是关的,也就是说你一般你是无法删除数据的

    修改数据

    api 请求方法 描述
    /api/put POST 修改数据

    当时间戳 指标 标签 都相同时,就会从新增变成修改,注意标签内的数据要完全相同

    查询数据

    api 请求方法 描述
    /api/query POST|GET 查询数据

    必传参数 start 开始时间戳 和 queries 子查询 , 子查询应该理解为条件查询,说明了查询要求,

    使用开始时间参数和子查询中的指标参数、聚合参数,可说明最基础的查询要求

    如 :

    {"start" : 1346846400,"queries" : [ { "aggregator" : "none", "metric" : "sys.area.temperature4" } ] }

    说明 区域温度在 2012/9/5 20:0:0后的所有数据

    子查询参数解析 (查询名词概念解析)

    downsample 降采样 :

    dpValue 值过滤 : 就是将值进行比较输出符合 depValue 表达式的值(就是查询条件)

    Aggregate 聚合

    具有一定体系的api

    树 /api/tree

    不知道这个树到底是干嘛用的

    api 描述
    /api/tree/branch
    /api/tree/collisions
    /api/tree/notmatched
    /api/tree/rule
    /api/tree/rules
    /api/tree/test
    uid /api/uid

    Uid 是指标、标签名、标签值及时间戳对应的uid,在opentsdb中起到很好的优化作用,但对于其api还不知道其具体使用方法

    api 描述
    /api/uid/assign
    /api/uid/tsmeta
    /api/uid/uidmeta
    状态 /api/stats

    状态相关接口,如jvm,线程等

    api 描述
    /api/stats/jvm jvm 信息
    /api/stats/query 不知道是什么
    /api/stats/region_clients HBase各个端的信息
    /api/stats/threads 线程信息

    非常用api

    api 描述
    /api/dropcaches 清空数据缓存(暂不清楚当中处理方式,不推进使用)
    /api/aggregators 查询聚合函数
    /api/config 查询配置信息
    /api/serializers 不知道干啥的
    /api/suggest 不知道干啥的
    /api/version 当前opentsdb 版本信息
    /api/histogram

    问题

    1. 值value 从小位数 换成大位数 ,查询是会发生错误,暂无研究其中规律,猜测跟存储的基础类型有关
    2. 时间区间的头尾时间节点数据会被忽略
    3. 使用降采样时,使用时间间隔会发生数据丢失情况。如时间间隔为一天(1d-avg)。会发生凌晨0到凌晨8点会数据丢失,不记录到统计中。

    相关文章

      网友评论

          本文标题:opentsdb

          本文链接:https://www.haomeiwen.com/subject/gztkcqtx.html