在很多場(chǎng)景下,數(shù)據(jù)并不是孤立的存在。例如股票價(jià)格的走勢(shì),一天之內(nèi)溫度的變化等。一組相關(guān)數(shù)據(jù)以時(shí)間為坐標(biāo)串聯(lián)起來,形成一條連續(xù)的變化線,這就是時(shí)序數(shù)據(jù)。時(shí)序數(shù)據(jù)可以直觀地反映變化的規(guī)律性,也可以方便地用來識(shí)別和預(yù)測(cè)異常情形。
而時(shí)序數(shù)據(jù)庫,就是專門用來存儲(chǔ)時(shí)序數(shù)據(jù)的一類特殊數(shù)據(jù)庫。

相比于傳統(tǒng)的 RDBMS 或者 NoSQL,時(shí)序數(shù)據(jù)庫有下列鮮明的特征。
時(shí)序數(shù)據(jù)沒有復(fù)雜的結(jié)構(gòu)和關(guān)聯(lián)。時(shí)序數(shù)據(jù)關(guān)注的是被測(cè)指標(biāo)在時(shí)間維度上的變化規(guī)律,它并不需要復(fù)雜的嵌套的數(shù)據(jù)結(jié)構(gòu):時(shí)間戳連同數(shù)據(jù)值就構(gòu)成了一個(gè)數(shù)據(jù)點(diǎn)。另外,時(shí)序數(shù)據(jù)也不關(guān)心不同的被測(cè)指標(biāo)之間的關(guān)系(這種關(guān)系在定義良好的可視化圖表上一目了然),數(shù)據(jù)之間不需要任何諸如外鍵等關(guān)聯(lián)關(guān)系。
正是因?yàn)闆]有復(fù)雜的結(jié)構(gòu)和關(guān)聯(lián),時(shí)序數(shù)據(jù)庫不需要提供范式和事務(wù)支持。時(shí)序數(shù)據(jù)庫面向的是與傳統(tǒng)數(shù)據(jù)庫截然不同的業(yè)務(wù)領(lǐng)域,范式和事務(wù)在其中是不必要的。不過,時(shí)序數(shù)據(jù)庫存在其他的限制和約束。
時(shí)序數(shù)據(jù)庫的實(shí)時(shí)寫入量通常很大。時(shí)序數(shù)據(jù)需要采集的數(shù)據(jù)量與數(shù)據(jù)源的數(shù)量以及采樣的時(shí)間精度成正比。在某些業(yè)務(wù)場(chǎng)景下,一秒鐘需要采集上萬甚至更多個(gè)數(shù)據(jù)點(diǎn)。
時(shí)序數(shù)據(jù)的結(jié)構(gòu)
時(shí)序數(shù)據(jù)有著簡(jiǎn)單的結(jié)構(gòu)。
被測(cè)量的指標(biāo)一般稱作 metric。指標(biāo)的一個(gè)孤立數(shù)據(jù)點(diǎn)表示為以指標(biāo)名為索引的鍵值對(duì):
metric -> (timestamp, value)
依時(shí)間順序逐次采集若干數(shù)據(jù)點(diǎn),我們就得到了該被測(cè)量指標(biāo)的一系列值:
metric -> (t0, v0), (t1, v1), (t2, v2), ...
這就是時(shí)序數(shù)據(jù)的基本結(jié)構(gòu),一般來說采樣的時(shí)間間隔是恒定的(記作 $\Delta t$,允許存在誤差)。作為示例,下面是一組溫度的時(shí)序數(shù)據(jù)。
temperature -> (1502433662000, 29.3), (1502433672002, 29.7), (1502433681999, 29.6), ...
僅僅依靠指標(biāo)名稱來索引數(shù)據(jù)略嫌簡(jiǎn)陋,有時(shí)候希望能對(duì)數(shù)據(jù)作出進(jìn)一步的區(qū)分。為了達(dá)到這一目的,我們給指標(biāo)添加一個(gè)或者多個(gè)標(biāo)簽(labels)。例如,為了區(qū)分不同城市的溫度,我們引入一個(gè)叫做 city 的標(biāo)簽。
temperature{city=beijing} -> ...
temperature{city=nanjing} -> ...
temperature{city=tianjin} -> ...
指標(biāo)的名稱可以看作是一個(gè)叫作 name 的特殊標(biāo)簽,這樣,數(shù)據(jù)的索引就一般化為了一組標(biāo)簽的集合。
{name=temperature, city=beijing} -> ...
{name=temperature, city=nanjing} -> ...
{name=temperature, city=tianjin} -> ...
時(shí)序數(shù)據(jù)庫的讀寫特點(diǎn)
寫入操作的特點(diǎn):
- 由于數(shù)據(jù)量龐大,存儲(chǔ)時(shí)需要引入某種壓縮方案。Facebook 在其闡述 Gorilla 數(shù)據(jù)庫的論文中介紹了一種非常適合時(shí)序數(shù)據(jù)庫的壓縮方案。
- 同樣由于數(shù)據(jù)量龐大,存儲(chǔ)時(shí)應(yīng)當(dāng)使用適當(dāng)?shù)牧舸娌呗裕≧etention Policy),定期刪除數(shù)據(jù)。一般采用三級(jí)存儲(chǔ)方案:最上層的內(nèi)存用做緩存,存儲(chǔ)熱點(diǎn)數(shù)據(jù);下一層的 SSD 用來存儲(chǔ)留存期(一般為數(shù)周或數(shù)月)之內(nèi)的數(shù)據(jù);此外還有一個(gè)數(shù)據(jù)中心用來保留全部數(shù)據(jù)。
- 寫入操作遠(yuǎn)多于讀取操作,可能占到 99% 以上。絕大部分?jǐn)?shù)據(jù)不會(huì)被用到。
- 數(shù)據(jù)總是追加式地寫入(順序?qū)懭耄?/li>
- 數(shù)據(jù)寫入之后,就不會(huì)再被更新(無隨機(jī)更新)。
- 超出留存期的數(shù)據(jù)被整塊刪除(無隨機(jī)刪除)。
讀取操作的特點(diǎn):
- 時(shí)序數(shù)據(jù)存在顯著的時(shí)間敏感性,越是近期的數(shù)據(jù)越重要。大部分讀取操作所請(qǐng)求的數(shù)據(jù)集中在最近一天或幾天。
- 對(duì)時(shí)序數(shù)據(jù)的分析過程中需要進(jìn)行大量運(yùn)算(求和、計(jì)算變化率等),時(shí)序數(shù)據(jù)庫需要高效地支持這些運(yùn)算。
參考
你可以從以下兩篇文章中找到更多關(guān)于時(shí)序數(shù)據(jù)庫的討論:
另外,市面上已經(jīng)有了很多時(shí)序數(shù)據(jù)庫,下面兩個(gè)列表提供了相關(guān)方面的內(nèi)容:
- DB-Engines Ranking of Time Series DBMS
- [The complete list of all time series databases for your IoT project](The complete list of all time series databases for your IoT project)