時(shí)序數(shù)據(jù)庫(kù)簡(jiǎn)介- IT系統(tǒng)運(yùn)維
| 2020-05-04 13:03:20 標(biāo)簽:
時(shí)序數(shù)據(jù)的定義
在談到數(shù)據(jù)庫(kù),大多數(shù)IT運(yùn)維會(huì)想到關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)二大類。今天跟大家聊聊時(shí)序數(shù)據(jù)庫(kù)。什么是時(shí)間序列數(shù)據(jù)(Time Series Data,TSD,以下簡(jiǎn)稱時(shí)序)從定義上來(lái)說(shuō),就是一串按時(shí)間維度索引的數(shù)據(jù)。用描述性的語(yǔ)言來(lái)解釋什么是時(shí)序數(shù)據(jù),簡(jiǎn)單的說(shuō),就是這類數(shù)據(jù)描述了某個(gè)被測(cè)量的主體在一個(gè)時(shí)間范圍內(nèi)的每個(gè)時(shí)間點(diǎn)上的測(cè)量值。它普遍存在于IT基礎(chǔ)設(shè)施、運(yùn)維監(jiān)控系統(tǒng)和物聯(lián)網(wǎng)中。
對(duì)時(shí)序數(shù)據(jù)進(jìn)行建模的話,會(huì)包含三個(gè)重要部分,分別是:主體,時(shí)間點(diǎn)和測(cè)量值。套用這套模型,你會(huì)發(fā)現(xiàn)你在日常工作生活中,無(wú)時(shí)無(wú)刻不在接觸著這類數(shù)據(jù)。如果你是一個(gè)股民,某只股票的股價(jià)就是一類時(shí)序數(shù)據(jù),其記錄著每個(gè)時(shí)間點(diǎn)該股票的股價(jià)。如果你是一個(gè)運(yùn)維人員,監(jiān)控?cái)?shù)據(jù)是一類時(shí)序數(shù)據(jù),例如對(duì)于機(jī)器的CPU的監(jiān)控?cái)?shù)據(jù),就是記錄著每個(gè)時(shí)間點(diǎn)機(jī)器上CPU的實(shí)際消耗值。時(shí)序數(shù)據(jù)從時(shí)間維度上將孤立的觀測(cè)值連成一條線,從而揭示軟硬件系統(tǒng)的狀態(tài)變化。孤立的觀測(cè)值不能叫時(shí)序數(shù)據(jù),但如果把大量的觀測(cè)值用時(shí)間線串起來(lái),我們就可以研究和分析觀測(cè)值的趨勢(shì)及規(guī)律。

