2018年6月28日 星期四

快速理解 OpenTSDB 的 Schema 設計




文章摘要: 因為這些與”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


推薦閱讀:



  1. OpenTSDB後設資料模型




  2. OpenTSDB資料表設計




  3. OpenTSDB執行緒模型




  4. OpenTSDB讀取流程




NoSQL漫談


簡介:


NoSQL主要泛指一些分散式的 非關係型資料儲存技術 ,這其實是一個非常廣泛的定義,可以說涉及到分散式系統技術的方方面面。隨著 人工智慧、物聯網、大資料、雲端計算 以及 區塊鏈 技術的不斷普及,NoSQL技術將會發揮越來越大的價值。” NoSQL漫談 “,借NoSQL之名,漫談各類分散式儲存技術。內容涉及 HBase 基礎原理, 時序資料庫,時空資料庫,圖資料庫 以及 搜尋技術 等等,歡迎感興趣的同學關注。  



▲長按圖片識別二維碼關注






http://www.buzzfunnews.com/20180622659.html

心情煩悶需要新鮮事刺激一下嗎?請上:http://www.buzzfunnews.com

沒有留言:

張貼留言