歡迎光臨
我們一直在努力

快速理解 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 基礎原理, 時序資料庫,時空資料庫,圖資料庫 以及 搜尋技術 等等,歡迎感興趣的同學關注。  

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

未經允許不得轉載:頭條楓林網 » 快速理解 OpenTSDB 的 Schema 設計