時(shí)序數(shù)據(jù)的數(shù)學(xué)模型
上面介紹了時(shí)序數(shù)據(jù)的基本概念,也說(shuō)明了分析時(shí)序數(shù)據(jù)的意義。那么時(shí)序數(shù)據(jù)該怎樣存儲(chǔ)呢?數(shù)據(jù)的存儲(chǔ)要考慮其數(shù)學(xué)模型和特點(diǎn),時(shí)序數(shù)據(jù)當(dāng)然也不例外。所以這里先介紹時(shí)序數(shù)據(jù)的數(shù)學(xué)模型和特點(diǎn)。
下圖為一段時(shí)序數(shù)據(jù),記錄了一段時(shí)間內(nèi)的某個(gè)集群里各機(jī)器上各端口的出入流量,每半小時(shí)記錄一個(gè)觀測(cè)值。這里以圖中的數(shù)據(jù)為例,介紹下時(shí)序數(shù)據(jù)的數(shù)學(xué)模型(不同的時(shí)序數(shù)據(jù)庫(kù)中,基本概念的稱謂有可能不同,這里以騰訊CTSDB為準(zhǔn)):
measurement: 度量的數(shù)據(jù)集,類似于關(guān)系型數(shù)據(jù)庫(kù)中的 table;
point: 一個(gè)數(shù)據(jù)點(diǎn),類似于關(guān)系型數(shù)據(jù)庫(kù)中的 row;
timestamp: 時(shí)間戳,表征采集到數(shù)據(jù)的時(shí)間點(diǎn);
tag: 維度列,代表數(shù)據(jù)的歸屬、屬性,表明是哪個(gè)設(shè)備/模塊產(chǎn)生的,一般不隨著時(shí)間變化,供查詢使用;
field: 指標(biāo)列,代表數(shù)據(jù)的測(cè)量值,隨時(shí)間平滑波動(dòng),不需要查詢。
如上圖所示,這組數(shù)據(jù)的measurement為Network,每個(gè)point由以下部分組成:
timestamp:時(shí)間戳
兩個(gè)tag:host、port,代表每個(gè)point歸屬于哪臺(tái)機(jī)器的哪個(gè)端口
兩個(gè)field:bytes_in、bytes_out,代表piont的測(cè)量值,半小時(shí)內(nèi)出入流量的平均值
同一個(gè)host、同一個(gè)port,每半小時(shí)產(chǎn)生一個(gè)point,隨著時(shí)間的增長(zhǎng),field(bytes_in、bytes_out)不斷變化。如host:host4,port:51514,timestamp從02:00 到02:30的時(shí)間段內(nèi),bytes_in 從 37.937上漲到38.089,bytes_out從2897.26上漲到3009.86,說(shuō)明這一段時(shí)間內(nèi)該端口服務(wù)壓力升高。
時(shí)序數(shù)據(jù)特點(diǎn)
數(shù)據(jù)模式: 時(shí)序數(shù)據(jù)隨時(shí)間增長(zhǎng),相同維度重復(fù)取值,指標(biāo)平滑變化:這點(diǎn)從上面的Network表的數(shù)據(jù)變化可以看出。
寫入: 持續(xù)高并發(fā)寫入,無(wú)更新操作:時(shí)序數(shù)據(jù)庫(kù)面對(duì)的往往是百萬(wàn)甚至千萬(wàn)數(shù)量級(jí)終端設(shè)備的實(shí)時(shí)數(shù)據(jù)寫入(如摩拜單車2017年全國(guó)車輛數(shù)為千萬(wàn)級(jí)),但數(shù)據(jù)大多表征設(shè)備狀態(tài),寫入后不會(huì)更新。
查詢: 按不同維度對(duì)指標(biāo)進(jìn)行統(tǒng)計(jì)分析,且存在明顯的冷熱數(shù)據(jù),一般只會(huì)頻繁查詢近期數(shù)據(jù)。
時(shí)序數(shù)據(jù)的存儲(chǔ)
傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)時(shí)序數(shù)據(jù)的問(wèn)題
有了時(shí)序數(shù)據(jù)后,該存儲(chǔ)在哪里呢?首先我們看下傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)解決方案在存儲(chǔ)時(shí)序數(shù)據(jù)時(shí)會(huì)遇到什么問(wèn)題。
很多人可能認(rèn)為在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)上加上時(shí)間戳一列就能作為時(shí)序數(shù)據(jù)庫(kù)。數(shù)據(jù)量少的時(shí)候確實(shí)也沒問(wèn)題。但時(shí)序數(shù)據(jù)往往是由百萬(wàn)級(jí)甚至千萬(wàn)級(jí)終端設(shè)備產(chǎn)生的,寫入并發(fā)量比較高,屬于海量數(shù)據(jù)場(chǎng)景。
MySQL在海量的時(shí)序數(shù)據(jù)場(chǎng)景下存在如下問(wèn)題:
存儲(chǔ)成本大:對(duì)于時(shí)序數(shù)據(jù)壓縮不佳,需占用大量機(jī)器資源;
維護(hù)成本高:?jiǎn)螜C(jī)系統(tǒng),需要在上層人工的分庫(kù)分表,維護(hù)成本高;
寫入吞吐低:?jiǎn)螜C(jī)寫入吞吐低,很難滿足時(shí)序數(shù)據(jù)千萬(wàn)級(jí)的寫入壓力;
查詢性能差:適用于交易處理,海量數(shù)據(jù)的聚合分析性能差。
另外,使用Hadoop生態(tài)(Hadoop、Spark等)存儲(chǔ)時(shí)序數(shù)據(jù)會(huì)有以下問(wèn)題:
數(shù)據(jù)延遲高:離線批處理系統(tǒng),數(shù)據(jù)從產(chǎn)生到可分析,耗時(shí)數(shù)小時(shí)、甚至天級(jí);
查詢性能差:不能很好的利用索引,依賴MapReduce任務(wù),查詢耗時(shí)一般在分鐘級(jí)。
可以看到時(shí)序數(shù)據(jù)庫(kù)需要解決以下幾個(gè)問(wèn)題:
時(shí)序數(shù)據(jù)的寫入:如何支持每秒鐘上千萬(wàn)上億數(shù)據(jù)點(diǎn)的寫入。
時(shí)序數(shù)據(jù)的讀?。喝绾沃С衷诿爰?jí)對(duì)上億數(shù)據(jù)的分組聚合運(yùn)算。
成本敏感:由海量數(shù)據(jù)存儲(chǔ)帶來(lái)的是成本問(wèn)題。如何更低成本的存儲(chǔ)這些數(shù)據(jù),將成為時(shí)序數(shù)據(jù)庫(kù)需要解決的重中之重。
時(shí)序數(shù)據(jù)庫(kù)
時(shí)序數(shù)據(jù)庫(kù)產(chǎn)品的發(fā)明都是為了解決傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)在時(shí)序數(shù)據(jù)存儲(chǔ)和分析上的不足和缺陷,這類產(chǎn)品被統(tǒng)一歸類為時(shí)序數(shù)據(jù)庫(kù)。***針對(duì)時(shí)序數(shù)據(jù)的特點(diǎn)對(duì)寫入、存儲(chǔ)、查詢等流程進(jìn)行了優(yōu)化,這些優(yōu)化與時(shí)序數(shù)據(jù)的特點(diǎn)息息相關(guān):
存儲(chǔ)成本:
利用時(shí)間遞增、維度重復(fù)、指標(biāo)平滑變化的特性,合理選擇編碼壓縮算法,提高數(shù)據(jù)壓縮比;
通過(guò)預(yù)降精度,對(duì)歷史數(shù)據(jù)做聚合,節(jié)省存儲(chǔ)空間。
高并發(fā)寫入:
批量寫入數(shù)據(jù),降低網(wǎng)絡(luò)開銷;
數(shù)據(jù)先寫入內(nèi)存,再周期性的dump為不可變的文件存儲(chǔ)。
低查詢延時(shí),高查詢并發(fā):
優(yōu)化常見的查詢模式,通過(guò)索引等技術(shù)降低查詢延時(shí);
通過(guò)緩存、routing等技術(shù)提高查詢并發(fā)。
時(shí)序數(shù)據(jù)的存儲(chǔ)原理
傳統(tǒng)數(shù)據(jù)庫(kù)存儲(chǔ)采用的都是 B tree,這是由于其在查詢和順序插入時(shí)有利于減少尋道次數(shù)的組織形式。我們知道磁盤尋道時(shí)間是非常慢的,一般在 10ms 左右。磁盤的隨機(jī)讀寫慢就慢在尋道上面。對(duì)于隨機(jī)寫入 B tree 會(huì)消耗大量的時(shí)間在磁盤尋道上,導(dǎo)致速度很慢。我們知道 SSD 具有更快的尋道時(shí)間,但并沒有從根本上解決這個(gè)問(wèn)題。
對(duì)于 90% 以上場(chǎng)景都是寫入的時(shí)序數(shù)據(jù)庫(kù),B tree 很明顯是不合適的。
業(yè)界主流都是采用 LSM tree 替換 B tree,比如 Hbase, Cassandra 等 nosql 。這里我們?cè)敿?xì)介紹一下。
LSM tree 包括內(nèi)存里的數(shù)據(jù)結(jié)構(gòu)和磁盤上的文件兩部分。分別對(duì)應(yīng) Hbase 里的 MemStore 和 HLog;對(duì)應(yīng) Cassandra 里的 MemTable 和 sstable。
LSM tree 操作流程如下:
數(shù)據(jù)寫入和更新時(shí)首先寫入位于內(nèi)存里的數(shù)據(jù)結(jié)構(gòu)。為了避免數(shù)據(jù)丟失也會(huì)先寫到 WAL 文件中。
內(nèi)存里的數(shù)據(jù)結(jié)構(gòu)會(huì)定時(shí)或者達(dá)到固定大小會(huì)刷到磁盤。這些磁盤上的文件不會(huì)被修改。
隨著磁盤上積累的文件越來(lái)越多,會(huì)定時(shí)的進(jìn)行合并操作,消除冗余數(shù)據(jù),減少文件數(shù)量。
可以看到 LSM tree 核心思想就是通過(guò)內(nèi)存寫和后續(xù)磁盤的順序?qū)懭氆@得更高的寫入性能,避免了隨機(jī)寫入。但同時(shí)也犧牲了讀取性能,因?yàn)橥粋€(gè) key 的值可能存在于多個(gè) HFile 中。為了獲取更好的讀取性能,可以通過(guò) bloom filter 和 compaction 得到,這里限于篇幅就不詳細(xì)展開。
分布式存儲(chǔ)
時(shí)序數(shù)據(jù)庫(kù)面向的是海量數(shù)據(jù)的寫入存儲(chǔ)讀取,單機(jī)是無(wú)法解決問(wèn)題的。所以需要采用多機(jī)存儲(chǔ),也就是分布式存儲(chǔ)。分布式存儲(chǔ)首先要考慮的是如何將數(shù)據(jù)分布到多臺(tái)機(jī)器上面,也就是分片(sharding)問(wèn)題。下面我們就時(shí)序數(shù)據(jù)庫(kù)分片問(wèn)題展開介紹。分片問(wèn)題由分片方法的選擇和分片的設(shè)計(jì)組成。
分片方法
時(shí)序數(shù)據(jù)庫(kù)的分片方法和其他分布式系統(tǒng)是相通的。
哈希分片:這種方法實(shí)現(xiàn)簡(jiǎn)單,均衡性較好,但是集群不易擴(kuò)展。
一致性哈希:這種方案均衡性好,集群擴(kuò)展容易,只是實(shí)現(xiàn)復(fù)雜。代表有 Amazon 的 DynamoDB 和開源的 Cassandra。
范圍劃分:通常配合全局有序,復(fù)雜度在于合并和分裂。代表有 Hbase。
以上內(nèi)容由北京艾銻無(wú)限科技發(fā)展有限公司整理