物聯網鄰域近期如火如荼,互聯網和傳統公司爭相布局物聯網。作為物聯網鄰域數據存儲的首選時序數據庫也越來越多進入人們的視野,而早在 2016 年 7 月,百度云在其天工物聯網平臺上發布了國內首個多租戶的分布式時序數據庫產品TSDB,成為支持其發展制造,交通,能源,智慧城市等產業領域的核心產品,同時也成為百度戰略發展產業物聯網的標識表記標幟性事件。
壓縮對于時序數據庫是至關重要的。因為時序數據庫面對的物聯網場景每天都會產生上億條數據。眾所周知,在大數據時代的今天數據的重要性是不言而喻的,數據就是公司的未來。但如果無法對這些時序數據進行很好的辦理和壓縮,那將給客戶帶來非常高的成本壓力。
如前文提到的,工業物聯網環境監控標的目的的客戶,一年產生1P的數據,如果每臺辦事器10T的硬盤,那么總共需要 100 多臺。根據每臺辦事器 3 萬來算,一年就需要 300 萬的支出,這還不包孕維護人員的成本。
壓縮是個非常大的話題,本文希望能夠先從大的宏不雅觀角度給出一個輪廓,講述壓縮的素質,壓縮的可計算性問題。再從時序數據壓縮這一個垂直領域,給出無損壓縮和有損壓縮各一個例子進行說明,希望能夠拋磚引玉。
1. 壓縮的故事
先來講個有關壓縮的故事,外星人造訪地球,看中了大英百科全書,想要把這套書帶回去。但這套書太大,飛船放不下。于是外星人按照飛船的長度,在飛船上畫了一個點。這樣外星人心滿意足的返回了本身的星球,因為這個點就存儲了整個大英百科全書。
這個并不是很嚴謹的故事,卻道出了壓縮的素質:用計算時間換取存儲空間。外星人在飛船上畫的點非常有技術含量,可以說是黑科技,代表一個位數非常長的不循環小數。而這串數字正代表了整個大英百科全書的內容。
2. 壓縮的兩個問題
再來回答兩個宏不雅觀的問題,幫手我們認識在壓縮這件事上哪些是我們能做的,哪些是不能做的。
第一個問題:是否存在一個通用的壓縮算法(Universal Compression),也就是說某個壓縮算法能夠壓縮任意的數據。答案是否定的,并不存在這樣的通用壓縮算法。
用反證法可以做個快速的證明。假設存在通用的壓縮算法,也就是說有個壓縮算法,對于長度為n的字符串,總能壓縮到長度小于n的字符串??偣灿?
個長度為n的差別字符串;但卻只有
個長度小于n的字符串。那么肯定存在兩個長度為n的字符串A,B,經過壓縮得到同一個字符串。這樣解壓縮算法沒有措施正確的解壓。所以假設錯誤,并不存在通用的壓縮算法。
第二個問題:是否能寫出一個函數,輸入字符串,可以得到這個字符串最短體現的長度。答案也是否定的,也就是說我們無法證明某個算法是最好的算法。柯爾莫哥洛夫復雜性的不成計算性解釋的就是這個問題。用的也是反證法,有興趣的伴侶可以自行百度了解(注1)。
這兩個問題的答案,告訴我們三件事情,1、壓縮算法的選擇需要具體情況具體分析,不成壓縮的字符串總是存在。2、不要妄圖獲得最好的壓縮算法,它是不成計算的。因為總有你想不到的壓縮算法存在。舉個例子,[一百萬個 0 的字符串,以“foo”作為key,經過AES加密算法的CBC模式得到的字符串]。這串字符串看起來完全是隨機的,不成壓縮的。但我卻用 43 個中文(中括號之間的內容)就體現了出來。3、壓縮是件很難很有技術含量的事情,需要不停的挖掘,才能將他做到更好。
3. 時序數據壓縮
針對差別的數據,會有差別的壓縮,大致壓縮的對象可以分為文檔、音頻、視頻等。如果直接采用文檔的壓縮算法用于時序數據,效果并不抱負。下圖是一些常用的壓縮算法的benchmark,可以看到壓縮率那一欄最高也只能夠達到 3 擺布的壓縮率(壓縮率=原始數據大小/壓縮后的數據大小)。更多壓縮算法可以查看注2。
如果要得到更好的壓縮率,我們需要采取更加適合時序數據的壓縮算法。時序數據的壓縮可以分為無損壓縮和有損壓縮。

無損壓縮
無損壓縮是說被壓縮的數據和解壓后的數據完全一樣,不存在精度的損失。對數據的壓縮說到底是對數據規律性的總結。時序數據的規律可以總結為兩點:1、timestamp不變遞增、2、數值有規律性,變革不變。下面來舉個例子。

上圖是一組時序數據,如果我們一行一行的看感覺壓縮有點困難,但如果我們一列一列的看,壓縮方案就呼之欲出了。