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