文章摘要: 因為這些與”sys.cpu.use”的Time Series中都包含了Tag {host=webserver01}(儘管有一些Time Series中包含了更多的Tags)記錄一個名為”webserver01.sys.cpu.user.all”的Time Series
在時序資料庫中,Time Series是一個基礎概念。我們先來看看Wiki中關於Time Series的定義:
Time Series是一組按照時間發生先後順序進行排列的資料點序列。通常一組時間序列的時間間隔為一恆定值(如1秒,5分鐘,1小時等)。
我們可以這樣命名一個Time Series:
webserver01.sys.cpu.0.user
這樣從名稱中可以很容易獲知該Time Series關聯瞭如下資訊:
Web Server: webserver01
CPU Core: 0
如果我們的查詢可以同時指定web server以及cpu core的話,這種設計則非常適合。
但對於一個擁有64 Cores的Web Server,如果查詢所有CPU Cores的聚合結果的話,可以通過如下的萬用字元來匹配所有相關的Time Series:
查詢1: webserver01.sys.cpu.*.user
這樣,可以獲取到64個Time Series,然後聚合結果即可。
但如果有1000個Web Servers呢?我們需要基於如下的萬用字元來匹配所有的相關Time Series:
查詢2: *.sys.cpu.*.user
關於如上兩種查詢,一種可選的加速方案為:在這64個Time Series之外,記錄一個名為”webserver01.sys.cpu.user.all”的Time Series,這樣可以加速查詢1中所有CPU Cores的聚合統計計算。 而關於查詢2,可以記錄一個名為”webservers.sys.cpu.user.all”的Time Series來進行加速。
在OpenTSDB的Schema定義中,引入了Tag的概念。每一個Time Series包含一個Metric名稱,但可能包含包含1組或多組Tags資訊(每一個Tag包含一個TagKey與TagValue),以前面的”webserver01.sys.cpu.0.user”為例,在OpenTSDB表示為:
sys.cpu.user host=webserver01, cpu=0
將其拆解後的構成資訊:
sys.cpu.user :
host :
webserver01 :
cpu :
0 :
OpenTSDB中的一個Time Series,由Metric Name與X個Tags(X>=1)唯一決定。
例如:
sys.cpu.user host=webserver01
sys.cpu.user host=webserver01, cpu=0
sys.cpu.user host=webserver02, cpu=1
代表了三個不同的Time Series。
如果查詢時指定Web Server,指定CPU Core的聚合結果,可以簡單表達為:
sum : sys.cpu.user {host=webserver01, cpu=42}
注:實際查詢時需要指定時間資訊,這裏爲了簡單起見,省略了時間資訊,下同。
如果查詢Web Server上所有的CPU Cores的聚合結果,可以這麼表達:
sum : sys.cpu.user {host=webserver01}
這樣就可以匯聚了webserver01上所有CPU Cores所關聯的Time Series的結果。
再進一步,如果查詢所有的Web Servers所有CPU Cores的聚合結果,可以這麼表達:
sum : sys.cpu.user
與同一metric name相關的所有的Time Series資訊,都是相鄰儲存的,因此,我們可以輕易實現與此metric相關的快速聚合查詢或結果鑽取。
既然瞭解了OpenTSDB的schema由Metric與Tags構成,我們接下來看看需要注意的一個問題:
繼續上面的例子,假設我們記錄了一個Web Server的64個CPU Cores相關的Time Series:
而且我們使用瞭如下命名的Time Series來記錄關於這個Web Server上的所有CPU Cores的聚合結果:
sys.cpu.user host=webserver01 1356998400 50
也就是說,表中一共儲存了65條記錄。
sum
:sys.cpu.user {host=webserver01}
我們期望的聚合結果應該為50,但實際的查詢結果卻會變為100,這是因為這次查詢共聚合了下面的65條記錄的結果:
再舉一個典型的例子來闡述說明一下這裏的查詢行為:
如果查詢條件為” sum :sys.cpu.user {host=webserver01}”, 如下這些Time Series都將會被包含其中:
因為這些與”sys.cpu.use”的Time Series中都包含了Tag {host=webserver01}(儘管有一些Time Series中包含了更多的Tags)。
因此,使用OpenTSDB時需要注意關於Tags定義方面的問題。
參考資訊:
OpenTSDB Document
推薦閱讀:
-
OpenTSDB後設資料模型
-
OpenTSDB資料表設計
-
OpenTSDB執行緒模型
-
OpenTSDB讀取流程
NoSQL漫談
簡介:
NoSQL主要泛指一些分散式的 非關係型資料儲存技術 ,這其實是一個非常廣泛的定義,可以說涉及到分散式系統技術的方方面面。隨著 人工智慧、物聯網、大資料、雲端計算 以及 區塊鏈 技術的不斷普及,NoSQL技術將會發揮越來越大的價值。” NoSQL漫談 “,借NoSQL之名,漫談各類分散式儲存技術。內容涉及 HBase 基礎原理, 時序資料庫,時空資料庫,圖資料庫 以及 搜尋技術 等等,歡迎感興趣的同學關注。
▲長按圖片識別二維碼關注