opentsdb在Hbase的存储结构

本文介绍了OpenTSDB这一基于HBase的时间序列数据库,重点讲解其在监控系统中的应用、存储结构及设计原理。OpenTSDB能提供毫秒级精度的数据存储,并支持高并发写入。

1、opentsdb介绍

opentsdb是基于Hbase的分布式、可伸缩的时间序列数据库。

主要用途:

  1. 就是做监控系统

  2. 提供最高毫秒级精度的时间序列数据存储,能够长久保存原始数据并且不失精度

  3. 提供很强的写入能力,支持大并发的数据写入。

    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:

img

其中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

img

这里其实保存的就是一些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,这里和我们之前分析的也是正确的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值