本文將介紹通過對資料進行分級儲存,從使用不同儲存介質,以及減少資料的副本數的方面,介紹如何在保證時序資料的查詢效能的前提下,降低時序資料的儲存成本。
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.記憶體快取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編碼技術,能減少資料的副本數,從而使儲存成本能降至更低的水平。
注1:注2:
注3:注4:
十分鐘看懂時序資料庫(III) 壓縮
壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條資料。眾所周知,在大資料時代的今天資料的重要性是不言而喻的,資料就是公司的未來。但如果無法對這些時序資料進行很好的管理和壓縮,那將給客戶帶來非常高的成本壓力。如前文提到的,工業物聯網環境監控方向的客戶,一年產生1p的資料...
十分鐘看懂時序資料庫(III) 壓縮
壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條資料。眾所周知,在大資料時代的今天資料的重要性是不言而喻的,資料就是公司的未來。但如果無法對這些時序資料進行很好的管理和壓縮,那將給客戶帶來非常高的成本壓力。如前文提到的,工業物聯網環境監控方向的客戶,一年產生1p的資料...
十分鐘看懂時序資料庫(II) 預處理
本文會從時序資料庫的查詢以及聚合運算角度展開,最後從如何解決時序資料的查詢問題入手深入分析。使用者對時序資料的查詢場景多種多樣,總的來說時序資料的查詢分為兩種 原始資料的查詢和時序資料聚合運算的查詢。前者是對歷史高精度時序資料的查詢,查詢結果粒度太細,並不利於發現其規律性,趨勢性 也不適合展現給使用...