分析 OpenTSDB中 tsdb 表设计

如下图是tsdb的数据:

hbase(main):003:0> scan 'tsdb'
ROW                           COLUMN+CELL
\x00\x00\x01U\x9C\xAEP\x00\x column=t:q\x80,timestamp=1436350142588, value=\x17
00\x01\x00\x00\x01\x00\x00\x
02\x00\x00\x02
1 row(s) in 0.2800 seconds

可以看出,该表只有一条数据,我们先不管rowid,只来看看列,只有一列,值为0x17,即十进制23,即该metric的值。
左面的row key则是 OpenTSDB 的特点之一,其规则为:

metric + timestamp + tagk1 + tagv1… + tagkN + tagvN
以上属性值均为对应名称的uid。

我们上面添加的metric为:

sys.cpu.user 1436333416 23 host=web01 user=10001

一共涉及到5个uid,即名为sys.cpu.user的metric,以及host和user两个tagk及其值web01和10001。

上面数据的row key为:

\x00\x00\x01U\x9C\xAEP\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02

具体这个row key是怎么算出来的,我们来看看tsdb-uid表。
tsdb-uid:存储name 和 uid的映射关系
下面tsdb-uid表的数据,各行之间人为加了空行,为方便显示。
tsdb-uid 用来保存 名字 和 UID(metric,tagk,tagv)之间互相映射的关系,

都是成组出现的,即给定一个 name 和 uid,会保存(name, uid)和(uid, name)两条记录。

分析 OpenTSDB中 tsdb 表设计


我们一共看到了8行数据。
前面我们在tsdb表中已经看到,metric数据的row key为
 \x00\x00\x01U\x9C\xAEP\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02,我们将其分解下,

用+号连起来(从name到uid的映射为最后5行):

\x00\x00\x01 + U + \x9C\xAE + P + \x00\x00\x01 + \x00\x00\x01 + \x00\x00\x02  + \x00\x00\x02
        sys.cpu.user 1436333416 host = web01 user = 10001

可以看出,这和我们前面说到的row key的构成方式是吻合的。

反过来,从 uid 到 name 也一样,比如找 uid 为 \x00\x00\x02 的 tagk,
我们从上面结果可以看到,该rowkey(\x00\x00\x02)有4列,而column=name:tagk的value就是user,非常简单直观。


重要:我们看到,上面的metric也好,tagk或者tagv也好,uid只有3个字节,这是 OpenTSDB 的默认配置,

三个字节,应该能表示1600多万的不同数据,这对metric名或者tagk来说足够长了,对tagv来说就不一定了,

比如tagv是ip地址的话,或者电话号码,那么这个字段就不够长了,这时可以通过修改源代码来重新编译

 OpenTSDB 就可以了,同时要注意的是,重编以后,老数据就不能直接使用了,需要导出后重新导入。