十分鐘看懂時序資料庫-分級存儲
物聯網領域近期如火如荼,互聯網和傳統公司爭相布局物聯網。作為物聯網領域數據存儲的首選,時序資料庫也越來越多進入人們的視野,而早在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上。
SSD的價格大約是HDD的幾倍,但是SSD的性能要遠遠高於HDD。在前文中我們介紹過,時序資料庫會對時序數據進行分片,一個分片的數據會連續的存放在一台機器的硬碟上,因此讀取一個分片的數據是順序讀取的。對於順序讀取來說,SSD和HDD的性能是差不多的,因此這種存儲方式對於SSD和HDD來說都是合適的。但是,一台機器上會存儲大量的分片,當同時讀取多個分片時,硬碟的訪問就變成了隨機讀取。對於隨機讀取來說,HDD由於需要平均10毫秒的尋道時間,因此只能做到百這個量級的IOPS,而SSD能做到萬級甚至十萬級的IOPS,比HDD高2到3個數量級(注3)。由此可見,HDD只能應付批處理這種並發量較低、順序讀取大量數據的場景,而只有SSD能支持高並發、低延時的互動式查詢場景。
5.EC編碼為了保證時序數據在機器宕機、硬碟故障的時候還能正常的訪問、不會丟失,也就是為了保證數據的可用性和持久性,會為數據保存多個備份(也稱為副本),根據可用性和持久性的需求一般是保存2到3個副本,這樣當其中的1個或者2個機器宕機、硬碟故障的時候也能保證數據的正常訪問以及不會丟失。但是這也大大增加了存儲的成本,3個副本就是3倍的存儲成本。通過EC編碼,可以將存儲成本降到1.5倍,同時不會降低數據的可用性和持久性。
EC編碼全稱是Erasure Coding糾刪碼,是一種數據保護技術,最早應用於通信行業的數據傳輸的數據恢復中,同時也用於RAID-5和RAID-6存儲陣列技術中。EC編碼主要是利用演算法對原始數據塊進行編碼得到校驗塊,並將原始數據塊和校驗塊都存儲起來。當原始數據塊丟失時,通過其他原始數據塊以及校驗塊能重新計算出丟失的數據塊;當校驗塊丟失時,重新計算即可得到校驗塊。這樣就能對丟失的數據進行恢復,從而達到容錯的目的。對於k個原始數據塊和m個校驗塊,演算法能保證在丟失任意m個塊後,都可以通過演算法恢復出原來的k個原始數據塊。如圖3所示,一個生成矩陣GT乘以k個原始數據塊組成的向量,可以得到由k個原始數據塊和m個校驗塊組成的向量。
圖3 EC編碼過程(注4)
將EC編碼應用於時序數據,關鍵問題在於如何定義什麼是數據塊。一種直觀的方法是一個分片作為一個數據塊(注意,一個分片是存儲在一個機器上的,不同的數據塊是存儲在不同機器上的,因此不應該把一個分片再劃分為多個數據塊)。但是由於分片的數據量不一致,需要將數據塊都對齊到最大的數據塊,而且得到的校驗塊也是跟最大的數據塊一樣大,這會導致存儲空間和計算資源的浪費。舉個極端的例子,譬如1個分片的大小是1M,其他k-1個分片的大小都是1K,那麼就需要將這k-1個分片都對齊(可以通過補0)到1M再計算EC編碼,得到的m個校驗塊都是1M的。更好的方法是利用底層存儲的數據塊作為EC編碼的數據塊,譬如使用Hbase存儲時序數據的話,就可以利用底層HDFS提供的EC編碼功能(注4)。
6.總結根據時序數據天然的時序上的冷熱劃分,可以對時序數據進行分級存儲,將最近的最熱的數據保存在內存中,將中期的次熱數據存儲在SSD上,將遠期的冷數據存儲在HDD上,能在保證查詢性能的前提下,降低存儲成本。另外,通過EC編碼技術,能減少數據的副本數,從而使存儲成本能降至更低的水平。


※技術分析:雲化的主存儲功能是否已就緒?
※Veeam和微軟擴展存儲聯盟提供前所未有的可用性
※歷史文化名城與現代科技將再次碰撞出火花
※使用對象存儲應對勒索病毒
※數據存儲篇之MongoDB 使用場景
TAG:中國存儲 |
※了解資料庫分片
※資料庫新兵:分散式實時分析內存資料庫eSight
※天下三分分久必合 未來資料庫或將只有一個
※資料庫的垂直切分與水平切分
※傳統髮髻資料分享01
※傳統髮髻資料分享06
※傳統髮髻資料分享07
※傳統髮髻資料分享08
※資料庫使用經驗分享
※學會這15點,讓你分分鐘拿下Redis資料庫
※從架構特點到功能缺陷,重新認識分析型分散式資料庫
※分享:淺談資料庫引擎
※資料庫、分散式賬本與區塊鏈
※基於代理的資料庫分庫分表框架 Mycat實踐
※5分鐘學會如何玩轉雲資料庫組件
※阿里推出 PolarFS 分散式文件系統:將存儲與計算分開,提升雲資料庫性能
※架構設計原則:資料庫拆分六大原則
※資料庫技術分享:淺談資料庫連接
※數據量太大?用資料庫水平切分搞定!
※臉書換資料庫 存儲空間節省90% 延遲少了50倍