一.命名方案
OpenTSDB命名格式有點類似于RRD樣式,隻不過引入了标記(tags),使得名額(metric)更具有代表性和通用性,可以共享許多獨特的時間序列。通過标記的鍵值對組合來确定名額的唯一性,可以非常靈活的進行聚合函數的查詢。
RRD如果要記錄web1伺服器的第一個CPU的使用者空間使用量,命名的格式為web1.sys.cpu.0.user,如果有上千台伺服器,每台多核CPU,那麼需要命名很多來差別,如webN.sys.cpu.M.user。 對于OpenTSDB,可以這麼命名sys.cpu.user host=web1,cpu=0。如果要彙總所有核心的值,隻需sum:sys.cpu.user{host=web1}。如果要彙總上千台伺服器的CPU值,隻需sum:sys.cpu.user。比RRD命名格式更加的靈活通用。
是以,對于要監控的對象命名,要定義一個相同的共性,便于彙總,同時,要能很好的表達監控的項目。
二.名額命名規範
名額名稱區分大小寫,統一以小寫字母命名。
名額名稱不能含有空格。
名額名稱隻能含有下列字元:a-z,A-Z,0-9,-,_,.,/或Unicode字母。
名額名稱盡量精短。
三.名額值規範
名額值可以是整數也可以是浮點數。
四.時間戳
UNIX時間戳,可以是秒或毫秒,必需是整數,且不能超過13位數。毫秒級的時間戳格式必需是1234567890123,最後三位代表毫秒數。對于應用程式生成的時間戳超過13位的,必需四舍五入至最高13位,否則報錯。
由于OpenTSDB底層存儲系統HBase目前隻支援秒級别的存儲,是以對于毫秒級别的資料會轉換成秒。
五. 标記命名規範
标記是用來補充說明名額的,是名額的屬性,來對名額進行差異性的定義。
标記是一對鍵值對。
每個名額至少有一個标記。通常是host=ip或host=hostname。
OpenTSDB最多支援8個标記。
标記區分大小寫,統一以小寫字母命名。
标記不能含有空格。
标記隻能含有下列字元:a-z,A-Z,0-9,-,_,.,/或Unicode字母。
六. HTTP API接口
為了節省帶寬,該接口允許在一個單一的請求中送出多個資料點資料。每個資料點單獨處理,如果其中某個資料點有問題不會影響其他資料點的存儲。
- 位址:
- /api/put
- /api/put?summary 調試,傳回彙總資訊
- /api/put?details 調試,傳回詳細資訊
- 方法:POST
-
格式:
{
metric: ”lvs.connection.active”, //必需,字元串,名額名稱
timestamp: 1234567890, //必需,整型,時間戳
value: 11.11, //必需,整型、浮點型、字元串,名額值
tags: {“host”:”web1”} //必需,對象,标記對
}
- 傳回結果:
預設情況下,如果所有資料存儲成功,響應一個204的狀态碼。如果有一個或多個資料點出錯,傳回400狀态碼和錯誤消息内容。
-
請求位址是/api/put?summary時,傳回:
{
“failed”: 1, //整型,存儲失敗的資料點數量
“success”: 0 //整型,存儲成功的資料點數量
}
-
請求位址是/api/put?details時,傳回:
{
"errors": [ …], //數組,失敗的資料點清單以及失敗原因
"failed": 1,
"success": 0
}
七. HTTP API接口執行個體
1. /api/put
# curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put HTTP/1.1204NoContent Content-Type:application/json;charset=UTF-8 Content-Length:0
2./api/put?summary
1 2 3 4 5 6 | # curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?summary HTTP/1.1200OK Content-Type:application/json;charset=UTF-8 Content-Length:24 {"failed":0,"success":1} |
3. /api/put?details
2 3 4 5 6 | # curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?details HTTP/1.1200OK Content-Type:application/json;charset=UTF-8 Content-Length:36 {"errors":[],"failed":0,"success":1} |
2 3 4 5 6 | # curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?details HTTP / 1.1 200 OK Content - Type : application / json ; charset = UTF - 8 Content - Length : 36 { "errors" : [ ] , "failed" : 0 , "success" : 1 } |
OpenTSDB是一個基于HBase上的實時監控資訊收集和展示平台。它支援秒級資料采集metrics,使用HBase進行永久存儲,可以做容量規劃,并很容易的接入到現有的監控系統裡。OpenTSDB可以從大規模的裝置中擷取相應的metrics并進行存儲、索引以及服務,進而使得這些資料更容易讓人了解,如web化,圖形化等。
1. 安裝
Opentsdb依賴Gnuplot,它 是一個指令行的互動式繪圖工具。使用者通過輸入指令,可以逐漸設定或修改繪圖環境,并以圖形描述資料或函數,使我們可以借由圖形做更進一步的分析。
1 | yum install - y gnuplot |
Opentsdb目前有現成的rpm、deb打包,非常友善。下載下傳連結:https://github.com/OpenTSDB/opentsdb/releases .下面我們安裝rpm。
1 | yum localinstall opentsdb - 2.0.1.noarch.rpm |
配置
1 2 3 4 5 6 7 | vim / etc / opentsdb / opentsdb .conf #TSDB通訊的端口 tsd .network .port = 4242 #資料儲存到儲存到HBase表下 tsd .storage .hbase .data_table = tsdb #ZooKeeper Quorum tsd .storage .hbase .zk_quorum = hadoop01 : 2181 , hadoop02 : 2181 , hadoop03 : 2181 |
配置完成後,我們通過下面指令在HBase中建立opentsdb所需的表。預設情況下opentsdb建立的HBase表啟用了lzo壓縮。需要開啟Hadoop中的lzo壓縮支援, 這裡我們直接在下面腳本中把COMPRESSION的支援關閉:
1 2 | vim / usr / share / opentsdb / tools / create_table .sh COMPRESSION = NONE |
然後在HBase使用者下執行下面腳本,在HBase中create所需的幾張表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / usr / share / opentsdb / tools / create_table . sh Hbase :: Table - tsdb - uid create 'tsdb' , { NAME = > 't' , VERSIONS = > 1 , COMPRESSION = > 'NONE' , BLOOMFILTER = > 'ROW' } 0 row ( s ) in 0.4220 seconds Hbase :: Table - tsdb create 'tsdb-tree' , { NAME = > 't' , VERSIONS = > 1 , COMPRESSION = > 'NONE' , BLOOMFILTER = > 'ROW' } 0 row ( s ) in 0.4140 seconds Hbase :: Table - tsdb - tree create 'tsdb-meta' , { NAME = > 'name' , COMPRESSION = > 'NONE' , BLOOMFILTER = > 'ROW' } 0 row ( s ) in 0.4200 seconds Hbase :: Table - tsdb - meta |
啟動tsd(Time Series Daemon)服務,該指令有一些常用參數,會覆寫/etc/opentsdb/opentsdb.conf中的配置。參數清單如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Usage : tsd -- port = PORT -- staticroot = PATH -- cachedir = PATH Starts the TSD , the Time Series Daemon -- async - io = true | false Use async NIO ( default true ) or traditionalblocking io -- auto - metric Automatically add metrics to tsdb as they are inserted . Warning : this may cause unexpected metrics to be tracked -- cachedir = PATH Directory underwhich to cache result of requests . -- flush - interval = MSEC Maximum time for which a new data point canbe buffered ( default : 1000 ) . -- port = NUM TCPport to listen on . -- staticroot = PATH Web root from which toserve static files ( / s URLs ) . -- table = TABLE Nameof the HBase table where to store the time series ( default : tsdb ) . -- uidtable = TABLE Name of theHBase table to use for Unique IDs ( default : tsdb - uid ) . -- worker - threads = NUM Number for async io workers ( default : cpu * 2 ) . -- zkbasedir = PATH Path underwhich is the znode for the - ROOT - region ( default : / hbase ) . -- zkquorum = SPEC Specificationof the ZooKeeper quorum to use ( default : localhost ) . |
那麼我們通過14242端口啟動TSD。
1 2 3 | sudo - u hbase tsdb tsd -- port 14242 …… 2015 - 03 - 12 17 : 04 : 52 , 253 INFO [ main ] TSDMain : Ready to serve on / 0.0.0.0 : 14242 |
OK!下面我們打開URL:http://debugo01:14242/
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNwMDewQjNtM3YpJHdl12LcNDMvwVNxAjMvw1ckF2bsBXdvwFduVGdu92YtA3dvwVbvNmLvdWdiVGZvw1LcpDc0RHaiojIsJye.png)
Opentsdb已經安裝成功!
2. OpenTSDB設計探索
在OpenTSDB中,有下面一個基本的概念:
Metric:一個可測量的機關的标稱。metric不包括一個數值或一個時間,其僅僅是一個标簽,包含數值和時間的叫datapoints,metric是用逗号連接配接的不允許有空格,例如:proc.loadavg.5m
Timestamp:一個絕對時間戳值。
Tags:tag描述被測量的實體,Tags由tag key和tag value組成,前者表示一個分組,後者表示一個特定的項。
Data Point:可以被記錄為某一個Timestamp的一個數值。
Time Series:一個metric的帶有多個tag的data point集合。
UID:在OpenTSDB中,每一個metric、tagk或者tagv在建立的時候被配置設定一個唯一辨別叫做UID,他們組合在一起可以建立一個序列的UID或者TSUID。在OpenTSDB的存儲中,對于每一個metric、tagk或者tagv都存在從0開始的計數器,每來一個新的metric、tagk或者tagv,對應的計數器就會加1。
TSUID。當一個data point被寫到OpenTSDB時,其row key格式為: [… ],不考慮時間戳的話,将其餘部分都轉換為UID,然後拼在一起,就可以組成為TSUID。在OpenTSDB中,所有資料存儲在一張叫做tsdb的表中,這是為了充分利用hbase有序和region分布式的特點。所有的值都儲存在唯一列簇t中。TSD啟動後會接收到監控資料,包括名額(metric_uid)、時間戳、資料、tag标簽,tag标簽包括tag名稱ID和tag值ID。
根據HBase rowkey有序的原則,rowkey為 [… ],UID預設編碼為3 Bytes,而時間戳為4 Bytes編碼。例如:proc.loadavg.5m 1292148123 42 host=debugo01
對于名額proc.loadavg.5m的ID為:[0, 0, 1], 标簽名稱的ID為:[0, 0, 1] debugo01标簽值的ID為:[0, 0, 1],他們組成rowkey:
1 2 3 4 5 | [ 0 , 0 , 1 , 77 , 4 , - 99 , 32 , 0 , 0 , 1 , 0 , 0 , 1 ] ` -- -- -- - ' `------------' ` -- -- - ' `------' metric ID base timestamp name ID value ID ` -- -- -- -- -- -- -- -' first tag |
由此可見,對于metric + tags相同的資料都會連續存放,且metic相同的資料也會連續存放,這樣對于scan以及做aggregation都非常有幫助。
Opentsdb使用一個單獨的較小的表叫做tsdb-uid用來存儲UID映射,包括正向的和反向的。存在兩列簇,一個列簇叫做name用來将一個UID映射到一個字元串,另一個列族叫做id,用來将字元串映射到UID。列簇的每一行都至少有以下三列中的一個:
metrics 将metric的名稱映射到UID
tagk 将tag名稱映射到UID
tagv 将tag的值映射到UID
3. 使用OpenTSDB
首先建立metrics,指令會輸出它的UID。
1 2 | # sudo -u hbase tsdb mkmetric proc.loadavg.1m metrics proc . loadavg . 1mproc.loadavg.1m : [ 0 , 0 , 1 ] |
編寫資料加載腳本,腳本來自http://scm.zoomquiet.io/data/20131204123732/index.html
1 2 3 4 5 6 7 8 9 10 11 | cat > loadavg - collector .sh << \ EOF #!/bin/bash set - e while true ; do awk - v now = ` date + % s ` - v host = ` hostname ` \ '{ print "put proc.loadavg.1m " now " " $1" host=" host;}' / proc / loadavg sleep 15 done | nc - w 30 debugo01 14242 EOF chmod + x loadavg - collector .sh nohup . / loadavg - collector .sh & |
每隔15秒會輸出如下資訊到tsd
1 2 | put proc . loadavg . 1m 1288946927 0.36 host = debugo01 … |
通過Scan UID表可以找到它們對應的UID。
1 2 3 | \ x00 \ x00 \ x01 column = name : metrics , timestamp = 1426212849709 , value = proc . loadavg . 1m \ x00 \ x00 \ x01 column = name : tagk , timestamp = 1426214303614 , value = host \ x00 \ x00 \ x01 column = name : tagv , timestamp = 1426214303641 , value = hadoop01 |
在Web頁面中輸入相應的metrics,可以得到資料的圖展示:
^^
OpenTSDB所有的配置都在 link. 這裡列出來的配置基本都有預設值,但是有些需要根據環境和性能做出改變,具體如下表:
配置項 | 預設值 | 描述 | 修改值 |
---|---|---|---|
| false | 是否在TSD啟動的時候,預熱UID緩存資料,為了提升性能,需要開啟 | true |
| false | 一個新的metric存入tsdb時,是否自動為其生成UID,如果true,存入成功,反之,失敗。(按照最大優化性能的目标來說,應該預先為所有的metric生成UID,但是實際中預先不知道所有的metric,是以這個值需要設定為true) | true |
| 無 | tsd寫臨時檔案的目錄 | 根據實際環境設定,比如/tmp/opentsdb |
| false | Http寫入資料時是否支援一次寫入大批量的資料 | true |
| 4096 | 寫入的批量資料的上限 | 根據需要增大,比如65535 |
| 無 | opentsdb頁面的靜态資源檔案目錄 | 安裝目錄下 ./build/staticroot |
| 無 | tsd讀寫資料的端口 | 根據實際配置 比如9099 |
| tsd查詢的timeout,如果為0,則不會timeout | 合理配置。 比如200 | |
| false | 2.2版本,tsd 寫資料到HBase有兩種方式,一種是每來一條資料append到hbase, 一種是先緩存大量資料到tsd記憶體,然後進行compaction,一些性寫入。推薦Append方式 | true |
| true | append打開,這種就關閉 | false |
| false | 相同時間存儲相同metric的時候(重複資料),最新寫入的覆寫前面的值 | true |
| /hbase | hbase 的zk的目錄 | 根據實際配置 |
| localhost | hbase 的zk位址 | 根據實際配置 |
實際使用中,還需要根據metric的具體情況調整一些配置項,比如salt, uid.width等。
參考
http://scm.zoomquiet.io/data/20131204123732/index.html
http://www.cnblogs.com/gsblog/p/4029894.html
2 3 4 5 6 | # curl -i -X POST -d '{"metric":"proc.loadavg.15m", "timestamp":1413015492, "value":8, "tags":{"host":"10.0.101.145"}}' http://10.0.101.145:4242/api/put?details HTTP / 1.1 200 OK Content - Type : application / json ; charset = UTF - 8 Content - Length : 36 { "errors" : [ ] , "failed" : 0 , "success" : 1 } 統計總記錄數: 因為metric必填,是以隻能循環統計相加 參數類似如下: { "start": 1508428800, "end":1509168535, "queries": [ { "aggregator": "sum", "metric": "meter.current.phase.b", "downsample": "0all-count" }] } |