天天看點

OpenTSDB介紹——基于Hbase的分布式的,可伸縮的時間序列資料庫,而Hbase本質是列存儲OpenTSDB介紹1、OpenTSDB介紹2、OpenTSDB存儲相關的概念3、OpenTSDB的設計4、OpenTSDB的總體架構

OpenTSDB介紹

1.1、OpenTSDB是什麼?主要用途是什麼?

官方文檔這樣描述:OpenTSDB is a distributed, scalable Time Series Database (TSDB) written on top of HBase;

翻譯過來就是,基于Hbase的分布式的,可伸縮的時間序列資料庫。

主要用途,就是做監控系統;譬如收集大規模叢集(包括網絡裝置、作業系統、應用程式)的監控資料并進行存儲,查詢。

OpenTSDB是基于HBase存儲時間序列資料的一個開源資料庫,但隻是一個HBase的應用而已。也即是在HBase之上加了一層外殼,用于更好的處理時序資料庫,真實的資料存儲還是在HBase。

         時序資料是基于時間的一系列的資料。在有時間的坐标中将這些資料點連成線,往過去看可以做成多緯度報表,揭示其趨勢性、規律性、異常性;往未來看可以做大資料分析,機器學習,實作預測和預警。時序資料庫就是存放時序資料的資料庫,并且需要支援時序資料的快速寫入、持久化、多緯度的聚合查詢等基本功能

1、OpenTSDB介紹

1.1、OpenTSDB是什麼?主要用途是什麼?

官方文檔這樣描述:OpenTSDB is a distributed, scalable Time Series Database (TSDB) written on top of HBase;

翻譯過來就是,基于Hbase的分布式的,可伸縮的時間序列資料庫。

主要用途,就是做監控系統;譬如收集大規模叢集(包括網絡裝置、作業系統、應用程式)的監控資料并進行存儲,查詢。

1.2、介紹continue

存儲到OpenTSDB的資料,是以metric為機關的,metric就是1個監控項,譬如伺服器的話,會有CPU使用率、記憶體使用率這些metric;

OpenTSDB使用HBase作為存儲,由于有良好的設計,是以對metric的資料存儲支援到秒級别;

OpenTSDB支援資料永久存儲,即儲存的資料不會主動删除;并且原始資料會一直儲存(有些監控系統會将較久之前的資料聚合之後儲存)

2、OpenTSDB存儲相關的概念

介紹這些概念的時候,我們先看一個實際的場景。

譬如假設我們采集1個伺服器(hostname=qatest)的CPU使用率,發現該伺服器在21:00的時候,CPU使用率達到99%

下面結合例子看看OpenTSDB存儲的一些核心概念

1)Metric:即平時我們所說的監控項。譬如上面的CPU使用率

2)Tags:就是一些标簽,在OpenTSDB裡面,Tags由tagk和tagv組成,即tagk=takv。标簽是用來描述Metric的,譬如上面為了标記是伺服器A的CpuUsage,tags可為hostname=qatest

3)Value:一個Value表示一個metric的實際數值,譬如上面的99%

4)Timestamp:即時間戳,用來描述Value是什麼時候的;譬如上面的21:00

5)Data Point:即某個Metric在某個時間點的數值。

                        Data Point包括以下部分:Metric、Tags、Value、Timestamp

                       上面描述的伺服器在21:00時候的cpu使用率,就是1個DataPoint

儲存到OpenTSDB的,就是無數個DataPoint。

下面講一下,OpenTSDB是如何儲存DataPoint的。

3、OpenTSDB的設計

還是以例子來說明,譬如儲存這樣的1個DataPoint:

metric:proc.loadavg.1m

timestamp:1234567890

value:0.42

tags:host=web42,pool=static

3.1、簡單的設計

那麼,如果是一般的設計,會怎麼做呢,可能就是:RowKey=metric|timestamp|value|host=web42|pool=static,Column=v,Value=0.42

這是最簡單的設計,那接下來看看,OpenTSDB是怎麼做的吧。

3.2、OpenTSDB的方案

OpenTSDB使用HBase存儲,核心的存儲,是有兩張表,tsdb和tsdb-uid

3.2.1、表tsdb

tsdb是儲存資料的,看看該表的設計

OpenTSDB介紹——基于Hbase的分布式的,可伸縮的時間序列資料庫,而Hbase本質是列存儲OpenTSDB介紹1、OpenTSDB介紹2、OpenTSDB存儲相關的概念3、OpenTSDB的設計4、OpenTSDB的總體架構

tsdb的表結構

1)RowKey的設計

RowKey其實和上面的metric|timestamp|value|host=web42|pool=static類似;

但是差別是,OpenTSDB為了節省存儲空間,将每個部分都做了映射。

在OpenTSDB裡面有這樣的映射,metric-->3位元組整數、tagk-->3位元組整數、tagv-->3位元組整數

上圖的映射關系為,proc.loadavg.1m-->052、host-->001、web42-->028、pool-->047、static-->001

2)column的設計

為了友善後期更進一步的節省空間。OpenTSDB将一個小時的資料,儲存在一行裡面。

是以上面的timestamp1234567890,會先模一下小時,得出1234566000,然後得到的餘數為1890,表示的是它是在這個小時裡面的第1890秒;

然後将1890作為column name,而0.42即為column value

3.2.2、表tsdb-uid

OpenTSDB介紹——基于Hbase的分布式的,可伸縮的時間序列資料庫,而Hbase本質是列存儲OpenTSDB介紹1、OpenTSDB介紹2、OpenTSDB存儲相關的概念3、OpenTSDB的設計4、OpenTSDB的總體架構

表tsdb-uid

這裡其實儲存的就是一些metric,tagk,tagv的一些映射關系。

