十分鐘看懂時序資料庫(III)- 壓縮

2020-12-08 donews

物聯網鄰域近期如火如荼,網際網路和傳統公司爭相布局物聯網。作為物聯網鄰域數據存儲的首選時序資料庫也越來越多進入人們的視野,而早在2016年7月,百度雲在其天工物聯網平臺上發布了國內首個多租戶的分布式時序資料庫產品TSDB,成為支持其發展製造,交通,能源,智慧城市等產業領域的核心產品,同時也成為百度戰略發展產業物聯網的標誌性事件。

壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條數據。眾所周知,在大數據時代的今天數據的重要性是不言而喻的,數據就是公司的未來。但如果無法對這些時序數據進行很好的管理和壓縮,那將給客戶帶來非常高的成本壓力。

如前文提到的,工業物聯網環境監控方向的客戶,一年產生1P的數據,如果每臺伺服器10T的硬碟,那麼總共需要100多臺。按照每臺伺服器3萬來算,一年就需要300萬的支出,這還不包括維護人員的成本。

壓縮是個非常大的話題,本文希望能夠先從大的宏觀角度給出一個輪廓,講述壓縮的本質,壓縮的可計算性問題。再從時序數據壓縮這一個垂直領域,給出無損壓縮和有損壓縮各一個例子進行說明,希望能夠拋磚引玉。

1. 壓縮的故事

先來講個有關壓縮的故事,外星人拜訪地球,看中了大英百科全書,想要把這套書帶回去。但這套書太大,飛船放不下。於是外星人根據飛船的長度,在飛船上畫了一個點。這樣外星人心滿意足的返回了自己的星球,因為這個點就存儲了整個大英百科全書。

這個並不是很嚴謹的故事,卻道出了壓縮的本質:用計算時間換取存儲空間。外星人在飛船上畫的點非常有技術含量,可以說是黑科技,代表一個位數非常長的不循環小數。而這串數字正代表了整個大英百科全書的內容。

2. 壓縮的兩個問題

再來回答兩個宏觀的問題,幫助我們認識在壓縮這件事上哪些是我們能做的,哪些是不能做的。

第一個問題:是否存在一個通用的壓縮算法(Universal Compression),也就是說某個壓縮算法能夠壓縮任意的數據。答案是否定的,並不存在這樣的通用壓縮算法。

用反證法可以做個快速的證明。假設存在通用的壓縮算法,也就是說有個壓縮算法,對於長度為n的字符串,總能壓縮到長度小於n的字符串。總共有2n個長度為n的不同字符串;但卻只有2n-1 個長度小於n的字符串。那麼必定存在兩個長度為n的字符串A,B,經過壓縮得到同一個字符串。這樣解壓縮算法沒有辦法正確的解壓。所以假設錯誤,並不存在通用的壓縮算法。

第二個問題:是否能寫出一個函數,輸入字符串,可以得到這個字符串最短表示的長度。答案也是否定的,也就是說我們無法證明某個算法是最好的算法。柯爾莫哥洛夫複雜性的不可計算性解釋的就是這個問題。用的也是反證法,有興趣的朋友可以自行百度了解(注1)。

這兩個問題的答案,告訴我們三件事情,1、壓縮算法的選擇需要具體情況具體分析,不可壓縮的字符串總是存在。2、不要妄圖獲得最好的壓縮算法,它是不可計算的。因為總有你想不到的壓縮算法存在。舉個例子,[一百萬個0的字符串,以「foo」作為key,經過AES加密算法的CBC模式得到的字符串]。這串字符串看起來完全是隨機的,不可壓縮的。但我卻用43個中文(中括號之間的內容)就表示了出來。3、壓縮是件很難很有技術含量的事情,需要不斷的挖掘,才能將他做到更好。

3. 時序數據壓縮

針對不同的數據,會有不同的壓縮,大致壓縮的對象可以分為文檔、音頻、視頻等。如果直接採用文檔的壓縮算法用於時序數據,效果並不理想。下圖是一些常用的壓縮算法的benchmark,可以看到壓縮率那一欄最高也只能夠達到3左右的壓縮率(壓縮率=原始數據大小/壓縮後的數據大小)。更多壓縮算法可以查看注2。

如果要得到更好的壓縮率,我們需要採取更加適合時序數據的壓縮算法。時序數據的壓縮可以分為無損壓縮和有損壓縮。

無損壓縮

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

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

先看timestamp那一列是等差遞增數列,可以用[1467627245000,1000,4]來表示。1467627245000代表了第一個時間,1000代表後一個時間比前一個時間的大1000,4代表了這樣的規律出現了4次。如果一共有100個這樣規律的timestamp,那就意味著,我們用3個Long型就可以表示出來。timestamp壓縮率高達33。

再進一步觀察看value那一列,如果取差值,可以得到(6,-5,2,-5),全部都加5得到(11,0,7,0),這些數值都可以用4bit來表示。也就是用[23,5,4,0xb0700000]來表示(23,22,24,25,24)。其中的4代表後續一共有4個數。如果這樣的規律一直維持到100個Int的value,就可以用16個Int來代表,壓縮率高達6.3。

