時序列數(shù)據(jù)庫武斗大會之 OpenTSDB 篇

【編者按】 劉斌OneAPM后端研發(fā)工程師矾芙,擁有10多年編程經(jīng)驗舍沙,參與過大型金融、通信以及Android手機操作系的開發(fā)剔宪,熟悉Linux及后臺開發(fā)技術拂铡。曾參與翻譯過《第一本Docker書》、《GitHub入門與實踐》葱绒、《Web應用安全權威指南》和媳、《WEB+DB PRESS》、《Software Design》等書籍哈街,也是Docker入門與實踐課程主講人留瞳。本文所闡述的「時間序列數(shù)據(jù)庫」,系筆者所負責產(chǎn)品 Cloud Insight性能指標進行聚合骚秦、分組她倘、過濾過程中的梳理和總結。

什么是 OpenTSDB

OpenTSDB 作箍,可以認為是一個時系列數(shù)據(jù)(庫)硬梁,它基于HBase存儲數(shù)據(jù),充分發(fā)揮了HBase的分布式列存儲特性胞得,支持數(shù)百萬每秒的讀寫荧止,它的特點就是容易擴展,靈活的tag機制阶剑。

架構簡介

這里我們簡單看一下它的架構跃巡,如下圖所示:

時序列數(shù)據(jù)庫武斗大會之 OpenTSDB 篇

其最主要的部件就是TSD了,這是接收數(shù)據(jù)并存儲到HBase處理的核心所在牧愁。而帶有C(collector)標志的Server素邪,則是數(shù)據(jù)采集源,將數(shù)據(jù)發(fā)給 TSD服務猪半。

安裝 OpenTSDB

為了安裝 OpenTSDB 兔朦,都需要以下條件和軟件:

  • Linux操作系統(tǒng)

  • JRE 1.6 or later

  • HBase 0.92 or later

  • 安裝GnuPlot

如果你還想使用自帶的界面偷线,則需要安裝GnuPlot 4.2及以后版本,以及gd和gd-devel等沽甥。這里我們選擇了GnuPlot 5.0.1的版本声邦。

根據(jù)情況執(zhí)行(沒有就裝),安裝所需軟件

$ sudo yum install -y gd gd-devel libpng libpng-devel

之后安裝GnuPlot:

$ tar zxvf gnuplot-5.0.1.tar.gz$ cd gnuplot-5.0.1$ ./configure$ make$ sudo make install

安裝HBase

首先摆舟,確保設置了JAVA_HOME:

$ echo $JAVA_HOME/usr

這個不多說了翔忽,非常簡單,只需要按照 https://hbase.apache.org/book.html#quickstart 這里所說盏檐,下載歇式、解壓、修改配置文件胡野、啟動即可材失。

這時候氛琢,再設置HBASE_HOME:

$ echo $HBASE_HOME/opt/hbase-1.0.1.1

之后便可啟動hbase:

$ /opt/hbase-1.0.1.1/bin/start-hbase.sh
starting master, logging to /opt/hbase-1.0.1.1/logs/hbase-vagrant-master-localhost.localdomain.out

安裝 OpenTSDB

這個也很簡單琐驴,如果build失敗,那肯定是缺少Make或者Autotools等東西带到,用包管理器安裝即可熊响。

$ git clone git://github.com/OpenTSDB/opentsdb.git$ cd opentsdb$ ./build.sh

創(chuàng)建表OpenTSDB所需要的表結構:

$ env COMPRESSION=NONE ./src/create_table.sh2016-01-08 06:17:58,045 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
HBase Shell; enter ‘help‘ for list of supported commands.
Type “exit” to leave the HBase Shell
Version 1.0.1.1, re1dbf4df30d214fca14908df71d038081577ea46, Sun May 17 12:34:26 PDT 2015create ‘tsdb-uid’,
{NAME => ‘id’, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’},
{NAME => ‘name’, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}0 row(s) in 1.3180 secondsHbase::Table – tsdb-uidcreate ‘tsdb’,
{NAME => ‘t’, VERSIONS => 1, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}0 row(s) in 0.2400 secondsHbase::Table – tsdbcreate ‘tsdb-tree’,
{NAME => ‘t’, VERSIONS => 1, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}0 row(s) in 0.2160 secondsHbase::Table – tsdb-treecreate ‘tsdb-meta’,
{NAME => ‘name’, COMPRESSION => ‘NONE’, BLOOMFILTER => ‘ROW’}0 row(s) in 0.4480 secondsHbase::Table – tsdb-meta

