RowKey设计
openTsdb的rowkey设计充分利用了HBase中索引信息仅在rowkey中的特点,它将指标metric,时间戳,数据值,tag标签名,tag标签值都包含在rowkey中,具体的设计如下图所示:
如上图按照metric_name timestamp tagk tagv的顺序链接起来形成rowkey, 同时考虑到metric_name, tagk, tagv在连续不同时间存储的内容都是相同的,为了降低存储空间,这里对其进行了编码:metric_name, tagName, tagValue都用3 byte(默认)进行表示。如下具体实例:
[0, 0, -69, 77, 4, -99, 32, 0, 0, 1, 0, 1, 11, 0, 0, 2, 0, -7, 42]
`-------' `------------' `-----' `------' `-----' `-------'
metric ID base timestamp name ID value ID name ID value ID
`---------------' `---------------'
first tag second tag
Note
- 这样编码后,表示metric_name, tagName, tagValue的个数上限都是 2^24个,大约 16 million.如果不够的话,还可以更改编码长度。
- tag KV对的个数不能超过8个,同时注意保持经常查询的tag放在rowkey的前列。
- 时间戳,可以精确到秒或者毫秒。在rowkey中的timestamp为整点时间:如果精度为秒,则最多有3600列;如果精度为毫秒,则最多有3600000列。
- 每行rowkey里的tag数量和类型尽量都相同。
具体的列名设计:
- 秒级别的精度,2 byte表示
- 12 bits: 相对rowkey中整点小时的delta, 最多 2^12 = 4096 > 3600, 足够使用
- 4 bits: 标识
- 1 bit: an integer or floating point,0表示整数,1表示浮点数
- 3 bits: 标识数据值的长度:其长度必须是1、2、4、8。 000表示1个byte, 010表示2byte, 011表示4byte, 100表示8byte
- 毫秒级别的精度,4 byte表示
- 4 bits:十六进制的 1或者 F
- 22 bits: 毫秒偏移
- 2 bit: 保留
- 4 bits: 标识
- 1 bit: an integer or floating point,0表示整数,1表示浮点数
- 3 bits: 标明数据的长度,其长度必须是1、2、4、8。 000表示1个byte, 010表示2byte, 011表示4byte, 100表示8byte
表设计
根据上面的设计,最终在HBase中得表逻辑视图如下: