OpenTSDB介紹
1.1、OpenTSDB是什麼?主要用途是什麼?
官方文檔這樣描述:OpenTSDB is a distributed, scalable Time Series Database (TSDB) written on top of HBase;
翻譯過來就是,基于Hbase的分布式的,可伸縮的時間序列資料庫。
主要用途,就是做監控系統;譬如收集大規模叢集(包括網絡裝置、作業系統、應用程式)的監控資料并進行存儲,查詢。
OpenTSDB是基于HBase存儲時間序列資料的一個開源資料庫,但隻是一個HBase的應用而已。也即是在HBase之上加了一層外殼,用于更好的處理時序資料庫,真實的資料存儲還是在HBase。
時序資料是基于時間的一系列的資料。在有時間的坐标中将這些資料點連成線,往過去看可以做成多緯度報表,揭示其趨勢性、規律性、異常性;往未來看可以做大資料分析,機器學習,實作預測和預警。時序資料庫就是存放時序資料的資料庫,并且需要支援時序資料的快速寫入、持久化、多緯度的聚合查詢等基本功能
1、OpenTSDB介紹
1.1、OpenTSDB是什麼?主要用途是什麼?
官方文檔這樣描述:OpenTSDB is a distributed, scalable Time Series Database (TSDB) written on top of HBase;
翻譯過來就是,基于Hbase的分布式的,可伸縮的時間序列資料庫。
主要用途,就是做監控系統;譬如收集大規模叢集(包括網絡裝置、作業系統、應用程式)的監控資料并進行存儲,查詢。
1.2、介紹continue
存儲到OpenTSDB的資料,是以metric為機關的,metric就是1個監控項,譬如伺服器的話,會有CPU使用率、記憶體使用率這些metric;
OpenTSDB使用HBase作為存儲,由于有良好的設計,是以對metric的資料存儲支援到秒級别;
OpenTSDB支援資料永久存儲,即儲存的資料不會主動删除;并且原始資料會一直儲存(有些監控系統會将較久之前的資料聚合之後儲存)
2、OpenTSDB存儲相關的概念
介紹這些概念的時候,我們先看一個實際的場景。
譬如假設我們采集1個伺服器(hostname=qatest)的CPU使用率,發現該伺服器在21:00的時候,CPU使用率達到99%
下面結合例子看看OpenTSDB存儲的一些核心概念
1)Metric:即平時我們所說的監控項。譬如上面的CPU使用率
2)Tags:就是一些标簽,在OpenTSDB裡面,Tags由tagk和tagv組成,即tagk=takv。标簽是用來描述Metric的,譬如上面為了标記是伺服器A的CpuUsage,tags可為hostname=qatest
3)Value:一個Value表示一個metric的實際數值,譬如上面的99%
4)Timestamp:即時間戳,用來描述Value是什麼時候的;譬如上面的21:00
5)Data Point:即某個Metric在某個時間點的數值。
Data Point包括以下部分:Metric、Tags、Value、Timestamp
上面描述的伺服器在21:00時候的cpu使用率,就是1個DataPoint
儲存到OpenTSDB的,就是無數個DataPoint。
下面講一下,OpenTSDB是如何儲存DataPoint的。
3、OpenTSDB的設計
還是以例子來說明,譬如儲存這樣的1個DataPoint:
metric:proc.loadavg.1m
timestamp:1234567890
value:0.42
tags:host=web42,pool=static
3.1、簡單的設計
那麼,如果是一般的設計,會怎麼做呢,可能就是:RowKey=metric|timestamp|value|host=web42|pool=static,Column=v,Value=0.42
這是最簡單的設計,那接下來看看,OpenTSDB是怎麼做的吧。
3.2、OpenTSDB的方案
OpenTSDB使用HBase存儲,核心的存儲,是有兩張表,tsdb和tsdb-uid
3.2.1、表tsdb
tsdb是儲存資料的,看看該表的設計
tsdb的表結構
1)RowKey的設計
RowKey其實和上面的metric|timestamp|value|host=web42|pool=static類似;
但是差別是,OpenTSDB為了節省存儲空間,将每個部分都做了映射。
在OpenTSDB裡面有這樣的映射,metric-->3位元組整數、tagk-->3位元組整數、tagv-->3位元組整數
上圖的映射關系為,proc.loadavg.1m-->052、host-->001、web42-->028、pool-->047、static-->001
2)column的設計
為了友善後期更進一步的節省空間。OpenTSDB将一個小時的資料,儲存在一行裡面。
是以上面的timestamp1234567890,會先模一下小時,得出1234566000,然後得到的餘數為1890,表示的是它是在這個小時裡面的第1890秒;
然後将1890作為column name,而0.42即為column value
3.2.2、表tsdb-uid
表tsdb-uid
這裡其實儲存的就是一些metric,tagk,tagv的一些映射關系。
4、OpenTSDB的總體架構
openTSDB架構
Servers:就是伺服器了,上面的C就是指Collector,可以了解為OpenTSDB的agent,通過Collector收集資料,推送資料;
TSD:TSD是對外通信的無狀态的伺服器,Collector可以通過TSD簡單的RPC協定推送監控資料;另外TSD還提供了一個web UI頁面供資料查詢;另外也可以通過腳本查詢監控資料,對監控資料做報警
HBase:TSD收到監控資料後,是通過AsyncHbase這個庫來将資料寫入到HBase;AsyncHbase是完全異步、非阻塞、線程安全的Hbase用戶端,使用更少的線程、鎖以及記憶體,可以提供更高的吞吐量,特别對于大量的寫操作。
Opentsdb使用
Opentsdb 指令行 查詢: scan 1427817599 1456675199000 avg easypec.order.ordercostweek type=week
删除: scan --delete 1427817599 1456675199000 avg easypec.order.ordercostweek type=week 具體參考文檔: http://opentsdb.net/docs/build/html/user_guide/cli/scan.html 導入 scan --import
Opentsdb HTTP API
查詢 (POST請求) 請求位址: http://10.248.27.43:4242/api/query { "start": 1427817599, "queries": [{ "aggregator": "avg", "metric": "easypec.order.ordercostweek", "tags": { "type": "week" } }], "msResolution": "true", "showTSUIDs": "true" } 查詢最新的記錄(POST請求):
請求位址: http://10.248.27.5:4242/api/query/last { "queries": [ {"tags":{ "host":"localhost" }, "metric": "easypec.order.ordercosttotal" } ], "resolveNames":true, "backScan":1000 }
1. 關于metric, tag name和tag value
1) opentsdb的每個時間序列必須有一個metric和一個或多個(tag name, tag value)對,每個時間序列每小時的資料儲存為一行。
2) Opentsdb的metric, tag name和tag value各自的UID數量上限為2^24個,該值可以通過改變源代碼重新編譯後進行修改,最多可以擴充到8位元組,即2^64個。不建議修改。
3) tag name和tag value的UID配置設定是完全獨立的,例如,如果tag value的取值為整數2,那麼這個值完全可以被多個tag name所使用,例如cpu=2, interface=2, hdd=2等。
4) 在設計系統時應該確定metric, tag name和tag value的可能取值在較小的範圍内,因為它們的數量影響到查詢速度。
5) 注意事項:
a. 減少它們的數量。
b. 為每個metric使用同類的tag name
c. 考慮系統常用的查詢方式,選擇合适的時間序列metric和tag
d. 每個metric的tag數量維持在5個以内,最多不超過8個。
6) 存儲時間序列資料的時候,每個資料點要包含以下内容:metric,至少一對tag,時間戳(自1970年起的秒或毫秒),一個數值(整數或浮點數)。
7) 時間戳:一定是整數,且不超過13位。如果是13位表示毫秒,10位則表示秒。在一個序列中應該采用同樣機關的時間戳(都是秒或者都是毫秒),混合不同機關的時間戳會引起查詢緩慢,如無必要,應該用秒為機關,降低存儲空間的消耗。
8) metric和tag的命名規則:大小寫敏感,不允許空格,隻允許以下字元:字母,數字,減号,下劃線,點号,斜杠(/),長度不限,但是盡量短一些。
2. 資料點:
1) 隻能由數字和小數點組成,如果沒有小數點,則認為是整數,否則認為是浮點數。整數使用可變長度編碼方式,最少1位元組,最多8位元組。浮點數為4位元組單精度浮點數。由于浮點數是單精度類型,是以不支援需要精确值得浮點數,例如15.2會被儲存為15.199999809265137
2) 寫入資料時不必按照時間順序寫入,時間戳在後的資料可以先寫入,再寫入時間戳在前的資料。
3) 資料重複寫入的問題:
a. 在同一小時内多次寫入相同的資料不會有問題。
b. 如果設定和compaction操作,那麼如果前後兩次寫入的資料類型不同,則在查詢時一定會抛出異常。如果兩次寫入的資料類型相同,那麼在該行還沒有進行compaction操作之前,前面的資料将被覆寫掉。
4) 資料寫入方式:
資料有三種寫入方式:telnet, http post,用資料檔案批量導入。
3. HBase的組建方式:
1) 測試或容量較低時可以采用單機模式,這時HBase使用本地檔案系統作為存儲。
2) 大資料量的生産環境應該采用正式的多機叢集模式:Namenode雙機備份,3台Zookeeper,HDFS節點采用JBOD存儲,HBase的Region節點和HDFS資料節點共用。
各個節點之間采用千兆或萬兆網絡連接配接,叢集位于一個資料中心。
4. 性能考慮:
1) 每個TSD程序的處理能力大約為每秒幾千次寫,可以使用多個TSD程序實作更高寫入能力,前端采用DNS輪詢或Varnish緩存實作負載均衡。當叢集專用于opentsdb時,TSD程序可以和HBase的Region server位于同一台機器。
2) 可以将TSD程序配置為持久連接配接,這就可以阻止每次寫入資料都經曆建立和關閉連接配接的過程。
3) 關閉中繼資料和實時釋出功能,因為它們極大地影響到系統性能。