在habse shell里旨别,可以看到表已經(jīng)創(chuàng)建成功。

> listTABLE
tsdb
tsdb-metatsdb-treetsdb-uid4 row(s) in 0.0160 seconds

表創(chuàng)建之后汗茄,即可啟動tsd服務秸弛,只需要運行如下命令:

$ build/tsdb tsd

如果看到輸出:

2016-01-09 05:51:10,875 INFO [main] TSDMain: Ready to serve on /0.0.0.0:4242

即可認為啟動成功。

保存數(shù)據(jù)到OpenTSDB.

在安裝并啟動所有服務之后洪碳,我們就來嘗試發(fā)送1條數(shù)據(jù)吧递览。

最簡單的保存數(shù)據(jù)方式就是使用telnet。

$ telnet localhost 4242put sys.cpu.user 1436333416 23 host=web01 user=10001

這時瞳腌,從 OpenTSDB 自帶界面都可以看到這些數(shù)據(jù)绞铃。 由于sys.cpu.sys的數(shù)據(jù)只有一條,所以 OpenTSDB 只能看到一個點嫂侍。

下圖為 OpenTSDB 自帶的查詢界面儿捧,訪問http://localhost:4242即可。

時序列數(shù)據(jù)庫武斗大會之 OpenTSDB 篇

OpenTSDB中的數(shù)據(jù)存儲結構

我們來看看 OpenTSDB 的重要概念uid挑宠,先從HBase中存儲的數(shù)據(jù)開始吧菲盾,我們來看一下它都有哪些表,以及這些表都是干什么的痹栖。

tsdb:存儲數(shù)據(jù)點

hbase(main):003:0> scan 'tsdb'
ROW                           COLUMN+CELL  

 \x00\x00\x01U\x9C\xAEP\x00\x column=t:q\x80,timestamp=1436350142588, value=\x17   
 
 00\x01\x00\x00\x01\x00\x00\x   
 
 02\x00\x00\x02  
 
1 row(s) in 0.2800 seconds

可以看出亿汞,該表只有一條數(shù)據(jù)瞭空,我們先不管rowid揪阿,只來看看列疗我,只有一列,值為0x17南捂,即十進制23吴裤,即該metric的值。

左面的row key則是 OpenTSDB 的特點之一溺健,其規(guī)則為:

metric + timestamp + tagk1 + tagv1… + tagkN + tagvN

以上屬性值均為對應名稱的uid麦牺。

我們上面添加的metric為:

sys.cpu.user 1436333416 23 host=web01 user=10001

一共涉及到5個uid,即名為sys.cpu.user的metric鞭缭,以及host和user兩個tagk及其值web01和10001剖膳。

上面數(shù)據(jù)的row key為:

\x00\x00\x01U\x9C\xAEP\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02

具體這個row key是怎么算出來的,我們來看看tsdb-uid表岭辣。

tsdb-uid:存儲name和uid的映射關系

下面tsdb-uid表的數(shù)據(jù)吱晒,各行之間人為加了空行,為方便顯示沦童。

tsdb-uid用來保存名字和UID(metric仑濒,tagk,tagv)之間互相映射的關系偷遗,都是成組出現(xiàn)的墩瞳,即給定一個name和uid,會保存(name,uid)和(uid,name)兩條記錄氏豌。

時序列數(shù)據(jù)庫武斗大會之 OpenTSDB 篇

我們一共看到了8行數(shù)據(jù)喉酌。

