時序數據庫(Time Series Database, TSDB)是一個專門為時序數據優(yōu)化設計的數據庫,用于以高效的方式存儲和分析時序數據。但是時序數據處理需要的不僅僅是存儲和分析。在典型的時序數據處理平臺中,TSDB 總是與流處理、緩存、數據訂閱和其他工具集成在一起。這使得系統設計復雜且難以維護。此外,它還需要消耗更多的計算和存儲資源。
為了降低系統設計復雜度和運行成本,TDengine 充分利用時間序列數據的特點,構建了自己的緩存、流計算和數據訂閱功能。它不僅提供了一種高效的時間序列數據存儲和分析方式,還為時間序列數據處理提供了一種極簡的解決方案(Simplified Solution for Time Series Data),是一個極簡的時序數據處理平臺。
流計算
為了更快地分析業(yè)務運行數據或在更短的時間內檢測異常,一個合格的時序數據處理系統必須在數據點到達系統后立即進行實時分析計算。流計算非常適合時間序列數據的處理。流計算可以是時間驅動的,以固定的時間間隔產生新的計算結果(稱為連續(xù)查詢),也可以是事件驅動的,每當新數據點到達時立即產生新的計算結果。
大部分 TSDB,包括 TDengine 都為連續(xù)查詢提供了解決方案。連續(xù)查詢特別適用于降采樣、提前預計算特定類型的查詢和其他一些情況。但連續(xù)查詢還是有很多限制,例如標量函數中的預處理和轉換、會話窗口以及其他需要低延遲的情況。因此整個系統仍然需要事件驅動的流計算,大家普遍將 Spark、Flink 或其他工具集成到時間序列數據處理系統中,這使得系統設計變得復雜。
在 TDengine 全新的流計算引擎中,SQL(支持用戶自定義函數)會被自動地轉化成流計算操作的 pipeline。數據在寫入時會自動觸發(fā)配置好的計算,結果按需輸出:實時、周期或水印(watermark)指定。這使得 TDengine 成為支持時間驅動和事件驅動流計算的時間序列數據庫。
TDengine 流計算在處理高吞吐量事件時的延遲在毫秒級別,這在實時警報、數據轉換、預處理等方面為用戶提供了很大幫助。使用 TDengine,還可以對多個數據流進行實時聚合計算,獲得對業(yè)務的實時洞察,用戶可以方便地進行實時分析并構建實時儀表板。此外,TDengine 可以通過指定水印(watermark) 根據需要自動從存儲引擎中檢索數據等方法來處理亂序的數據。

所有這些亮眼的功能都非常直觀且易于使用,只需一條簡單的 SQL 命令。有關更多詳細信息,請查看流計算。
緩存
在 IoT 或 IIoT 情況下,系統需要快速將最新數據返回給應用程序。例如,車隊管理系統總是想知道每輛卡車的當前 GPS 位置。對于智能工廠,系統總是需要知道每個閥門的當前狀態(tài)和每個儀表的當前讀數。
為了解決這個問題,在大多數系統設計中,當一個數據點到達系統時,它被寫入一個時間序列數據庫。同時,它也被寫入 Redis。應用程序從 Redis 中檢索最新的數據點,而不是從 TSDB 中獲取。這種設計是可行的,但增加了系統的復雜性和操作成本。
在 TDengine 的設計中,每個節(jié)點都分配了一個固定大小的內存來緩存數據點。TDengine 以 FIFO 策略而不是 LRU 策略管理其緩存,因為對于時序數據的應用而言,雖然老數據也可能需要被讀出來進行分析,但新數據比老數據更為重要。TDengine 緩存最新數據這個設計,提供了在毫秒內讀出最新數據的能力。有了這個能力,TDengine 可以通過正確配置用作簡單的緩存系統,而無需再部署一個獨立的緩存系統。TDengine 提供了一個 SQL 函數 last_row 來獲取最新的數據點,十分簡單明了。
TDengine 的內置緩存簡化了系統架構,最大限度地降低了運營成本。更多詳細信息,請查看緩存。
數據訂閱
消息隊列在許多系統架構中起著重要的作用,傳入的數據點首先被寫入消息隊列,然后被系統中的其他組件消耗。
在 TDengine 的設計中,傳入的數據點總是首先以添加模式寫入預寫日志(WAL)。在 TDengine 的早期版本中,一旦內存中的相應數據被持久化到數據庫中,該 WAL 文件通常會被刪除。WAL 文件用于在系統崩潰時恢復數據。
WAL 文件里保存的數據是按照數據到達的順序來保存的,為了支持數據訂閱,TDengine 從 3.0 開始,不會自動刪除 WAL 文件,而是將其保留指定的時間段,WAL 文件可以成為持久消息隊列并被其他應用程序使用。
在 TDengine 的設計中,訂閱的主題可以是數據庫、超級表、一組表或單個表。實際上,主題是用 SQL 語句定義的。一旦主題有了新的數據點,它就會被推送給消費者。如果數據庫有多個虛擬節(jié)點(分片),消費者組中的多個消費者可以使用同一個主題來提高數據消費的吞吐量。
與流行的 Kafka 相比,TDengine 的數據訂閱功能有一個很大的優(yōu)勢,支持數據過濾。應用程序可以訂閱僅滿足特定過濾條件的數據點。如果一個數據點不滿足過濾條件,它根本不會被傳遞給應用程序。此外,應用程序可以訂閱一個特定列或一組列,而非所有列,這樣更靈活、更高效。而且訂閱的 API 與 Kafka 類似,無學習成本。
通過使用 TDengine 內建的數據訂閱功能,時間序列數據處理不再需要 Kafka 或其他消息隊列工具,從而降低了系統復雜性和運行成本。

更多詳細信息,請查看數據訂閱開發(fā)者指南。
總結

在時序數據處理平臺的通用設計中,采集的數據往往先寫入消息隊列,然后通過消費,寫入數據庫(如 HBase、MongoDB 或 MySQL)做持久化存儲,同時往往寫入 Redis 將最新數據緩存起來,還將數據送入 Spark 或 Flink 等流式計算工具做實時分析,流式計算的結果往往也會寫入數據庫做存儲。應用需要與 Redis、Database 以及 Spark 這些工具集成。
TDengine 通過內置緩存、流處理和數據訂閱功能,為時間序列數據處理提供了一個極簡的解決方案。時間序列數據處理不再需要 Kafka、Redis、Spark、Flink 或其他類似工具。
兩者邏輯結構對比圖如下:


TDengine 的極簡方案大大降低了系統設計的復雜性和運營成本。由于邊緣計算的資源非常有限,這種設計在邊緣端將帶來了巨大的優(yōu)勢。TDengine 不只是一個時序數據庫(Time-Series Database),還是一個極簡的時序數據處理平臺。



互聯網.png)



-1.png)












伙伴.png)