4、OpenTSDB的總體架構

OpenTSDB介紹——基于Hbase的分布式的,可伸縮的時間序列資料庫,而Hbase本質是列存儲OpenTSDB介紹1、OpenTSDB介紹2、OpenTSDB存儲相關的概念3、OpenTSDB的設計4、OpenTSDB的總體架構

openTSDB架構

Servers:就是伺服器了,上面的C就是指Collector,可以了解為OpenTSDB的agent,通過Collector收集資料,推送資料;

TSD:TSD是對外通信的無狀态的伺服器,Collector可以通過TSD簡單的RPC協定推送監控資料;另外TSD還提供了一個web UI頁面供資料查詢;另外也可以通過腳本查詢監控資料,對監控資料做報警

HBase:TSD收到監控資料後,是通過AsyncHbase這個庫來将資料寫入到HBase;AsyncHbase是完全異步、非阻塞、線程安全的Hbase用戶端,使用更少的線程、鎖以及記憶體,可以提供更高的吞吐量,特别對于大量的寫操作。

Opentsdb使用

Opentsdb 指令行 查詢:     scan 1427817599 1456675199000 avg easypec.order.ordercostweek type=week

删除:     scan --delete 1427817599 1456675199000 avg easypec.order.ordercostweek type=week 具體參考文檔: http://opentsdb.net/docs/build/html/user_guide/cli/scan.html 導入  scan --import

Opentsdb HTTP API 

查詢 (POST請求) 請求位址: http://10.248.27.43:4242/api/query {     "start": 1427817599,     "queries": [{         "aggregator": "avg",         "metric": "easypec.order.ordercostweek",         "tags": {             "type": "week"         }     }],     "msResolution": "true",     "showTSUIDs": "true" } 查詢最新的記錄(POST請求):

    請求位址: http://10.248.27.5:4242/api/query/last {     "queries": [         {"tags":{             "host":"localhost"            },             "metric": "easypec.order.ordercosttotal"         }     ],     "resolveNames":true,     "backScan":1000 }

1. 關于metric, tag name和tag value

    1) opentsdb的每個時間序列必須有一個metric和一個或多個(tag name, tag value)對,每個時間序列每小時的資料儲存為一行。

    2) Opentsdb的metric, tag name和tag value各自的UID數量上限為2^24個,該值可以通過改變源代碼重新編譯後進行修改,最多可以擴充到8位元組,即2^64個。不建議修改。

    3) tag name和tag value的UID配置設定是完全獨立的,例如,如果tag value的取值為整數2,那麼這個值完全可以被多個tag name所使用,例如cpu=2, interface=2, hdd=2等。

    4) 在設計系統時應該確定metric, tag name和tag value的可能取值在較小的範圍内,因為它們的數量影響到查詢速度。

    5) 注意事項:

           a. 減少它們的數量。

           b. 為每個metric使用同類的tag name

           c. 考慮系統常用的查詢方式,選擇合适的時間序列metric和tag

           d. 每個metric的tag數量維持在5個以内,最多不超過8個。

    6) 存儲時間序列資料的時候,每個資料點要包含以下内容:metric,至少一對tag,時間戳(自1970年起的秒或毫秒),一個數值(整數或浮點數)。

    7) 時間戳:一定是整數,且不超過13位。如果是13位表示毫秒,10位則表示秒。在一個序列中應該采用同樣機關的時間戳(都是秒或者都是毫秒),混合不同機關的時間戳會引起查詢緩慢,如無必要,應該用秒為機關,降低存儲空間的消耗。

    8) metric和tag的命名規則:大小寫敏感,不允許空格,隻允許以下字元:字母,數字,減号,下劃線,點号,斜杠(/),長度不限,但是盡量短一些。

2. 資料點:

      1) 隻能由數字和小數點組成,如果沒有小數點,則認為是整數,否則認為是浮點數。整數使用可變長度編碼方式,最少1位元組,最多8位元組。浮點數為4位元組單精度浮點數。由于浮點數是單精度類型,是以不支援需要精确值得浮點數,例如15.2會被儲存為15.199999809265137

      2) 寫入資料時不必按照時間順序寫入,時間戳在後的資料可以先寫入,再寫入時間戳在前的資料。

      3) 資料重複寫入的問題:

            a. 在同一小時内多次寫入相同的資料不會有問題。

            b. 如果設定和compaction操作,那麼如果前後兩次寫入的資料類型不同,則在查詢時一定會抛出異常。如果兩次寫入的資料類型相同,那麼在該行還沒有進行compaction操作之前,前面的資料将被覆寫掉。

       4) 資料寫入方式:

              資料有三種寫入方式:telnet, http post,用資料檔案批量導入。

3. HBase的組建方式:

        1) 測試或容量較低時可以采用單機模式,這時HBase使用本地檔案系統作為存儲。              

        2) 大資料量的生産環境應該采用正式的多機叢集模式:Namenode雙機備份,3台Zookeeper,HDFS節點采用JBOD存儲,HBase的Region節點和HDFS資料節點共用。

            各個節點之間采用千兆或萬兆網絡連接配接,叢集位于一個資料中心。

4. 性能考慮:

       1) 每個TSD程序的處理能力大約為每秒幾千次寫,可以使用多個TSD程序實作更高寫入能力,前端采用DNS輪詢或Varnish緩存實作負載均衡。當叢集專用于opentsdb時,TSD程序可以和HBase的Region server位于同一台機器。

       2) 可以将TSD程序配置為持久連接配接,這就可以阻止每次寫入資料都經曆建立和關閉連接配接的過程。

       3) 關閉中繼資料和實時釋出功能,因為它們極大地影響到系統性能。

繼續閱讀