容量估算
根据 Rowkey以及表设计,进行存储容量估算的方式,大致如下:
rowkey: metric_name + ts + tag_name + tag_value …..
确定metric_name的个数: m
确定tag_name: tag1 tag2 tag3 tag4….tagN
确定tag_value的个数: t1 t2 t3 t4 ….tn
(假设每个metric的tag数量和类型一样,实际也应该保证)
在一个小时内rowkey的个数计算公式: m * t1 * t2 * t3 ..... * tn = num
假设一个小时内,每秒都在写数据,则在一个小时内存储占用空间为:
num * ( ( 3+4+6*n + (1+2+8) ) * 3600) // 最终单位 byte
从前到后的含义是:
num: rowkey的个数,也是行数
3: metric_name编码长度
4: timestamp 编码长度
6: tagK, tagV加起来编码长度
n: tagK,tagV KV对的个数
1: hbase family name 默认 "t", 认为一个byte存储
2: 列名的 编码长度
8: metric的value值编码长度(1,2,4,8),取最大的估算
3600: 在精度为秒的假设下,有3600秒
假设:
200 个metric
3 个tagKV对, 每个tagV的取值个数分别为: 1000 20 5
每10秒采集一次数据
则一个小时内占用的最大存储空间为:
200 * 1000 * 20 * 5 * ((3+4+6*5+1+2+8) * 360) = 321 GB
这个是假设每个机器都是全量采集的估值,实际中可能没这么大。
PS:以上是我根据对OpenTSDB的了解做出的一个大概的估算方式,可能有不对的地方,如果发现有错误的地方,后续会进行纠正。
建表方式
需要根据实际的metric等信息确定,后续补上(主要是hbase Region预分区和是否在rowkey上加salt)。