具體的情景會複雜很多,在此只是簡單舉個例子。InfluxDB無損壓縮算法在其頁面上有完整的闡述(注3),可以配合開源源碼進行更加深入的理解。針對於浮點數類型,Facebook在Gorilla論文中(注4)提到的非常高效的無損壓縮算法,已經有很多文章進行分析。InfluxDB對於浮點型也採用這個算法。

有損壓縮

有損壓縮的意思是說解壓後的數據和被壓縮的數據在精度上有損失,主要針對於浮點數。通常都會設置一個壓縮精度,控制精度損失。時序數據的有損壓縮的思路是擬合。也就是用一條線儘可能的匹配到這些點,可以是直線,也可以是曲線。

最有名的時序數據有損壓縮是SOIsoft公司的SDA算法,中文稱為旋轉門壓縮算法。

在上圖中,紅色的點是上一個記錄的點,空心的點是被丟掉的點,綠色的點是當前的點,黑色的點是當前要記錄的點。

可以看到圖左邊,當前點和上一個記錄點以及壓縮精度的偏差值形成的矩形可以包含中間的點,所以這些點都是可以丟掉的。

再看圖右邊,當前點和上一個記錄點形成的矩形無法包含中間的點,所以把上一個點記錄下來。如此進行下去,可以看到,大部分的數據點都會被丟掉。查詢的時候需要根據記錄的點把丟掉的點在插值找回來。

有損壓縮除了可以大幅減少存儲成本。如果結合設備端的能力,甚至可以減少數據的寫入,降低網絡帶寬。

4. 總結

雖然判斷壓縮算法最優是不可計算的,但是設計好的壓縮算法仍然是可計算的問題。可以看到,前面提到的時序數據的無損壓縮有損壓縮算法都會基於時序數據的特徵採取方案,達到更好的壓縮率。現在deep learning非常的火,讓人很好奇它是不是可以給數據壓縮帶來新的方案。


