Gorilla: A Fast, Scalable, In-Memory Time Series Database算法
背景需求
10M寫入,4萬讀取,ms級別讀取(咱們的讀取40ms,這個要求過高,1ms),數據全內存26hours,16G每一個,容錯。分佈式
總之以上三個都是由於磁盤,query時間不知足。
unordered_map+範圍vector。
ts數據讀寫spinlock。open data block追加,2Hours後固定爲closed blosks。比較簡單
spa
全內存重點就是數據壓縮,能夠說是時序數據頗有價值的參考。
時間壓縮:delta-delta。
block頭存起始時間點,2小時窗口
第一個時間戳t0,存delta(差值)。後續的都是delta-delta的值,計算方法:
數據壓縮:浮點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。
code