您好,登錄后才能下訂單哦!
這兩年互聯網行業掀著一股新風,總是聽著各種高大上的新名詞。大數據、人工智能、物聯網、機器學習、商業智能、智能預警啊等等。
以前的系統,做數據可視化,信息管理,流程控制。現在業務已經不僅僅滿足于這種簡單的管理和控制了。數據可視化分析,大數據信息挖掘,統計預測,建模仿真,智能控制成了各種業務的追求。
“所有一切如淚水般消失在時間之中,時間正在死去“,以前我們利用互聯網解決現實的問題。現在我們已經不滿足于現實,數據將連接成時間序列,可以往前可以觀其歷史,揭示其規律性,往后可以把握其趨勢性,預測其走勢。
于是,我們開始存儲大量時間相關的數據(如日志,用戶行為等),并總結出這些數據的結構特點和常見使用場景,不斷改進和優化,創造了一種新型的數據庫分類——時間序列數據庫(Time Series Database).
時間序列數據庫主要用于指處理帶時間標簽(按照時間的順序變化,即時間序列化)的數據,帶時間標簽的數據也稱為時間序列數據。
每個時序點結構如下:
比如我想記錄一系列傳感器的時間序列數據。數據結構如下:
* 標識符:device_id,時間戳
* 元數據:location_id,dev_type,firmware_version,customer_id
* 設備指標:cpu_1m_avg,free_mem,used_mem,net_rssi,net_loss,電池
* 傳感器指標:溫度,濕度,壓力,CO,NO2,PM10
如果使用傳統RDBMS存儲,建一張如下結構的表即可:
如此便是一個最簡單的時間序列庫了。但這只是滿足了數據模型的需要。我們還需要在性能,高效存儲,高可用,分布式和易用性上做更多的事情。
大家可以思考思考,如果讓你自己來實現一個時間序列數據庫,你會怎么設計,你會考慮哪些性能上的優化,又如何做到高可用,怎樣做到簡單易用。
這個數據庫其實就是一個基于傳統關系型數據庫postgresql改造的時間序列數據庫。了解postgresql的同學都知道,postgresql是一個強大的,開源的,可擴展性特別強的一個數據庫系統。
于是timescale.inc開發了Timescale,一款兼容sql的時序數據庫, 底層存儲架構在postgresql上。 作為一個postgresql的擴展提供服務。其特點如下:
基礎:
擴展:
劣勢:
其實大家都可以去深入了解一下這個數據庫。對RDBMS我們都很熟悉,了解這個可以讓我們對RDBMS有更深入的了解,了解其實現機制,存儲機制。在對時間序列的特殊化處理之中,我們又可以學到時間序列數據的特點,并學習到如何針對時間序列模型去優化RDBMS。
之后我們也可以寫一篇文章來深入的了解一下這個數據庫的特點和實現。
Influxdb是業界比較流行的一個時間序列數據庫,特別是在IOT和監控領域十分常見。其使用go語言開發,突出特點是性能。
特性:
Influxdb已經將分布式版本轉為閉源。所以在分布式集群這塊是一個弱點,需要自己實現。
The Scalable Time Series Database. 打開OpenTSDB官網,第一眼看到的就是這句話。其將Scalable作為其重要的特點。OpenTSDB運行在Hadoop和HBase上,其充分利用HBase的特性。通過獨立的Time Series Demon(TSD)提供服務,所以它可以通過增減服務節點來輕松擴縮容。
Opentsdb是一個基于Hbase的時間序列數據庫(新版也支持Cassandra)。
其基于Hbase的分布式列存儲特性實現了數據高可用,高性能寫的特性。受限于Hbase,存儲空間較大,壓縮不足。依賴整套HBase, ZooKeeper
采用無模式的tagset數據結構(sys.cpu.user 1436333416 23 host=web01 user=10001)
結構簡單,多value查詢不友好
OpenTSDB在HBase上針對TSDB的表設計和RowKey設計是值得我們深入學習的一個特點。有興趣的同學可以找一些詳細的資料學習學習。
Druid是一個實時在線分析系統(LOAP)。其架構融合了實時在線數據分析,全文檢索系統和時間序列系統的特點,使其可以滿足不同使用場景的數據存儲需求。
Druid架構蠻復雜的。其按功能將整個系統細分為多種服務,query、data、master不同職責的系統獨立部署,對外提供統一的存儲和查詢服務。其以分布式集群服務的方式提供了一個底層數據存儲的服務。
Druid在架構上的設計很值得我們學習。如果你不僅僅對時間序列存儲感興趣,對分布式集群架構也有興趣,不妨看看Druid的架構。另外Druid在segment(Druid的數據存儲結構)的設計也是一大亮點,既實現了列式存儲,又實現了反向索引。
Elasticsearch 是一個分布式的開源搜索和分析引擎,適用于所有類型的數據,包括文本、數字、地理空間、結構化和非結構化數據。Elasticsearch 在 Apache Lucene 的基礎上開發而成,由 Elasticsearch N.V.(即現在的 Elastic)于 2010 年首次發布。Elasticsearch 以其簡單的 REST 風格 API、分布式特性、速度和可擴展性而聞名。
Elasticsearch以ELK stack被人所熟知。許多公司基于ELK搭建日志分析系統和實時搜索系統。之前我們在ELK的基礎上開始開發metric監控系統。即想到了使用Elasticsearch來存儲時間序列數據庫。對Elasticserach的mapping做相應的優化,使其更適合存儲時間序列數據模型,收獲了不錯的效果,完全滿足了業務的需求。后期發現Elasticsearch新版本竟然也開始發布Metrics組件和APM組件,并大量的推廣其全文檢索外,對時間序列的存儲能力。真是和我們當時的想法不謀而合。
Elasticsearch的時序優化可以參考一下這篇文章:《elasticsearch-as-a-time-series-data-store》
也可以去了解一下Elasticsearch的Metric組件:Elastic Metrics
Beringei是Facebook在2017年最新開源的一個高性能內存時序數據存儲引擎。其具有快速讀寫和高壓縮比等特性。
2015年Facebook發表了一篇論文《Gorilla: A Fast, Scalable, In-Memory Time Series Database 》,Beringei正是基于此想法實現的一個時間序列數據庫。
Beringei使用Delta-of-Delta算法存儲數據,使用XOR編碼壓縮數值。使其可以用很少的內存即可存儲下大量的數據。
Data model
時間序列數據模型一般有兩種,一種無schema,具有多tag的模型,還有一種name、timestamp、value型。前者適合多值模式,對復雜業務模型更適合。后者更適合單維數據模型。
Query language
目前大部分TSDB都支持基于HTTP的SQL-like查詢。
Reliability
可用性主要體現在系統的穩定高可用上,以及數據的高可用存儲上。一個優秀的系統,應該有一個優雅而高可用的架構設計。簡約而穩定。
Performance
性能是我們必須考慮的因素。當我們開始考慮更細分領域的數據存儲時,除了數據模型的需求之外,很大的原因都是通用的數據庫系統在性能上無法滿足我們的需求。大部分時間序列庫傾向寫多讀少場景,用戶需要平衡自身的需求。下面會有一份各庫的性能對比,大家可以做一個參考。
Ecosystem
我一直認為生態是我們選擇一個開源組件必須認真考慮的問題。一個生態優秀的系統,使用的人多了,未被發現的坑也將少了。另外在使用中遇到問題,求助于社區,往往可以得到一些比較好的解決方案。另外好的生態,其周邊邊界系統將十分成熟,這讓我們在對接其他系統時會有更多成熟的方案。
Operational management
易于運維,易于操作。
Company and support
一個系統其背后的支持公司也是比較重要的。背后有一個強大的公司或組織,這在項目可用性保證和后期維護更新上都會有較大的體驗。
Timescale | InfluxDB | OpenTSDB | Druid | Elasticsearch | Beringei | |
---|---|---|---|---|---|---|
write(single node) | 15K/sec | 470k/sec | 32k/sec | 25k/sec | 30k/sec | 10m/sec |
write(5 node) | 128k/sec | 100k/sec | 120k/sec |
可以按照以下需求自行選擇合適的存儲:
之后我們可以來深入了解一兩個TSDB,比如Influxdb,OpenTSDB,Druid,Elasticsearch等。并可以基于此學習一下行存儲與列存儲的不同,LSM的實現原理,數值數據的壓縮,MMap提升讀寫性能的知識等。
關于時間序列數據庫TSDB的介紹以及選擇技巧就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。