【論文】Gorilla In-Memory Time Series Database

Gorilla: A Fast, Scalable, In-Memory Time Series Database算法

  • 特性
    分佈式,全內存,一致性要求不高,底層有ODS,
  • 背景需求
    10M寫入,4萬讀取,ms級別讀取(咱們的讀取40ms,這個要求過高,1ms),數據全內存26hours,16G每一個,容錯。分佈式

    1. opentsdb 基於hbase,遠程磁盤。query速度不知足
    2. whisper,graphite. 本地底盤,RRD數據(要求時間有序),
    3. influxdb,基於opentsdb,支持更richer的數據,
總之以上三個都是由於磁盤,query時間不知足。

內存結構

unordered_map+範圍vector。
ts數據讀寫spinlock。open data block追加,2Hours後固定爲closed blosks。比較簡單
image.pngspa

數據壓縮

全內存重點就是數據壓縮,能夠說是時序數據頗有價值的參考。
image.png
時間壓縮:delta-delta。
block頭存起始時間點,2小時窗口
第一個時間戳t0,存delta(差值)。後續的都是delta-delta的值,計算方法:
image.png
數據壓縮:浮點XOR,64位精度
這裏補了下浮點數的存儲。嗯,浮點數第一個表示符號,後面11位是指數(值+1023),其餘是值。要將十進制整數和小數分別計算出二進制,再表示爲科學計數法,再對應到64位表示。好比12.125,整數(再不要蠢蠢的從高位計算了=。=):12%2=0,6%2=0,3%2=1,1%2=1 =>1100。0.125*2=0.25(取整數是0) 0,0.25*2=0,0.5*2=1 => 001
所以爲1100.001 表示爲科學計算法 1.1000001*2^3
轉爲64位是
0 3+1023 1100000100000……
0 100 0000 0010 1100 0001 0000 …… =》0x402c100000000000
這個壓縮算法是先後作XOR以後,若是後面的數比在前面有意義數字長度內,直接存有意義數據(先後的0必定是相同的)。不然存前面0個數,有意義數長度5byte,有意義數,後面0就不須要存了。
好比圖中的0x0010000……。11表明是第二種狀況,0的個數是11個(01011),而後是值1長度爲1,而後是值1。
image.png
image.pngcode

相關文章
相關標籤/搜索