如何有效率地紀錄與保存離散資料集
最近不務正業的專案是有關一套儀錶盤設計與實作。
隨著感測器越來越多,我們開始會想從這一堆數據中理出一些頭緒,那怕是畫張趨勢變化圖,甚至透過一些分析模型從中找尋一些蛛絲馬跡。這時作為工程師要面臨到一個最大的問題是: 如何有效率地保存並且使用這些資料。
資料庫是常見的資料記錄手法
傳統對於資料記錄不外乎就是資料庫,甚至是更簡單的檔案但又稍微講究一點,你可以透過 JSON、XML等方式進一步封裝你的資料。到底哪一個好,這是工程師要面臨的第一個選擇。
然而無庸置疑的是多數工程師會選擇資料庫。因為你可以透過資料表、欄位等設計來將資料分門別類,在應用時可以保有一定的彈性。
以 IoT 領域應用來看,可能每隔幾秒就會有一筆紀錄產生,例如: 溫度、濕度等感測資訊,如果隨著裝置數量增加,可以預期資料庫會很忙碌,因為他必須不停地寫入,這無疑對於資料庫是一個負擔。再者,我們可以發現每一個區域、裝置的感測數值是一個時間相關地連續資料庫,如果後期我們需要繪製趨勢圖,我們需要對這些資料做些 Query 判斷。當這個資料表越來越大,對於系統反應的即時性也難免會受到影響;哪怕你將不同地點甚至裝置拆開成不同的資料表,當資料規模日益增加,這還是一個相當可怕的數據運算量。
時序資料庫 Time Series Database
時序資料庫不是什麼新玩意兒。他的技術概念就是適合 IoT 的感測器料紀錄,因為他以時間戳記為核心概念,記錄每一筆連續數據。
具體來說,所謂的時序資料(time series data)的資料庫系統是專門用於儲存和查詢時間序列資料。其中時序資料是指隨著時間變化的資料,例如傳感器資料、機器日誌、性能指標、交易等。因為這些資料需要以時間為主要維度進行分析和查詢。
TSDB 通常具有以下特點:
- 支持高效地寫入和查詢時序資料能力,通常使用列儲存或分散式儲存來實現。
- 具有時間序列的特定功能,例如滾動時間窗口、聚合、預測、採樣等。
- 支持高並發、高吞吐量的寫入和查詢。
目前常見的開源時序資料庫包含: OpenTSDB、InfluxDB、Prometheus、KairosDB 等,每個間也有些許的差異。其中在業界 Influxdb 算是在IoT領域應用相對較多的技術,我想不外乎是他透過 Go 語言的效能優勢,更重要的是跟 SQL 接近的 Query 語法。
Influxdb
InfluxDB 是一個開源的時序資料庫系統,它由 InfluxData 公司開發和維護。InfluxData 公司提供了 InfluxDB 的開源版本和商業版本。InfluxDB 的開源版本(InfluxDB OSS)是根據 MIT 許可證開源的,這意味著您可以自由地使用、修改和分發 InfluxDB 的代碼,甚至可以在商業產品中使用。需要特別留意的是如果你的情境不需要叢集、平行化的架構,那麼這個免費授權的版本其實就足矣。如果你的資料量太大,那麼建議可以評估他們的商業版本來獲取更高的運算效能。
之所以會提其筆寫這個主題是因為前陣子的研發,發現台灣在這領域的文章真的滿少,一路上花了不少時間在處理版本差異上的錯誤,花了不少時間摸索。下一個章節我們來聊聊如何建置 TSDB 資料庫。