容量估算
根據 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 * ( ( ++*n + (++) ) * ) // 最終機關 byte
從前到後的含義是:
num: rowkey的個數,也是行數
: metric_name編碼長度
: timestamp 編碼長度
: tagK, tagV加起來編碼長度
n: tagK,tagV KV對的個數
: hbase family name 預設 "t", 認為一個byte存儲
: 列名的 編碼長度
: metric的value值編碼長度(,,,),取最大的估算
: 在精度為秒的假設下,有秒
假設:
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)。