opentsdb

简介

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 秒 ) 《opentsdb》 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/putPOST新增数据

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

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

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

如 : 12 转 25595461081

删除数据

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

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

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

修改数据

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

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

查询数据

api请求方法描述
/api/queryPOST|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/jvmjvm 信息
/api/stats/query不知道是什么
/api/stats/region_clientsHBase各个端的信息
/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点会数据丢失,不记录到统计中。
    原文作者:六层
    原文地址: https://www.jianshu.com/p/cb934c1fd35a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