相關焦點

  • 日吞吐萬億,騰訊雲時序資料庫CTSDB解密
    MySQL等關係型資料庫:寫入吞吐低:單機寫入吞吐低,很難滿足時序數據千萬級的寫入壓力;存儲成本大:對於時序數據壓縮不佳,需佔用大量機器資源;維護成本高:單機系統,需要在上層人工的分庫分表,維護成本高;查詢性能差:適用於交易處理,海量數據的聚合分析性能差。2.
  • 如何看懂時序圖(經典)
    以下是LCD1602的時序圖:  大家要慢慢學會看時序圖,要知道操作一個器件的精華便蘊藏在其中,看懂看準了時序,你操控這個晶片就是非常容易的事了。  2、上圖框出並註明了看懂此圖的一些常識:  (1).時序圖最左邊一般是某一根引腳的標識,表示此行圖線體現該引腳的變化,上圖分別標明了RS、R/W、E、DB0~DB7四類引腳的時序變化。  (2).有線交叉狀的部分,表示電平在變化,如上所標註。
  • 看懂UML類圖和時序圖
    一起學習、成長、溫情的熱愛生活圖丨pexels這裡不會將UML的各種元素都提到,我只想講講類圖中各個類之間的關係;能看懂類圖中各個類之間的線條、箭頭代表什麼意思後,也就足夠應對日常的工作和交流;同時,我們應該能將類圖所表達的含義和最終的代碼對應起來
  • 快速學習時序圖:時序圖簡介、畫法及實例
    下面本文綜合參考了多篇時序圖的教程,根據作者的思路將時序圖做了更深入的講解。一、 什麼是時序圖?時序圖(Sequence Diagram),亦稱為序列圖、循序圖或順序圖,是一種UML交互圖。它通過描述對象之間發送消息的時間順序顯示多個對象之間的動態協作。
  • 從靜態時序分析到SDRAM時序收斂(上篇)
    下面我們進入正題,今天我們講時序本文引用地址:http://www.eepw.com.cn/article/278905.htm  一、從靜態時序分析說起  我理解的靜態時序分析,就是我們在不加激勵的情況下,通過對電路進行時序的延遲計算,預計電路的工作流程,對電路提出我們需要的一些約束條件
  • 科普:雲資料庫有哪幾種類型,應該如何選擇
    數據可以說是每個行業發展和變革的必要元素,它滲透在各個領域中,而我們一直使用傳統資料庫來協助存儲和組織這些數據。 隨著雲時代的發展,催生了各種對雲資料庫的新需求,越來越多人意識到採用傳統資料庫已經無法滿足原有的使用場景,需要選擇適合使用的新型資料庫。
  • 不看這4個數你買內存就虧了:內存時序了解下-內存, ——快科技...
    本期筆者為大家帶來的是關於內存時序那些事,平常我們在購買內存時,每一款內存的外包裝盒上都會標明,那麼這四組數字到底是什麼意思呢?內存時序16-18-18-36內存時序是描述同步動態隨機存取存儲器(SDRAM)性能的四個參數:
  • 正點原子FPGA靜態時序分析與時序約束教程
    靜態時序分析是檢查晶片時序特性的一種方法,可以用來檢查信號在晶片中的傳播是否符合時序約束的要求。相比於動態時序分析,靜態時序分析不需要測試矢量,而是直接對晶片的時序進行約束,然後通過時序分析工具給出時序分析結果,並根據設計者的修復使設計完全滿足時序約束的要求。
  • ZETA技術通過數蛙科技百億級物流標籤軌跡時序數據壓測
    濤思時序資料庫TDengine是目前針對時序資料庫的性能最優的開源資料庫平臺,廣泛運用於工業、電力、車聯網、大數據領域。數蛙科技結合縱行科技的ZETag雲標籤與濤思數據的高容量時序資料庫,為物流領域未來高增長、高並發的物流標籤場景,進行了1000萬接入、百億級時序數據的運營級全業務模擬壓力測試。
  • 同步時序邏輯電路的分析方法
    同步時序邏輯電路的分析方法內容提要7.1 概述一、時序電路的定義二、電路構成三、分類:1 同步2 異步7.2 時序邏輯電路的分析方法7.2.1 同步時序邏輯電路的分析方法一、基本分析步驟1.寫方程式2.列狀態轉換真值表3.邏輯功能的說明4 畫狀態轉換圖和時序圖二、分析舉例
  • ...電路和時序邏輯電路比較_組合邏輯電路和時序邏輯電路有什麼區別
    打開APP 組合邏輯電路和時序邏輯電路比較_組合邏輯電路和時序邏輯電路有什麼區別 發表於 2018-01-30 17:26:04
  • 組合邏輯電路和時序邏輯電路比較_組合邏輯電路和時序邏輯電路有...
    打開APP 組合邏輯電路和時序邏輯電路比較_組合邏輯電路和時序邏輯電路有什麼區別 發表於 2018-01-30 17:26:04
  • 《人工智慧之圖資料庫》報告重磅發布
    1 什麼是圖資料庫 圖資料庫(Graph Database)是一個基於圖模型的在線資料庫管理系統,具有圖數據的創建(Create)、讀取(Retrieve)、更新(Update)和刪除(Delete)功能,簡稱CRUD。
  • 倪新威十分鐘超級記憶法是真的嗎 十分鐘超級記憶法下載
    十分鐘超級記憶法到底是不是真的?不少了解一些十分鐘超級記憶法的家長和孩子對此問題都十分關注。學習講究的是方法,死記硬背絕對不能起到很好的效果。那麼,十分鐘超級記憶法到底是不是真的呢?十分鐘超級記憶法到底是不是真的?
  • 基於雙DSP的雷場偵察圖像實時壓縮及存儲方法研究
    CPLD1根據系統所需要的時序,控制產生EMIF的片選信號(CEn)、異步輸出允許信號(AOE)、異步寫允許信號(AWE)、異步讀允許信號(ARE),同時通過接收FIFO的空標誌(EF)、滿標誌(FF)及半滿標誌(HF)來產生DSP的中斷信號(INTx、INTy、INTz),從而實現4個異步FIFO的讀寫操作。
  • 小學生都能看懂 教你打造免費個人網站
    之所以是小學生都能看懂的教程,主要還是得益於京東雲擎的簡單易懂,下面我們先來認識一下京東雲擎。絕對是學過拼音、學過漢字的小學生都能看懂的吧?    什麼?小學生不明白php、Apache是什麼?    No Problem!因為你完全不需要去弄明白它們究竟是什麼!
  • 理論與實踐:隨機噪聲對時序抖動的影響
    引言   時序抖動和時序噪聲屬於人們了解甚少的工程概念,而它們又是模擬設計和數字設計中最重要的參數。尤其是在高速通信系統中,惡劣的抖動性能會導致更高的誤碼率,並限制系統速度。時序抖動一般定義為數位訊號在某一重要時刻相對於其理想時間位置的短時間偏離。
  • 2020:AWS雲上八大類型資料庫簡介
    關係型資料庫使用頻率非常高,在2020年11月的十大最流行資料庫TOP10排行中,超過一半的都是關係型資料庫,此外,還有一個文檔資料庫、一個鍵值資料庫、一個寬表資料庫、還有搜尋引擎資料庫,不過,從類型上來看,這還不夠,AWS在公有雲上提供的資料庫類型就有八種。
  • FPGA設計中的時序問題的詳細分析與解決方案
    然而,試圖正確地對設計進行約束以保證滿足時序要求的過程幾乎同樣令人費神。找到並確定時序約束本身通常也是非常令人頭痛的問題。 時序問題的惱人之處在於沒有哪種方法能夠解決所有類型的問題。由於客戶對於和現場應用工程師共享原始碼通常非常敏感,因此我們通常都是通過將工具的潛力發揮到極致來幫助客戶解決其時序問題。當然好消息就是通過這種方法以及優化RTL代碼,可以解決大多數時序問題。
  • 移動換上「支付寶同款」資料庫
    原標題:移動換上「支付寶同款」資料庫   記者從螞蟻集團了解到,山東移動計費業務系統已經正式「