莫讓時間序列數(shù)據(jù)搞砸了關(guān)系數(shù)據(jù)庫
譯文譯者 | 布加迪
審校 | 重樓
對于門外漢來說,時間序列數(shù)據(jù)顯示與關(guān)系數(shù)據(jù)相似的特征,但這兩種數(shù)據(jù)有幾大區(qū)別。關(guān)系數(shù)據(jù)的主要目的是維護(hù)當(dāng)前事實真相的準(zhǔn)確表示,包括對象及對象之間的關(guān)系。而時間序列數(shù)據(jù)描述當(dāng)下所發(fā)生的事情。

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























