物聯網系統中,需要實時處理的數據可通過隊列送入流處理引擎;不需要實時處理的數據,用于離線分析或數據挖掘,需要先存儲起來。物聯網系統的數據存儲的方式很多,要根據實際場景來選擇。
物理網系統各種可能的存儲選擇
物聯網的數據主要是通過傳感器采集, 經過解析和清洗, 以結構化的格式進行存儲。在數據量不大的情況下, 用MySQL等關系數據庫就可以滿足我們的需求。如果經常有很多報表統計的需要,也可以使用clickhouse、greenplum等nosql數據庫。
物聯網系統的數據存在特殊性,不同于傳統互聯網應用,除了互聯網應用常用的數據庫,可以結合物聯網系統的數據特點,設計專門的數據存儲系統。
物聯網數據特點
數據寫入
物聯網系統的數據寫入具有平穩、持續、高并發高吞吐的特點;通常寫多讀少,實時寫入傳感器最近生成的數據,幾乎沒有數據更新的操作。
數據查詢和分析
- 物聯網系統的數據通常需要按時間范圍讀取,系統使用者不會去關心某個特定點的數據,關心的是一段時間的數據;
- 時間近的數據被讀取的概率高,查詢的粒度比較細;反之時間遠的數據被讀取的概率低,查詢粒度比較粗;
- 物聯網系統往往需要支持多精度的數據查詢和多維度的數據分析。
數據存儲
物聯網系統數據存儲量大;數據冷熱分明,不同時效的數據查詢需求不同;數據存儲也要實現多種精度的數據存儲,通常是按照時間維度統計。
時序數據庫
物聯網數據有個特點, 那就是每條數據都會帶一個時間戳, 代表數據被采集的時間,所以物聯網系統的數據是時間序列數據。
時序數據庫尤其適合時間序列數據的存儲,比如互聯網運維領域常用的Prometheus就是基于leveldb引擎的時序數據庫。顧名思義,時序數據庫就是存放時序數據的數據庫,支持時序數據的快速寫入、持久化、多維度的聚合查詢等功能。
最早的時序數據庫應該是RRDTool(Round Robin Database Tool),由Tobias Oetiker 編寫,后來世界各地的人對代碼做出了各自貢獻。
RRD存儲數據的文件好似一個圓
RRDTool數據庫由一個固定大小的數據文件來存放數據,此數據庫不會像傳統數據庫一樣為隨著數據的增多而文件的大小也在增加,RRDTool在創建好后其文件大小就固定了。
可以將RRDTool的數據文件看成一個圓,圓的眾多直徑把圓劃分成一個個扇形,每個扇形就是可以存數據的槽位,每個槽位上被打上了一個時間戳。
圓心上有一個指針,隨著時間的流逝,取回數據后,指針會負責把數據填充在相應的槽位上;當指針轉了360度后,最開始的數據就會被覆蓋,就這樣RRDTool循環填充著數據。
在RRDTool數據庫之后,又出現了很多開源數據庫。
歷史上發布的開源時序數據庫:
•1999/07/16 RRDTool First release
•2009/12/30 Graphite 0.9.5
•2011/12/23 OpenTSDB 1.0.0
•2013/05/24 KairosDB 1.0.0-beta
•2013/10/24 InfluxDB 0.0.1
•2014/08/25 Heroic 0.3.0
•2017/03/27 TimescaleDB 0.0.1-beta
從2016年以后,隨著物聯網市場的發展,時序數據庫也跟著火了起來。2016年7月,百度云在其天工物聯網平臺上發布了國內首個多租戶的分布式時序數據庫產品TSDB;2017年2月Facebook開源了Beringei時序數據庫;2017年4月基于PostgreSQL打造的時序數據庫TimeScaleDB也開源了。
按照存儲的底層技術,大致可以將時序數據庫大致分為三類:
- 基于文件存儲:RRDTool,Graphite Whisper。此類常用于服務監控告警,數據存儲基于RRD的文件結構。
- 基于K/V數據庫:opentsdb基于hbase,kairosDB基于cassandra,prometheus基于leveldb,influxdb則選擇自己實現的一套KV存儲結構,類似LSM(Log Structured Merge) tree的TSM(Timestamp Segments Merged Tree)。
- 基于關系型數據庫:MySQL,PostgreSQL 等關系數據庫也可以保存時間序列數據。
時序數據是基于時間的數據。在以時間為軸的坐標系中將這些數據點連成線,可以做成多維度報表,揭示歷史數據的趨勢性、規律性、異常性;也可以做大數據分析,機器學習,實現對未來的預測和預警。時序數據庫為時序數據的歸納和分析提供了存儲基礎,在物聯網蓬勃發展的今天,必將得到越來越廣泛的應用。