前面我們在tsdb表中已經(jīng)看到,metric數(shù)據(jù)的row key為\x00\x00\x01U\x9C\xAEP\x00\x00\x01\x00\x00\x01\x00\x00\x02\x00\x00\x02 泵喘,我們將其分解下瞭吃,用+號連起來(從name到uid的映射為最后5行):

 \x00\x00\x01 + U + \x9C\xAE + P + \x00\x00\x01 + \x00\x00\x01 + \x00\x00\x02  + \x00\x00\x02
sys.cpu.user       1436333416           host    =      web01          user     =    10001

可以看出,這和我們前面說到的row key的構成方式是吻合的涣旨。

需要著重說明的是時間戳的存儲方式歪架。
雖然我們指定的時間是以秒為單位的,但是霹陡,row key中用到的卻是以一小時為單位的和蚪,即:1436333416 – 1436333416 % 3600 = 1436331600

1436331600轉換為16進制烹棉,即0x55 0x9c 0xae 0x50攒霹,而0x55即大寫字母U,0x50為大寫字母P浆洗,這就是4個字節(jié)的時間戳存儲方式催束。相信下面這張圖能幫助各位更好理解這個意思,即一小時只有一個row key伏社,每秒鐘的數(shù)據(jù)都會存為一列抠刺,大大提高查詢的速度塔淤。

時序列數(shù)據(jù)庫武斗大會之 OpenTSDB 篇

反過來,從uid到name也一樣速妖,比如找uid為\x00\x00\x02的tagk高蜂,我們從上面結果可以看到,該row key(\x00\x00\x02)有4列罕容,而column=name:tagk的value就是user备恤,非常簡單直觀。

重要:我們看到锦秒,上面的metric也好露泊,tagk或者tagv也好,uid只有3個字節(jié)旅择,這是 OpenTSDB 的默認配置滤淳,三個字節(jié),應該能表示1600多萬的不同數(shù)據(jù)砌左,這對metric名或者tagk來說足夠長了脖咐,對tagv來說就不一定了,比如tagv是ip地址的話汇歹,或者電話號碼屁擅,那么這個字段就不夠長了,這時可以通過修改源代碼來重新編譯 OpenTSDB 就可以了产弹,同時要注意的是派歌,重編以后,老數(shù)據(jù)就不能直接使用了痰哨,需要導出后重新導入胶果。

tsdb-meta:元數(shù)據(jù)表

我們再看下第三個表tsdb-meta,這是用來存儲時間序列索引和元數(shù)據(jù)的表斤斧。這也是一個可選特性早抠,默認是不開啟的,可以通過配置文件來啟用該特性撬讽,這里不做特殊介紹了蕊连。

時序列數(shù)據(jù)庫武斗大會之 OpenTSDB 篇

tsdb-tree:樹形表

第4個表是tsdb-tree,用來以樹狀層次關系來表示metric的結構游昼,只有在配置文件開啟該特性后甘苍,才會使用此表,這里我們不介紹了烘豌,可以自己嘗試载庭。

通過HTTP接口保存數(shù)據(jù)

保存數(shù)據(jù)除了我們前面用到的telnet方式,也可以選擇HTTP API或者批量導入工具

