物聯網領域近期如火如荼,互聯網和傳統公司爭相布局物聯網。作為物聯網領域數據存儲的首選,時序數據庫也越來越多進入人們的視野,而早在 2016 年 7 月,百度云在其天工物聯網平臺上發布了國內首個多租戶的分布式時序數據庫產品TSDB,成為支持其發展制造,交通,能源,智慧城市等產業領域的核心產品,同時也成為百度戰略發展產業物聯網的標識表記標幟性事件。
前文提到低成本的存儲是時序數據庫需要解決的一個主要問題,而上一篇文章介紹了通過針對時序數據的壓縮方法,從利用數據自己特征的方面,降低時序數據的存儲成本。
本文將介紹通過對數據進行分級存儲,從使用差別存儲介質,以及減少數據的副本數的方面,介紹如安在保證時序數據的查詢性能的前提下,降低時序數據的存儲成本。
1.分級存儲
分級存儲,就是按某一特征,將數據劃分為差別的級別,每個級另外數據存儲在差別成本的存儲介質上。為什么需要對數據進行分級存儲?為什么不把所有的數據都存儲在最自制的存儲介質上?這是因為在降低存儲成本的同時,還需要保證數據拜候的性能(我們知道,存儲介質的讀寫性能與成本一般成正比),分級存儲是對兩者比較好的平衡方法。分級存儲的這一思想也表現在計算機的體系結構里(寄存器、L1/L2
Cache、內存、硬盤)。
2.時序數據的分級存儲
時序數據應該按什么特征進行分級呢?時序數據的時間戳是一種非常合適的分級依據,越近期的數據查詢得越多,是熱數據;越久以前的數據查詢得越少,是冷數據。例如,用戶會經常查詢一個設備的最新溫度,或者查看這個設備比來 1 小時或者比來 1 天的溫度曲線;很難想象用戶會經常查詢一個設備 1 年前的溫度,這些 1 年前的數據一般會用于大數據分析或者機器學習中,而這些批處理的場景一般對查詢的延時不會像交互式場景那么敏感。
如圖 1 所示,一般可以將時序數據分為 3 級,第一級是比來 1 天的數據生存在內存緩存Cache中,第二級是比來 1 年的數據存儲在固態硬盤SSD中,第三級是 1 年以上的數據存儲在機械硬盤HDD中。Cache中的數據可以使用寫回(write
back)或者寫通(write
through)的策略寫入SSD,而SSD中的數據可以通過后臺程序按期批量的遷移到HDD。為了保證數據持久性,一般會為數據生存 2 個或者 3 個副本,通過EC編碼可以將副本數降低到1. 5 甚至更低,但卻不影響數據的持久性。不過EC編碼會消耗更多的CPU和網絡帶寬,進而影響查詢性能,因此一般只應用在存儲冷數據的HDD上。

圖1 時序數據的分級存儲
3.內存緩存
時序數據庫大部分請求的數據都集中在比來 1 天,將這些數據生存在內存中,可以保證這些數據能被快速的讀取。雖然內存的拜候速度快,但是成本很高(價格大約比SSD高一個數量級),而且容量有限。因此需要對數據進行壓縮,以減少每個數據的內存占用,壓縮相關的內容已經在上一篇文章中進行了介紹,在這里不再贅述。另一方面,由于內存中的數據是易失的、非持久化的,一旦重啟進程或者重啟機器后就會丟失,如果不恢復數據,所有請求將落到下一級的存儲上,對下一級存儲造成巨大的壓力。因此一般會在寫入內存的同時寫入當地硬盤,在重啟后重新加載到內存中。
Beringei(注1)是Facebook開源的一款內存時序數據庫,是Facebook頒發的Gorilla論文(注2)的開源實現。Beringei使用一種三級的內存數據結構,如圖 2 所示,其中第一級為分片索引,第二級為時間序列索引,第三級為時序數據,通過該數據結構可以支持快速的數據讀寫;Beringei實現了一種高效的流式的壓縮算法,從而使內存占用最小化;Beringei支持寫入內存的同時寫入硬盤,并在重啟后恢復數據。然而Beringei也有一些限制,譬如只支持浮點型數值、時間精度只到秒、只能定時間戳挨次的寫入數據。

圖2 Beringei的內存數據結構(注2)
4.SSD與HDD
用戶有時會關注時序數據在過去 1 周、過去 1 個月、過去 1 年的趨勢,把比來 1 年的數據存儲在固態硬盤SSD上,可以實現在秒級甚至亞秒級讀取過去 1 年的數據。而 1 年以上的時序數據則很少用于交互式查詢,這些數據往往會用于大數據分析或者機器學習,這些批處理場景對查詢的延時不會像交互式場景那么敏感,因此可以把這些 1 年以上的數據存儲在機械硬盤HDD上。