1、opentsdb介绍
opentsdb是基于Hbase的分布式、可伸缩的时间序列数据库。
主要用途:
-
就是做监控系统
-
提供最高毫秒级精度的时间序列数据存储,能够长久保存原始数据并且不失精度
-
提供很强的写入能力,支持大并发的数据写入。
opentsdb 的简介就不过多的介绍。
2、OpenTSDB存储相关的概念
在opentsdb中存储的结构是以下面的结构写入的:
{
"metric": "单位的名字",
"timestamp": db.TIME,
"value":db.value ,
"tags": {
"index":"db.name"
"QUALITY": "db.quality",
}
}
保存到OpenTSDB的,就是无数个DataPoint。
3、OpenTSDB的设计
opentsdb的数据存储实际上存储到Hbase,存储到tsdb表、tsdb-uid表。
先看一下tsdb:

其中RowKey的设置
RowKey其实和上面的
metric|timestamp|host=web42|pool=static
为了节省存储空间,rowkey中的数据都做了映射,映射信息存储到tsdb-uid。
在opentsdb中:
metric -->3个字节
tagk -->3个字节
tagv -->3个字节
按照上面的案例
put proc.loadavg.1m 1234567890 0.42 host=web42 pool=static
上图的映射关系为:
proc.loadavg.1m-->052、host-->001、web42-->028、pool-->047、static-->001
2)column的设计
为了方便后期更进一步的节省空间。OpenTSDB将一个小时的数据,保存在一行里面。
所以上面的timestamp1234567890,转成小时(除以3600),得出1234566000,然后得到的余数为1890,表示的是它是在这个小时里面的第1890秒;
然后将1890作为column name,而0.42即为column value
表tsdb-uid

这里其实保存的就是一些metric,tagk,tagv的一些映射关系。
我们这里分析一下在opentsdb中的存储格式
首先我们利用命令将数据存入opnetsdb
curl -i -X POST -d '{"metric":"sys.cpu.nice", "timestamp":1234567890, "value":8, "tags": {"host":"10.0.101.145"}}' http://localhost:4242/api/put?details
我们提前分析一下,这里主要分析一下时间戳,1234567890 是一个秒级别的时间戳,我们将其转成小时,1234566000,余1890秒。
如果存储正确的话,我们在rowkey中中的时间戳应该为1234566000,而在该行键的column name为1890,value就是8.
我们查看一下存储到Hbase 中的形式。

我们可以看到行间rowkey,这里说明一下rowkey的结构:

可以看到前三位\x00\x00\x01 代表的是metric ,我们再从tsdb-uid中的映射对应的是metric-sys.cpu.nice
部分时间戳后面再说,后面的字节\x00\x00\x01和\x00\x00\x01代表的tags 的tagk和tagv。
这里着重说一下部分时间戳,
我们可以看到时间戳为 I\0x95\FBp,注意这里是ASCII值,我们通过码表,找到I的16进制为49,p为70,所以部分时间戳的16进制为4995FB70,换成十进制就是1234566000。,这是和我们之前分析的是一致的。
我们再看column=t:v ,注意这里v后面有一个空格,同样我们查找ASCII码表,得到16进制7620,二进位为111011000100000,其实列名里面除了相对的秒数,其实还有当前列值得类型、值长度的信息
在 介绍如何解析列名之前,我们先来了解一些前提知识。在 OpenTSDB 里面,如果 Rowkey 里面的时间戳只到秒级别的,那么列名称占用2个字节。
其中后面三位代表当前列值占用的字节数。
如果后三位为100,代表当前列值占了8字节;
如果后三位为011,代表当前列值占了4字节;
如果后三位为010,代表当前列值占了2字节;
如果后三位为000,代表当前列值占了1字节;
其他情况就是异常的。
倒数第四为代表当前列值的类型,
如果为0,则代表整型数据;
如果为1,则代表四字节浮点型数据。
前面12位才表示相对于 Rowkey 的秒数。
如果 Rowkey 里面的时间戳只到毫秒级别的,那么列名称占用4个字节。其中
最前四位固定为全1;
最后面四位的含义和前面一样;
倒数第5-6位为预留位;
其他的位才是真正的相对于 Rowkey 里面毫秒数。
我们这里的二进制后三位000,所以当前列占用了一个字节,后四位包含了前列值得类型、值长度的信息,所以真正的秒数是除去后四位的(11101100010)转成二进制位1890,这里和我们之前分析的也是正确的。
本文介绍了OpenTSDB这一基于HBase的时间序列数据库,重点讲解其在监控系统中的应用、存储结构及设计原理。OpenTSDB能提供毫秒级精度的数据存储,并支持高并发写入。

451

被折叠的 条评论
为什么被折叠?