import( http://opentsdb.net/docs/build/html/user_guide/cli/import.html )

這里我們再對HTTP API進行簡單示例說明。

假設我們有如下數(shù)據(jù)囚聚,保存為文件mysql.json:

[
    {
        "metric": "mysql.innodb.row_lock_time",
        "timestamp": 1435716527,
        "value": 1234,
        "tags": {
           "host": "web01",
           "dc": "beijing"        }    },
    {
        "metric": "mysql.innodb.row_lock_time",
        "timestamp": 1435716529,
        "value": 2345,
        "tags": {
           "host": "web01",
           "dc": "beijing"        }    },
    {
        "metric": "mysql.innodb.row_lock_time",
        "timestamp": 1435716627,
        "value": 3456,
        "tags": {
           "host": "web02",
           "dc": "beijing"        }    },
    {
        "metric": "mysql.innodb.row_lock_time",
        "timestamp": 1435716727,
        "value": 6789,
        "tags": {
           "host": "web01",
           "dc": "tianjin"        }    }
]

之后執(zhí)行如下命令:

$ curl -X POST -H “Content-Type: application/json” http://localhost:4242/api/put -d @mysql.json

即可將數(shù)據(jù)保存到 OpenTSDB 了靖榕。

查詢數(shù)據(jù)

看完了如何保存數(shù)據(jù),我們再來看看如何查詢數(shù)據(jù)靡挥。

查詢數(shù)據(jù)可以使用query接口序矩,它既可以使用get的query string方式鸯绿,也可以使用post方式以JSON格式指定查詢條件跋破,這里我們以后者為例,對剛才保存的數(shù)據(jù)進行說明瓶蝴。

首先毒返,保存如下內(nèi)容為search.json:

{
    "start": 1435716527,
    "queries": [
        {
            "metric": "mysql.innodb.row_lock_time",
            "aggregator": "avg",
            "tags": {
                "host": "*",
                "dc": "beijing"            }        }
    ]}

執(zhí)行如下命令進行查詢:

$ curl -s -X POST -H "Content-Type: application/json" http://localhost:4242/api/query -d @search.json | jq .
[
  {    "metric": "mysql.innodb.row_lock_time",    "tags": {      "host": "web01",      "dc": "beijing"
    },    "aggregateTags": [],    "dps": {      "1435716527": 1234,      "1435716529": 2345
    }
  },
  {    "metric": "mysql.innodb.row_lock_time",    "tags": {      "host": "web02",      "dc": "beijing"
    },    "aggregateTags": [],    "dps": {      "1435716627": 3456
    }
  }
]

可以看出,我們保存了dc=tianjin的數(shù)據(jù)舷手,但是并沒有在此查詢中返回拧簸,這是因為,我們指定了dc=beijing這一條件男窟。

值得注意的是盆赤,tags參數(shù)在新版本2.2中,將不被推薦歉眷,取而代之的是filters參數(shù)牺六。

總結

可以看出來, OpenTSDB 還是非常容易上手的汗捡,尤其是單機版淑际,安裝也很簡單。有HBase作為后盾扇住,查詢起來也非炒郝疲快,很多大公司艘蹋,類似雅虎等锄贼,也都在用此軟件。

但是女阀,大規(guī)模用起來咱娶,多個TDB以及多存儲節(jié)點等,應該都需要專業(yè)强品、細心的運維工作了膘侮。

相關閱讀

這是本系列文章的其他部分:

Cloud Insight 集監(jiān)控、管理的榛、計算琼了、協(xié)作、可視化于一身,幫助所有 IT 公司雕薪,減少在系統(tǒng)監(jiān)控上的人力和時間成本投入昧诱,讓運維工作更加高效、簡單所袁。

本文轉自 OneAPM 官方博客

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盏档,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子燥爷,更是在濱河造成了極大的恐慌蜈亩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前翎,死亡現(xiàn)場離奇詭異稚配,居然都是意外死亡,警方通過查閱死者的電腦和手機港华,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門道川,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人立宜,你說我怎么就攤上這事冒萄。” “怎么了橙数?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵尊流,是天一觀的道長。 經(jīng)常有香客問我商模,道長奠旺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任施流,我火速辦了婚禮响疚,結果婚禮上,老公的妹妹穿的比我還像新娘瞪醋。我一直安慰自己忿晕,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布银受。 她就那樣靜靜地躺著践盼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宾巍。 梳的紋絲不亂的頭發(fā)上咕幻,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音顶霞,去河邊找鬼肄程。 笑死锣吼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蓝厌。 我是一名探鬼主播玄叠,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拓提!你這毒婦竟也來了读恃?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤代态,失蹤者是張志新(化名)和其女友劉穎寺惫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胆数,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡肌蜻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年互墓,在試婚紗的時候發(fā)現(xiàn)自己被綠了必尼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡篡撵,死狀恐怖判莉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情育谬,我是刑警寧澤券盅,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站膛檀,受9級特大地震影響锰镀,放射性物質發(fā)生泄漏。R本人自食惡果不足惜咖刃,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一泳炉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嚎杨,春花似錦花鹅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箩帚,卻和暖如春真友,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紧帕。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工盔然, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓轻纪,卻偏偏與公主長得像油额,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刻帚,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容