之前對國產的時序大數據存儲引擎 TDengine 感興趣,因為號稱比Hadoop快十倍,一直很好奇怎么實現的,所以最近抽空看了下白皮書和設計文檔。
如果用一句話總結,就是 TDengine 是為特定的工業物聯網領域而生,為時序數據做了針對性的優化也有一些限制,所以能比 Hadoop 快。而 Hadoop 運用於工業物聯網的時序數據的場景下,也是有點不合時宜。因為它是為了Map Reduce而生,想解決的是一次寫入、多次讀取,需要高數據吞吐的場景。
要想理解一個產品的設計,首先要理解它所面對的場景,比如TDengine面對的是工業物聯網。
工業物聯網大數據的特點
工業物聯網中,采集的數據都是傳感器等采集設備匯報的數值型數據,比如溫度、電流、電壓,經緯度等。這些數據有如下特點:
- 數據高度結構化,數據Schema是實現能確定的。不像互聯網,存儲的是圖片、語音、視頻等非結構化數據。
- 數據極少有更新或刪除操作。采集的目的是記錄,后續會進行分析。這個跟互聯網公司的系統監控數據類似,不會有更新老數據或者刪除某一條數據的場景。
- 無需傳統數據庫的事務處理。不需要保證幾個操作要么完成,要么失敗,比如需要從A轉賬給B。
- 寫多讀少,寫入數據都帶時間戳。反之寫少讀多的場景類似 Hadoop/GFS。GFS論文里提到了,一份爬蟲拉取的TB級別的網頁數據,會被很多業務線消費。
- 寫入流量平穩。根據設備數量和采集頻次,可以預測。比如有100個設備,每30s采集一次數據,那寫入最高是3000次每秒。不會像互聯網的To C 流量,會受營銷的影響。
- 用戶關注的是一段時間的趨勢,而不是某一特定時間點的值。用戶會在時序數據上進行一些聚合運算,比如求最近10分鍾內某個速度傳感器上的平均速度。
- 數據使用特點是最近的數據最常使用。比如展示最近的10條數據,或者最近的10分鍾里的最大值。
- 數據的查詢分析一定是基於時間段和空間區域;因為產生的數據都是時序數據。
- 產生的數據量很大。比如有1萬台設備,每個設備每30s上傳一次數據,那一天產生2800萬條數據。
TDengine 的設計取舍
關系型數據庫模型
上文說了采集的數據都是結構化數據,為了降低上手門檻,采用傳統的關系型數據庫模型管理數據。用戶先創建庫、表,然后才能插入或查詢數據。它底層采用結構化存儲,而不需要像 NoSQL這類Schemeless的key-value存儲。
一個數據采集點一張表
比如是智能電表采集數據,那有多少設備,就需要建多少張表。所以每個表只有一個寫入者,好處是:
- 一張表的寫入操作不會並發,不需要加鎖。
- 寫入者寫入的數據是時序且單調增加的,所以可以使用追加方式寫入內存,相當於順序寫入,效率自然高。類似 GFS 論文里提到的,這樣就不需要HDD硬盤做隨機尋址然后寫入的操作了。
- 一個表(一個采集點)的數據在硬盤上以固定大小的塊為單位連續存儲。所以按時間戳讀取的速度會非常快,讀取都是順序讀取,對計算機緩存友好。
寫入高效,原因:
- 每個采集點獨占表,所以無並發寫入,所以不需要加鎖
- 跟 Kafka 類似,先寫入內存,再定期寫入硬盤
讀取高效,原因:
- 數據分塊存儲,讀取最多兩次磁盤就能拿到指定時間段數據
- 都是順序讀取磁盤
總的來說,TDengine是通過vnode以及時間兩個維度,對大數據進行切分,便於並行高效的管理,實現水平擴展。
留一個小問題,既然 TDegnine 是為時序數據庫而生,那它是否可以用來代替 Prometheus 呢?