為什么要為時間序列來建立專門的數(shù)據(jù)庫?明明我們就有很多方法來處理時序數(shù)據(jù),例如在SQL數(shù)據(jù)庫中通過時間列的排序來解決或者是選擇Cassandra這樣的分布式數(shù)據(jù)庫。但是,這些方法雖然能夠解決時序數(shù)據(jù)的問題,但是卻需要進(jìn)行大量的工作,十分耗時。那么怎么才能更好的解決時序數(shù)據(jù)呢?
首先,我們先來看一下時序數(shù)據(jù)的種類:常規(guī)和不規(guī)則。
開發(fā)人員比較常見和熟悉的是常規(guī)時間序列,它只在規(guī)定的時間間隔內(nèi)進(jìn)行測量,如每10秒鐘一次,通常會發(fā)生在傳感器中,定期讀取數(shù)據(jù)。常規(guī)時間序列代表了一些基本的原始事件流或分發(fā)。
不規(guī)則時間序列則對應(yīng)離散事件,主要是針對API,例如股票交易。如果要以1分鐘間隔計算API的平均響應(yīng)時間,可以聚合各個請求以生成常規(guī)時間序列。
現(xiàn)代TSDB需要能夠處理常規(guī)和不規(guī)則的事件和度量,它們要有通用的元數(shù)據(jù)來描述用戶可能要查詢的東西。例如主機名,應(yīng)用程序,區(qū)域,傳感器ID,建筑物,股票名稱,投資組合名稱或者是其它任何維度的數(shù)據(jù)。時間序列添加元數(shù)據(jù)要允許客戶切片,并創(chuàng)建摘要。
時間序列應(yīng)用與規(guī)模
時序數(shù)據(jù)庫與其他數(shù)據(jù)庫用例和工作負(fù)載的區(qū)別。
時間序列數(shù)據(jù)專注于快速攝取。也就是說,時序數(shù)據(jù)庫需要經(jīng)常插入新數(shù)據(jù)。使用傳感器數(shù)據(jù)用例時,我們常常會發(fā)現(xiàn)滯后的數(shù)據(jù)收集,這時也要將數(shù)據(jù)附加進(jìn)行。
高精度數(shù)據(jù)保存時間較短,中等或更低精度的摘要數(shù)據(jù)保留時間較長。這也意味著用戶必須不斷從數(shù)據(jù)庫中刪除數(shù)據(jù)。這是一個非常不同于正常數(shù)據(jù)庫設(shè)計來處理的工作量。
代理或數(shù)據(jù)庫本身必須連續(xù)計算來自高精度數(shù)據(jù)的摘要以進(jìn)行長期存儲。這些計算既包括一些簡單的聚合,同時也有一些復(fù)雜計算。
時間序列的查詢模式可能與其他數(shù)據(jù)庫工作負(fù)載有很大的不同。在大多數(shù)情況下,查詢是在所請求的時間范圍內(nèi)提取一段數(shù)據(jù)。但對于即時計算聚合和縮減樣本的數(shù)據(jù)庫,常常會流失很多數(shù)據(jù),所以快速迭代數(shù)據(jù)來計算聚合對于時間序列用例至關(guān)重要。
使用SQL數(shù)據(jù)庫時間序列的問題
許多用戶在使用時間序列之前,是將其數(shù)據(jù)存儲在常見的SQL RDBMS(如PostgreSQL或MySQL)中。一般來說,短期內(nèi)還是可以滿足需求的,但隨著數(shù)據(jù)規(guī)模的增加,事情就開始失控了。
結(jié)論:關(guān)系型數(shù)據(jù)庫不是為了解決具體的時間序列問題而設(shè)計的,所以試圖讓他們解決問題是不現(xiàn)實的。
基于分布式數(shù)據(jù)庫
與SQL變體一樣,在類似Cassandra的分布式數(shù)據(jù)庫之上構(gòu)建時間序列解決方案需要相當(dāng)多的應(yīng)用級代碼。
首先,需要決定如何構(gòu)建數(shù)據(jù)。Cassandra中的行被存儲在一個復(fù)制組,這意味著需要考慮如何構(gòu)造行鍵,以確保集群得到正確利用。之后還需要編寫應(yīng)用程序邏輯來對時間序列用例進(jìn)行其他查詢處理。然后,編寫采樣邏輯來處理創(chuàng)建可用于長期可視化的較低精度樣本。最后,在查詢不同維度的許多時間序列和計算聚合時,需要確保查詢性能。
結(jié)論:編寫所有這些應(yīng)用程序代碼通常需要有能力的后端工程師進(jìn)行幾個月的時間。
為什么要建立一個時間序列數(shù)據(jù)平臺?
減輕開發(fā)者的工作
我們經(jīng)常會看到開發(fā)者不斷編寫代碼來解決相同的問題,如果我們將其引入到平臺或者是數(shù)據(jù)庫中,開發(fā)者的代碼量就會減少,解決問題的時間就會被優(yōu)化。
時間是特殊的
除了可用性目標(biāo)之外,我們還可以圍繞時間序列的特性進(jìn)行一些數(shù)據(jù)庫的優(yōu)化,例如,在插入時聚合和縮小樣本,在用戶想要釋放空間時自動排除高精度數(shù)據(jù)。甚至還可以構(gòu)建針對時間序列數(shù)據(jù)進(jìn)行優(yōu)化的壓縮。
超越數(shù)據(jù)庫,使開發(fā)更容易
專為時序數(shù)據(jù)構(gòu)建數(shù)據(jù)庫的一個優(yōu)點就是它可以超越數(shù)據(jù)庫。我們發(fā)現(xiàn)大多數(shù)用戶遇到了一系列需要解決的問題,如何收集數(shù)據(jù),如何存儲數(shù)據(jù),如何處理和監(jiān)視數(shù)據(jù),以及如何可視化。
使用通用API可以使社區(qū)更容易的構(gòu)建解決方案。用 line protocol來表示時間序列數(shù)據(jù),用于寫入和查詢的HTTP API,以及用于處理的Kapacitor……隨著時間的推移,我們可以對常見的用例來預(yù)先構(gòu)建組件。
主流的時間序列數(shù)據(jù)庫
前文對于時間序列數(shù)據(jù)庫解釋了那么多,最后我們就來看看主流的時間序列數(shù)據(jù)庫有哪些?根據(jù)DB-Engines排行榜,在300多個數(shù)據(jù)庫中,時間序列數(shù)據(jù)庫共有17個,但可惜的是目前市場份額還是有點低。