OpenTSDB目前支持Apache HBase作为其主要的存储后端。截止版本2.3,OpenTSDB也可以使用Google云上的Bigtable。选择下面的HBase链接以存储架构或Bigtable以查找用于云中的配置和设置。
HBase Schema
Data Table Schema
OpenTSDB的所有数据点都保存在一个独立的,默认命名为tsdb的海量表中。它利用了HBase排序和region分布优势。所有的值都存储在列族t中。
Row Key – Row key是由一个可选的盐值,metric UID,时间戳,以及tagk/v对的UID组成的字节数组:[salt]<metric_uid><timestamp><tagk1><tagv1>[…<tagkN><tagvN>]。默认情况下,UID是3个字节编码。
自OpenTSDB 2.2版本启用salting特性,第一个字节(或者多个字节)是一个哈希盐值ID以便在多个regions或region servers上更好地分布数据。
时间戳部分是以4个字节编码以秒为单位的Unix epoch值。每个小时一行,由每行中的时间戳反映。因此每个时间戳将会标准化(归一化)到hour的值,例如:2013-01-01 08:00:00。这是为了避免在单行中填充太多的数据点,因为这会影响region的分布。另外,由于HBase 对Row Key进行排序,同一个指标和时间段的数据,但具有不同标签的数据也将会被组合在一起以便进行高效查询。(不同标签组合在一起,是指同一个Region?)
没有盐值的示例row key,以16进制表示如下:
00000150E22700000001000001
00000150E22700000001000001000002000004
00000150E22700000001000002
00000150E22700000001000003
00000150E23510000001000001
00000150E23510000001000001000002000004
00000150E23510000001000002
00000150E23510000001000003
00000150E24320000001000001
00000150E24320000001000001000002000004
00000150E24320000001000002
00000150E24320000001000003
where
00000150E22700000001000001
'---------''-----------''---------''--------'
metric time tagk tagv
这代表了一个单一的指标,而是3个小时的4个时间序列。请注意一个时间序列由两组标签:
00000150E22700000001000001000002000004
'---------''-----------''---------''--------''---------''---------'
metric time tagk tagv tagk tagv
标签名称(tagk)在存储之前按照字幕顺序排序,所以在rowkey/TSUID中host标签将始终出现在owner之前。
数据点列
到目前为止,最常见的列数据点。这些是数据发送到TSD进行存储时记录的实际值。
Column Qualifier – qualifier有2个或4个字节组成,这些字节对行的基准时间的偏移以及确定此值是integer或者decimal(十进制)值的标识进行编码。Qualifier对行基准时间的偏移量以及存储的数据的格式和长度进行编码。
具有2个字节Qualifier的列是以秒为单位的偏移。Qualifier的前12位(bit)代表一个integer,它是row key中时间戳的增量。例如,如果row key归一化为1292148000 ,在1292148123时刻来了一个数据点,则记录的增加将为123。最后4位(bit)是格式标识。
具有4个字节Qualifier的列是以毫秒为单位的偏移。Qualifier的前4位(bit)将会置为十六进制的1或F。接下来的22位(bit)编码offset为一个unsigned integer。接下来的2位(bit)保留,最后4位(bit)是格式标识。
任一列类型的最后4位(bit)描述存储的数据。第一位是一个标识,指示该值是整数还是浮点数。值0标识一个整数,1表示一个浮点数。最后3位(bit)表示数据的长度,偏移量1。值000表示1字节值,而010表示2字节值。长度必须反映1,2,4或8中的值。其他任何内容都表示出现错误。
例如:0100表示列值是一个8字节的有符号整数。1011表示列值是一个4字节浮点值。因此在1292148123 时刻的Qualifier的数据点将具有整数值4294967296 ,将会有0000011110110100 或十六进制07B4的Qualifier。
Column Values – 由Qualifier标识指定的1到8个字节编码。
测试示例:
{"metric":"sys.cpu.system","tags":{"host":"web02","dc":"lax"},"timestamp":1525336162539,"value":4}
查询结果:
RowKey{metricUid='1', metricName='sys.cpu.system', ts=1525334400, datetime='2018-05-03 16:00:00', tags=[TagPair{tagKUid='1', tagK='host', tagVUid='3', tagV='web02'}, TagPair{tagKUid='2', tagK='dc', tagVUid='6', tagV='lax'}]}
family: t qualifier: f6b93ac0 value: 4
计算:
0xf6b93ac0 = 1111 0110 1011 1001 0011 1010 1100 0000(二进制)
前4bit:1111
22bit: 0110 1011 1001 0011 1010 11 = 1762539(十进制)
最后4bit:0000
因此: 时间戳 = 1525334400*1000 + 1762539 = 1525336162539
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/193374.html