莫讓時(shí)間序列數(shù)據(jù)搞砸了關(guān)系數(shù)據(jù)庫(kù)
譯文譯者 | 布加迪
審校 | 重樓
對(duì)于門外漢來(lái)說(shuō),時(shí)間序列數(shù)據(jù)顯示與關(guān)系數(shù)據(jù)相似的特征,但這兩種數(shù)據(jù)有幾大區(qū)別。關(guān)系數(shù)據(jù)的主要目的是維護(hù)當(dāng)前事實(shí)真相的準(zhǔn)確表示,包括對(duì)象及對(duì)象之間的關(guān)系。而時(shí)間序列數(shù)據(jù)描述當(dāng)下所發(fā)生的事情。
比如說(shuō),以DevOps工程師需要的實(shí)時(shí)洞察和即時(shí)信號(hào)/異常檢測(cè)為例。您可以使用持續(xù)的觀察流來(lái)檢測(cè)模式、查找相關(guān)信息、識(shí)別和消除干擾信息以及發(fā)掘預(yù)示安全威脅的意外模式。時(shí)間序列數(shù)據(jù)使獲取這些洞察成為可能。當(dāng)然,時(shí)間序列數(shù)據(jù)可以塞入到行/表格式,但更適合以時(shí)間戳為主鍵的列數(shù)據(jù)庫(kù)。
關(guān)系數(shù)據(jù)vs時(shí)間序列數(shù)據(jù)
顧名思義,關(guān)系數(shù)據(jù)是闡明關(guān)系的數(shù)據(jù)。關(guān)系數(shù)據(jù)的目的是維護(hù)對(duì)象及對(duì)象相互關(guān)系的準(zhǔn)確記錄。關(guān)系數(shù)據(jù)是事務(wù)性數(shù)據(jù),經(jīng)常更新以保持準(zhǔn)確性。
而時(shí)間序列數(shù)據(jù)的目的是為分析和總結(jié)提供洞察力。一個(gè)序列是一連串觀測(cè)結(jié)果,所以從本質(zhì)上講,數(shù)據(jù)點(diǎn)與數(shù)據(jù)源有關(guān),但數(shù)據(jù)點(diǎn)不可變,因?yàn)檫^(guò)去不會(huì)變。雖然單個(gè)數(shù)據(jù)點(diǎn)可能沒(méi)有用處,但整個(gè)序列揭示了數(shù)據(jù)源如何隨時(shí)間而變化。
關(guān)系數(shù)據(jù)庫(kù)為關(guān)系數(shù)據(jù)而構(gòu)建
關(guān)系數(shù)據(jù)庫(kù)為關(guān)系數(shù)據(jù)而構(gòu)建,這似乎顯而易見(jiàn)。時(shí)間序列數(shù)據(jù)的特征和工作負(fù)載全然不同,因此關(guān)系數(shù)據(jù)庫(kù)不適合它們。
關(guān)系數(shù)據(jù)庫(kù)無(wú)法處理大規(guī)模時(shí)間序列的攝取速度。由于這是與規(guī)模有關(guān)的問(wèn)題,它只會(huì)在大規(guī)模情形下才出現(xiàn)。因此,許多人開(kāi)始使用關(guān)系數(shù)據(jù)庫(kù)處理時(shí)間序列,一旦達(dá)到擴(kuò)展方面的拐點(diǎn),就不得不做更多的工作。
對(duì)于存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的每個(gè)原始數(shù)據(jù)源,估計(jì)需要10倍以上的存儲(chǔ)空間來(lái)存儲(chǔ)其相關(guān)的時(shí)間序列數(shù)據(jù)。關(guān)系數(shù)據(jù)庫(kù)不是為這種類型的增長(zhǎng)情況而構(gòu)建的,這種類型的數(shù)據(jù)所需的關(guān)系數(shù)據(jù)庫(kù)的特性也不適用于這種類型的增長(zhǎng)情況。
一個(gè)例子是,與數(shù)據(jù)庫(kù)備份相比,時(shí)間序列更傾向于讀寫之間較低的延遲。當(dāng)關(guān)系數(shù)據(jù)庫(kù)工作負(fù)載達(dá)到可擴(kuò)展性臨界點(diǎn)時(shí),作為一種安全預(yù)防措施,數(shù)據(jù)庫(kù)做備份時(shí)寫入速度減慢。較高的延遲妨礙了自動(dòng)化系統(tǒng)對(duì)任何異常情況立即采取行動(dòng)的能力。
關(guān)系數(shù)據(jù)庫(kù)面臨的另一個(gè)挑戰(zhàn)是,由于明確的模式需求,它們?nèi)狈`活性。每當(dāng)您需要更新模式時(shí),數(shù)據(jù)庫(kù)都必須進(jìn)行人力密集型遷移。這是一項(xiàng)有風(fēng)險(xiǎn)的工作,因?yàn)闊o(wú)論開(kāi)發(fā)人員在這個(gè)過(guò)程中多么小心,都有可能丟失或損壞數(shù)據(jù)。
時(shí)間序列數(shù)據(jù)庫(kù)為時(shí)間序列數(shù)據(jù)而構(gòu)建
InfluxDB是一種專門構(gòu)建的時(shí)間序列數(shù)據(jù)庫(kù),通過(guò)云、本地和開(kāi)源來(lái)交付。它旨在滿足時(shí)間序列數(shù)據(jù)的需求。在可擴(kuò)展性方面,在InfluxData的內(nèi)部基準(zhǔn)測(cè)試中,與其他數(shù)據(jù)庫(kù)相比,InfluxDB每秒攝取的數(shù)據(jù)多幾個(gè)數(shù)量級(jí),耗用少得多的CPU和內(nèi)存,哪怕相比那些聲稱針對(duì)時(shí)間序列進(jìn)行調(diào)優(yōu)的數(shù)據(jù)庫(kù)。
InfluxDB是“寫時(shí)模式”(schema on write),這意味著開(kāi)發(fā)人員只需將新的維度和字段添加到寫入操作,即可添加它們。不需要對(duì)任何生產(chǎn)或開(kāi)發(fā)數(shù)據(jù)庫(kù)進(jìn)行更改。這為數(shù)據(jù)形狀不斷變化的工作負(fù)載提供了靈活性。
面向時(shí)間序列的Apache Arrow
時(shí)間序列旨在理解當(dāng)前的事實(shí)真相,提供即時(shí)洞察力和行動(dòng)。關(guān)系數(shù)據(jù)庫(kù)可以執(zhí)行基本的數(shù)據(jù)操作,但無(wú)法對(duì)多個(gè)觀測(cè)結(jié)果執(zhí)行高級(jí)計(jì)算和分析。
由于時(shí)間序列數(shù)據(jù)工作負(fù)載非常大,因此它們需要能夠輕松處理龐大數(shù)據(jù)集的數(shù)據(jù)庫(kù)。Apache Arrow專門為移動(dòng)大量列數(shù)據(jù)而設(shè)計(jì)。在Arrow上構(gòu)建數(shù)據(jù)庫(kù)為開(kāi)發(fā)人員提供了更多的選擇,通過(guò)先進(jìn)的數(shù)據(jù)分析以及實(shí)施機(jī)器學(xué)習(xí)和人工智能工具(比如Pandas),有效地處理其數(shù)據(jù)。
一些人可能忍不住將Arrow用作當(dāng)前解決方案的外部工具。然而,這種方法行不通,因?yàn)槿绻麛?shù)據(jù)庫(kù)沒(méi)有從源頭返回Arrow格式的數(shù)據(jù),生產(chǎn)級(jí)應(yīng)用程序?qū)㈦y以確保有足夠的內(nèi)存來(lái)處理龐大數(shù)據(jù)集。代碼源也將缺乏Arrow提供的壓縮功能。在網(wǎng)絡(luò)上傳輸未有效壓縮的字節(jié)會(huì)增加數(shù)據(jù)庫(kù)和代碼之間的延遲,從而對(duì)整體性能產(chǎn)生負(fù)面影響。
降低學(xué)習(xí)難度
在Apache生態(tài)系統(tǒng)上構(gòu)建InfluxDB提供了向時(shí)間序列數(shù)據(jù)庫(kù)添加SQL支持功能的機(jī)會(huì)。InfluxDB使用DataFusion作為查詢引擎,而DataFusion使用SQL作為查詢語(yǔ)言,這意味著凡是懂SQL的人現(xiàn)在都可以查詢時(shí)間序列,不需要使用另外的語(yǔ)言。
為了進(jìn)一步增強(qiáng)易訪問(wèn)性,DataFusion中已經(jīng)有三個(gè)專門針對(duì)時(shí)間序列的函數(shù)。這些都是開(kāi)源的,因此Apache Arrow社區(qū)的任何人都可以從中受益或?yàn)樗鼈冐暙I(xiàn)代碼。
1 date_bin() – Creates rows that are time windows of data with an aggregate.
2 selector_first(), selector_last() – Provide the first or last row of a table that meet specific criteria.
3 time_bucket_gapfill() – Returns windowed data, and if there are windows that lack data it will fill those gaps.
結(jié)論
與關(guān)系數(shù)據(jù)相比,時(shí)間序列數(shù)據(jù)有不同的特征、存儲(chǔ)需求和工作負(fù)載。由于數(shù)據(jù)類型看起來(lái)相似,所以在流程的早期意識(shí)到這些差異很重要。生產(chǎn)環(huán)境中的這些問(wèn)題發(fā)現(xiàn)得越晚,解決起來(lái)就越困難。
時(shí)間序列數(shù)據(jù)與像InfluxDB這樣的時(shí)間序列數(shù)據(jù)庫(kù)最兼容,以支持高攝取率下的低延遲、寫時(shí)模式數(shù)據(jù)收集的靈活性以及高級(jí)數(shù)據(jù)分析。InfluxDB中的原生SQL支持使得SQL用戶更容易訪問(wèn)時(shí)間序列數(shù)據(jù)工作負(fù)載。
您只需將時(shí)間序列數(shù)據(jù)庫(kù)添加到技術(shù)堆棧中,即可避免或應(yīng)對(duì)上述任何陷阱。
原文標(biāo)題:Don’t Let Time Series Data Break Your Relational Database,作者:Jessica Wachtel