簡介
opentsdb是基于Hbase的時序數據庫[時間序列數據庫]。不具備通用性,主要針對具有時間特性和需求的數據,如監控數據、溫度變化數據等。opentsdb說是數據庫,但并不能稱作為數據庫,他是在Hbase(HBase才是具有存儲功能的)的基礎上,進行數據結構的優化和處理,從而適合存儲具有時間特性的數據,同時提供特定的工具進行查詢等操作。
基礎概念
- 時間戳(時間序列),指明時間點
- 指標名稱 :數據的作用,是這個數據的抽象概括,指明監控內容,如溫度,濕氣,大小
- 標簽 : 對象,指明監控對象 ,如某個城市,某個CPU,某塊區域
- 值 : 存儲值
以上組合表明 : 某個對象在某時間點對xxx監控的數據。如 : 福州在2018年11月29日12點30分00秒的溫度是21攝氏度。
這些也都是 opentsdb 中存儲的基礎數據類型,opentsdb使用tsdb表及tsdb-uid表存儲這些數據,在Hase中會具體講解opentsdb如何進行存儲優化這些數據。
總體架構
- servers : 不知道干嘛的。好像跟http api 沒關系
- TSD : 還是不知道干嘛的 。應該是處理程序
- HBase : 存儲數據庫
HBase
Hbase 是Hadoop 的子項目,負責數據存儲。是一種基于列的NoSQL數據庫,在opentsdb中HBase 為其提供了高效的數據存儲。
- tsdb-uid表 : opentsdb 將指標、時間戳、標簽名及標簽值使用 3個字節的uid 進行存儲,而tsdb-uid表就是存儲的就是做uid 和 真實值之間的映射關系,使用uid是為了優化HBase 中的Rowkey (行鍵)
-
tsdb 表 : 用來保存數據,這圖其實是看不懂的。只是知道 Row Key 是用來時存儲指標、時間戳、標簽的uid映射的,Column Family 存儲了是1個小時內的數據(一小時 = 60秒 * 60分鐘 = 3600 秒 ) image-20181130172939991.png
注: 存儲時間戳的方式有點特別。opentsdb將獲取存儲時間戳的所在小時時間戳進行存儲到RowKey ,小時時間戳與存儲時間戳的差值映射到Column Family 的時間值,表示是在這個小時中的第幾秒,這種方式可以開始查找到數據庫
HTTP API 使用
Opentsdb 的http aip 接口使用的是非規范的RESTful,不同的請求方法有不同的作用
(關于 RESTful規范可查閱 : http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html )
API | 描述 |
---|---|
/api/put | 寫入數據 |
/api/query | 查詢數據 |
/api/suggest | 查詢Metric.Tagk,TagV |
/api/dump_meta | 查詢Tagk下的TagV |
/api/query/last | 查詢最近一個數據(查不出來) |
寫入數據
api | 請求方法 | 描述 |
---|---|---|
/api/put | POST | 新增數據 |
支持多條數據或單條數據插入,注多條數據是需要使用[] 表示數組的。
每個參數都是必傳的,因為只有所有參數都具備才能說明該數據的精確信息
注 : 值value 從小位數 換成大位數 ,查詢是會發生錯誤,暫無研究其中規律,猜測跟存儲的基礎類型有關
如 : 12 轉 25595461081
刪除數據
api | 請求方法 | 描述 |
---|---|---|
/api/query | DELETE | 刪除數據 |
刪除數據的方法也是使用 /api/query但請求方法是DELETE,也就是說使用 POST 查詢出來的數據,換成 DELETE ,就會被刪除。好奇葩,要想符合RESTful ,接口取 /api/data ,用/api/query。
而且DELETE 是需要開啟配置才能使用,默認下是關的,也就是說你一般你是無法刪除數據的
修改數據
api | 請求方法 | 描述 |
---|---|---|
/api/put | POST | 修改數據 |
當時間戳 指標 標簽 都相同時,就會從新增變成修改,注意標簽內的數據要完全相同
查詢數據
api | 請求方法 | 描述 |
---|---|---|
/api/query | POST|GET | 查詢數據 |
必傳參數 start 開始時間戳 和 queries 子查詢 , 子查詢應該理解為條件查詢,說明了查詢要求,
使用開始時間參數和子查詢中的指標參數、聚合參數,可說明最基礎的查詢要求
如 :
{"start" : 1346846400,"queries" : [ { "aggregator" : "none", "metric" : "sys.area.temperature4" } ] }
說明 區域溫度在 2012/9/5 20:0:0后的所有數據
子查詢參數解析 (查詢名詞概念解析)
downsample 降采樣 :
dpValue 值過濾 : 就是將值進行比較輸出符合 depValue 表達式的值(就是查詢條件)
Aggregate 聚合
具有一定體系的api
樹 /api/tree
不知道這個樹到底是干嘛用的
api | 描述 |
---|---|
/api/tree/branch | |
/api/tree/collisions | |
/api/tree/notmatched | |
/api/tree/rule | |
/api/tree/rules | |
/api/tree/test |
uid /api/uid
Uid 是指標、標簽名、標簽值及時間戳對應的uid,在opentsdb中起到很好的優化作用,但對于其api還不知道其具體使用方法
api | 描述 |
---|---|
/api/uid/assign | |
/api/uid/tsmeta | |
/api/uid/uidmeta |
狀態 /api/stats
狀態相關接口,如jvm,線程等
api | 描述 |
---|---|
/api/stats/jvm | jvm 信息 |
/api/stats/query | 不知道是什么 |
/api/stats/region_clients | HBase各個端的信息 |
/api/stats/threads | 線程信息 |
非常用api
api | 描述 |
---|---|
/api/dropcaches | 清空數據緩存(暫不清楚當中處理方式,不推進使用) |
/api/aggregators | 查詢聚合函數 |
/api/config | 查詢配置信息 |
/api/serializers | 不知道干啥的 |
/api/suggest | 不知道干啥的 |
/api/version | 當前opentsdb 版本信息 |
/api/histogram |
問題
- 值value 從小位數 換成大位數 ,查詢是會發生錯誤,暫無研究其中規律,猜測跟存儲的基礎類型有關
- 時間區間的頭尾時間節點數據會被忽略
- 使用降采樣時,使用時間間隔會發生數據丟失情況。如時間間隔為一天(1d-avg)。會發生凌晨0到凌晨8點會數據丟失,不記錄到統計中。