简介
opentsdb是基于Hbase的时序数据库[时间序列数据库]。不具备通用性,主要针对具有时间特性和需求的数据,如监控数据、温度变化数据等。opentsdb说是数据库,但并不能称作为数据库,他是在Hbase(HBase才是具有存储功能的)的基础上,进行数据结构的优化和处理,从而适合存储具有时间特性的数据,同时提供特定的工具进行查询等操作。
基础概念
- 时间戳(时间序列),指明时间点
- 指标名称 :数据的作用,是这个数据的抽象概括,指明监控内容,如温度,湿气,大小
- 标签 : 对象,指明监控对象 ,如某个城市,某个CPU,某块区域
- 值 : 存储值
以上组合表明 : 某个对象在某时间点对xxx监控的数据。如 : 福州在2018年11月29日12点30分00秒的温度是21摄氏度。
这些也都是 opentsdb 中存储的基础数据类型,opentsdb使用tsdb表及tsdb-uid表存储这些数据,在Hase中会具体讲解opentsdb如何进行存储优化这些数据。
总体架构
- servers : 不知道干嘛的。好像跟http api 没关系
- TSD : 还是不知道干嘛的 。应该是处理程序
- HBase : 存储数据库
HBase
Hbase 是Hadoop 的子项目,负责数据存储。是一种基于列的NoSQL数据库,在opentsdb中HBase 为其提供了高效的数据存储。
- tsdb-uid表 : opentsdb 将指标、时间戳、标签名及标签值使用 3个字节的uid 进行存储,而tsdb-uid表就是存储的就是做uid 和 真实值之间的映射关系,使用uid是为了优化HBase 中的Rowkey (行键)
-
tsdb 表 : 用来保存数据,这图其实是看不懂的。只是知道 Row Key 是用来时存储指标、时间戳、标签的uid映射的,Column Family 存储了是1个小时内的数据(一小时 = 60秒 * 60分钟 = 3600 秒 )
注: 存储时间戳的方式有点特别。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 |
问题
- 值value 从小位数 换成大位数 ,查询是会发生错误,暂无研究其中规律,猜测跟存储的基础类型有关
- 时间区间的头尾时间节点数据会被忽略
- 使用降采样时,使用时间间隔会发生数据丢失情况。如时间间隔为一天(1d-avg)。会发生凌晨0到凌晨8点会数据丢失,不记录到统计中。