OpenTSDB元数据模型
OpenTSDB的元数据记录了指标名(Metrics)、标签名、标签值等信息的UID等信息。把多样的信息转换为统一长度的UID,可以简化数据模型的设计,也可以有效节约存储空间。
1 UID设计
UID(Unique Identifier):当写入新的指标名(或标签名、标签值)的时候,OpenTSDB会为为其分配一个唯一的标识码,把这个标识码称为UID。这些标识码信息保存在OpenTSDB的元数据表中,表名默认为tsdb-uid(在CloudTable服务中OpenTSDB的元数据表名为OPENTSDB.UID)。
OpenTSDB分配UID遵循如下规则:
Ø 指标名、标签名和标签值分别进行分配,即三者的UID的分配互不相关;
Ø 每个唯一的指标名(或标签名、标签值)的UID值都是唯一。不存在不同的指标名(或标签名、标签值)使用相同的UID,也不存在同一个指标名(或标签名、标签值)使用多个不同的UID;
Ø UID值的范围是0x000000到0xFFFFFF,即指标名(或标签名、标签值)最多只能存在16777216个不同的值。
1.1 HBase 表设计
为了从UID索引到指标名(或标签名、标签值),同时也要从指标名(或标签名、标签值)索引到UID,OpenTSDB同时保存这两种关系的数据。
在元数据表中,把这两种数据分别保存到两个不同的Cloumn Family中。这两个Cloumn Family分别为id与name。
在CloudTable服务中,元数据表的描述信息如下:
{NAME => 'id', BLOOMFILTER => 'ROW', COMPRESSION => 'SNAPPY'}
{NAME =>'name',BLOOMFILTER => 'ROW', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '
0'}
1.2 数据模型
一个指标名为cpu.hum,一个标签名为host,两个标签值为189.120.205.26和189.120.205.27的UID信息如下:
id | name | |||||
RowKey | metrics | tagk | tagv | metrics | tagk | tagv |
0 | UID_COUNTER | UID_COUNTER | UID_COUNTER | |||
1 | cpu.hum | host | 189.120.205.26 | |||
2 | 189.120.205.27 | |||||
189.120.205.26 | 1 | |||||
189.120.205.27 | 2 | |||||
cpu.hum | 1 | |||||
host | 1 |
说明:
Ø RowKey为【0】的行中,分别保存了指标名、标签名和标签值的当前UID的最大值。当为新的指标名、标签名和标签值分配了新的UID后,会更新对应的最大值。
Ø RowKey为【1】的行中,RowKey为UID,Qualifier为id:metrics的值指标名,Qualifier为id:tagk的值为标签名,Qualifier为id:tagv的值为标签值;
Ø RowKey为【2】的行中,RowKey为UID RowKey为UID,Qualifier为id:tagv的值为标签值,暂不存在UID为【2】的指标名和标签名;
Ø RowKey为【189.120.205.26】的行中,Qualifer为name:tagv的值为UID。表示当【189.120.205.26】为标签值时,其UID为1;
Ø RowKey为【189.120.205.27】的行中,Qualifer为name:tagv的值为UID。表示当【189.120.205.26】为标签值时,其UID为2;
Ø RowKey为【cpu.hum】的行中,Qualifer为name:metrics的值为UID。表示当cpu.hum为指标名时,其UID为1;
Ø RowKey为【host】的行中,Qualifer为name:tagk的值为UID。表示当host为标签值时,其UID为1;
由于HBase的存储数据类型是Byte,所以UID在存储时会转为3个字节长度的Byte数组进行存储。HBase中的数据视图下:
1.3 TSUID
对每一个DataPoint,指标名、时间戳、标签名和标签值都是必要的元素。除时间戳外,指标名、标签名和标签值的UID就可组成一个TSUID。所以TSUID可以看做是一组特定的UID的组合。格式如下:
<metric_UID><timestamp><tagk1_UID><tagv1_UID>[...<tagkN_UID><tagvN_UID>]
注意,一个TSUID中可能存在多个标签名和标签值的UID。
在上面的例子中,就可以组成两个TSUID,分别是:
- 点赞
- 收藏
- 关注作者
评论(0)