在 OpenTSDB 中,一条数据包括 Metric(指标) A UNIX timestamp(时间戳) Value(值) Tags (标签键值对形式 k=v 这种)。
OpenTSDB 在插入数据的时候,会为每个 Metrics,标签名称(k)和(v)分配唯一标识符,这个唯一标识符就是OpenTSDB的UID,UID 是一个正整数,对于 UID 对象的名称及其类型是唯一的。
为了方便大家理解,会对应OpenTSDB存储数据的Hbase数据进行讲解,在我们部署OpenTSDB的时候创建Hbase表的脚本中会创建一个名为 tsdb-uid 的表
创建表的语句为(可以看到有2个Hbase列族id和name)
UID_TABLE=${UID_TABLE-'tsdb-uid'}
create '$UID_TABLE',
{NAME => 'id', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'},
{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'}
以RestApi的方式插入数据,对应上面的数据我们可以看到标红的部分,插入一条共插入了6条红色的数据
{"metric": "me1","timestamp": 1654567205,"value": 1.3, "tags": { "tag1": "tag1value" }}
metric为me1 标签key为tag1 标签值为tag1value
Hbase表tsdb-uid的数据
hbase(main):003:0> scan 'tsdb-uid'
ROW COLUMN+CELL
\x00 column=id:metrics, timestamp=1654679536773, value=\x00\x00\x00\x00\x00\x00\x
\x00 column=id:tagk, timestamp=1654679537275, value=\x00\x00\x00\x00\x00\x00\x00\
\x00 column=id:tagv, timestamp=1654679537284, value=\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x01 column=name:metrics, timestamp=1654668335590, value=sys.cpu.nice
\x00\x00\x01 column=name:tagk, timestamp=1654668335604, value=host
\x00\x00\x02 column=name:tagk, timestamp=1654668335619, value=dc
\x00\x00\x02 column=name:tagv, timestamp=1654668335628, value=lga
\x00\x00\x03 column=name:metrics, timestamp=1654679536876, value=me1
\x00\x00\x04 column=name:tagv, timestamp=1654671073001, value=name1
\x00\x00\x05 column=name:tagk, timestamp=1654679537279, value=tag1
\x00\x00\x05 column=name:tagv, timestamp=1654671544526, value=name2
\x00\x00\x09 column=name:tagv, timestamp=1654679537291, value=tag1value
dc column=id:tagk, timestamp=1654668335622, value=\x00\x00\x02
host column=id:tagk, timestamp=1654668335606, value=\x00\x00\x01
lga column=id:tagv, timestamp=1654668335629, value=\x00\x00\x02
me1 column=id:metrics, timestamp=1654679536880, value=\x00\x00\x03
name1 column=id:tagv, timestamp=1654671073003, value=\x00\x00\x04
name2 column=id:tagv, timestamp=1654671544528, value=\x00\x00\x05
sys.cpu.nice column=id:metrics, timestamp=1654668335595, value=\x00\x00\x01
tag1 column=id:tagk, timestamp=1654679537281, value=\x00\x00\x05
tag1value column=id:tagv, timestamp=1654679537293, value=\x00\x00\x09
UID是OpenTSDB 分配的,Hbase表 tsdb-uid 存储了正向和反向 UID映射,列族id 存储 字符串到UID的映射,列族name存储UID到字符串的映射。由上图可知,metric(值为me1)分配的UID为\x00\x00\x03,列名为metrics,标签的key(值为tag1)分配的UID为\x00\x00\x05, 列名为tagk,标签的value(值为tag1value)分配的UID为\x00\x00\x09,列名为tagv,正向反向数据各一份。
由于Hbase通过rowkey进行匹配,用这种方式可以快速双向查询到UID和数据的映射关系。
上图紫色的部分rowkey是单字节键\x00,
这是针对正确的列类型(Metrics,tagk 或 tagv)递增的 UID 行。列值是 8 个字节的带符号整数,反映了为每种类型分配的最大 UID,这样才可以保证UID递增。