All Things OpenTSDB
1. OpenTSDB介紹
OpenTSDB用HBase存儲所有的時序(無須采樣)來構建一個分布式、可伸縮的時間序列數據庫。它支持秒級數據采集所有metrics,支持永久存儲,可以做容量規劃,并很容易的接入到現有的報警系統里。OpenTSDB可以從大規模的集群(包括集群中的網絡設備、操作系統、應用程序)中獲取相應的metrics并進行存儲、索引以及服務,從而使得這些數據更容易讓人理解,如web化、圖形化等。
對于運維工程師而言,OpenTSDB可以獲取基礎設施和服務的實時狀態信息,展示集群的各種軟硬件錯誤,性能變化以及性能瓶頸。對于管理者而言,OpenTSDB可以衡量系統的SLA,理解復雜系統間的相互作用,展示資源消耗情況。集群的整體作業情況,可以用以輔助預算和集群資源協調。對于開發者而言,OpenTSDB可以展示集群的主要性能瓶頸,經常出現的錯誤,從而可以著力重點解決重要問題。
OpenTSDB使用LGPLv2.1+開源協議,目前版本為2.X。
- 官網地址:http://opentsdb.net/
- 源代碼:https://github.com/OpenTSDB/opentsdb/
2. 安裝OpenTSDB
## 2.1 依賴 OpenTSDB依賴jdk和Gnuplot,Gnuplot需要提前安裝,版本要求為最小4.2,最大4.4,執行以下命令安裝即可:
yum install?gnuplot?autoconf apt-get install gnuplotOpenTSDB是用java編寫的,但是項目構建不是用的java的方式而是使用的C、C++程序員構建項目的方式。運行時依賴:
- JDK 1.6
- asynchbase?1.3.0 (BSD)
- Guava?12.0 (ASLv2)
- logback?1.0 (LGPLv2.1 / EPL)
- Netty?3.4 (ASLv2)
- SLF4J?1.6 (MIT) with Log4J and JCL adapters
- suasync?1.2 (BSD)
- ZooKeeper?3.3 (ASLv2)
可選的編譯時依賴:
- GWT?2.4 (ASLv2)
可選的單元測試依賴:
- Javassist?3.15 (MPL / LGPL)
- JUnit?4.10 (CPL)
- Mockito?1.9 (MIT)
- PowerMock?1.4 (ASLv2)
2.2 下載并編譯源代碼
首先安裝必要依賴:
yum install gnuplot automake autoconf git -y下載源代碼,可以指定最新版本或者手動checkout
git clone git://github.com/OpenTSDB/opentsdb.git cd opentsdb ./build.sh2.3 安裝
- 首先安裝一個單節點或者多節點集群的hbase環境,hbase版本要求為0.94
- 設置環境變量并創建opentsdb使用的表,需要設置的環境變量為COMPRESSION和HBASE_HOME,前者設置是否啟用壓縮,或者設置hbase home目錄。如果使用壓縮,則還需要安裝lzo
- 執行建表語句src/create_table.sh
- 啟動TSD
如果你使用的是hbase集群,則你還需要設置--zkquorum,--cachedir對應的目錄會產生一些臨時文件,你可以設置cron定時任務進行刪除。添加--auto-metric,則當新的數據被搜集時自動創建指標。
你可以將這些參數編寫到配置文件中,然后通過--config指定該文件所在路徑。
- 啟動成功之后,你可以通過127.0.0.1:4242進行訪問。
從源代碼安裝gnuplot、autoconf、opentsdb以及tcollector,可以參考:OpenTSDB & tcollector 安裝部署(Installation and Deployment)
3. 使用向導
3.1 配置
OpenTSDB的配置參數可以在命令行指定,也可以在配置文件中指定。配置文件使用的是java的properties文件,文件中key為小寫,支持逗號連接字符串但是不能有空格。所有的OpenTSDB屬性都以tsdb開頭,例如:
# List of Zookeeper hosts that manage the HBase cluster tsd.storage.hbase.zk_quorum = 192.168.1.100配置參數優先級:
命令行參數 > 配置文件 > 默認值
你可以在命令行中通過--config指定配置文件所在路徑,如果沒有指定,OpenTSDB會從以下路徑尋找配置文件:
- ./opentsdb.conf
- /etc/opentsdb.conf
- /etc/opentsdb/opentsdb.conf
- /opt/opentsdb/opentsdb.conf
如果一個合法的配置文件沒有找到并且一些必須參數沒有設置,TSD進程將不會啟動。
配置文件中可配置的屬性請參考:Properties
3.2 基本概念
在深入理解OpenTSDB之前,需要了解一些基本概念。
-
Cardinality。基數,在數學中定義為一個集合中的一些元素,在數據庫中定義為一個索引的一些唯一元素,在OpenTSDB定義為:
- 一個給定指標的一些唯一時間序列
- 和一個標簽名稱相關聯的一些唯一標簽值
在OpenTSDB中擁有高基數的指標在查詢過程中返回的值要多于低基數的指標,這樣花費的時間也就越多。
Compaction。在OpenTSDB中,會將多列合并到一列之中以減少磁盤占用空間,這和hbase中的Compaction不一樣。這個過程會在TSD寫數據或者查詢過程中不定期的發生。
Data Point。每一個指標可以被記錄為某一個時間點的一個數值。Data Point包括以下部分:
- 一個指標:metric
- 一個數值
- 這個數值被記錄的時間戳
- 多個標簽
Metric。一個可測量的單位的標稱。metric不包括一個數值或一個時間,其僅僅是一個標簽,包含數值和時間的叫datapoints,metric是用逗號連接的不允許有空格,例如:
- hours.worked
- webserver.downloads
- accumulation.snow
Tags。一個metric應該描述什么東西被測量,在OpenTSDB中,其不應該定義的太簡單。通常,更好的做法是用Tags來描述具有相同維度的metric。Tags由tagk和tagv組成,前者表示一個分組,后者表示一個特定的項。
Time Series。一個metric的帶有多個tag的data point集合。
Timestamp。一個絕對時間,用來描述一個數值或者一個給定的metric是在什么時候定義的。
Value。一個Value表示一個metric的實際數值。
UID。在OpenTSDB中,每一個metric、tagk或者tagv在創建的時候被分配一個唯一標識叫做UID,他們組合在一起可以創建一個序列的UID或者TSUID。在OpenTSDB的存儲中,對于每一個metric、tagk或者tagv都存在從0開始的計數器,每來一個新的metric、tagk或者tagv,對應的計數器就會加1。當data point寫到TSD時,UID是自動分配的。你也可以手動分配UID,前提是auto metric被設置為true。默認地,UID被編碼為3Bytes,每一種UID類型最多可以有16,777,215個UID。你也可以修改源代碼改為4Bytes。UID的展示有幾種方式,最常見的方式是通過http api訪問時,3 bytes的UID被編碼為16進制的字符串。例如,UID為1的寫為二進制的形式為000000000000000000000001,最為一個無符號的byte數組,其可以表示為[0,0,1],編碼為16進制字符串為000001,其中每一位左邊都被補上0,如果其不足兩位。故,UID為255的會顯示為[0,0,255]和0000FF。
關于為什么使用UID而不使用hashes,可以參考:why-uids
TSUID。當一個data point被寫到OpenTSDB時,其row key格式為:<metric_UID><timestamp><tagk1_UID><tagv1_UID>[...<tagkN_UID><tagvN_UID>],不考慮時間戳的話,將其余部分都轉換為UID,然后拼在一起,就可以組成為TSUID。
Metadata。主要用于記錄data point的一些附加的信息,方便搜索和跟蹤,分為UIDMeta和TSMeta。
每一個UID都有一個metadata記錄保存在tsdb-uid表中,每一個UID包括一些不可變的字段,如uid、type、name和created字段表示什么時候被創建,還可以有一些額外字段,如description、notes、displayName和一些custom?key/value對,詳細信息,可以查看?/api/uid/uidmeta
同樣,每一個TSUID可以對應一個TSMeta,記錄在tsdb-uid中,其包括的字段有tsuid、metric、tags、lastReceived和created,可選的字段有description,?notes,詳細信息,可以查看/api/uid/tsmeta
開啟Metadata有以下幾個參數:
- tsd.core.meta.enable_realtime_uid
- tsd.core.meta.enable_tsuid_tracking
- tsd.core.meta.enable_tsuid_incrementing
- tsd.core.meta.enable_realtime_ts
metadata的另外一個形式是Annotations,詳細說明,請參考annotations
Tree
3.3 數據存儲方式
OpenTSDB使用HBase作為后端存儲,在安裝OpenTSDB之前,需要先啟動一個hbase節點或者集群,然后再執行建表語句src/create_table.sh創建hbase表。建表語句如下:
create '$UID_TABLE',{NAME => 'id', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'},{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}create '$TSDB_TABLE',{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}create '$TREE_TABLE',{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}create '$META_TABLE',{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}從上面可以看出一共創建了4張表,并且可以設置是否壓縮、是否啟用布隆過濾、保存版本號等等,如果追求hbase讀寫性能,還可以預建分區。
3.3.1 Data Table Schema
在OpenTSDB中,所有數據存儲在一張叫做tsdb的表中,這是為了充分利用hbase有序和region分布式的特點。所有的值都保存在列族t中。
rowkey為<metric_uid><timestamp><tagk1><tagv1>[...<tagkN><tagvN>],UID默認編碼為3 Bytes,而時間戳會編碼為4 Bytes
OpenTSDB的tsdb啟動之后,會監控指定的socket端口(默認為4242),接收到監控數據,包括指標、時間戳、數據、tag標簽,tag標簽包括tag名稱ID和tag值ID。例如:
myservice.latency.avg 1292148123 42 reqtype=foo host=web42對于指標myservice.latency.avg的ID為:[0, 0, -69],reqtype標簽名稱的ID為:[0, 0, 1], foo標簽值的ID為:[0, 1, 11], 標簽名稱的ID為:[0, 0, 2] web42標簽值的ID為:[0, -7, 42],他們組成rowkey:
[0, 0, -69, 77, 4, -99, 32, 0, 0, 1, 0, 1, 11, 0, 0, 2, 0, -7, 42]`-------' `------------' `-----' `------' `-----' `-------'metric ID base timestamp name ID value ID name ID value ID`---------------' `---------------'first tag second tagrow表示格式為: 每個數字對應1 byte
- [0, 0, -69] metric ID
- [77, 4, -99, 32] base timestamp = 1292148000. timestamps in the row key are rounded down to a 60 minute boundary。也就是說對于同一個小時的metric + tags相同的數據都會存放在一個row下面
- [0, 0, 1] “reqtype” index
- [0, 1, 11] “foo” index
- [0, 0, 2] “host” index
- [0, -7, 42] “web42” index
NOTE:可以看到,對于metric + tags相同的數據都會連續存放,且metic相同的數據也會連續存放,這樣對于scan以及做aggregation都非常有幫助
column qualifier?占用2 bytes或者4 bytes,占用2 bytes時表示以秒為單位的偏移,格式為:
- 12 bits:相對row表示的小時的delta, 最多2^ 12 = 4096 > 3600因此沒有問題
- 4 bits:format flags
- 1 bit: an integer or floating point
- 3 bits: 標明數據的長度,其長度必須是1、2、4、8。000表示1個byte,010表示2byte,011表示4byte,100表示8byte
占用4 bytes時表示以毫秒為單位的偏移,格式為:
- 4 bits:十六進制的1或者F
- 22 bits:毫秒偏移
- 2 bit:保留
- 4 bits: format flags
- 1 bit: an integer or floating point,0表示整數,1表示浮點數
- 3 bits: 標明數據的長度,其長度必須是1、2、4、8。000表示1個byte,010表示2byte,011表示4byte,100表示8byte
舉例:
對于時間戳為1292148123的數據點來說,其轉換為以小時為單位的基準時間(去掉小時后的秒)為129214800,偏移為123,轉換為二進制為1111011,因為該值為整數且長度為8位(對應為2byte,故最后3bit為100),故其對應的列族名為:0000011110110100,將其轉換為十六進制為07B4
value?使用8bytes存儲,既可以存儲long,也可以存儲double。
總結一下,tsdb表結構如下:
3.3.2 UID Table Schema
一個單獨的較小的表叫做tsdb-uid用來存儲UID映射,包括正向的和反向的。存在兩列族,一列族叫做name用來將一個UID映射到一個字符串,另一個列族叫做id,用來將字符串映射到UID。列族的每一行都至少有以下三列中的一個:
- metrics?將metric的名稱映射到UID
- tagk?將tag名稱映射到UID
- tagv?將tag的值映射到UID
如果配置了metadata,則name列族還可以包括額外的metatata列。
- id 列族
Row Key?- 將會是一個分配到UID的字符串,例如,對于一個指標可能有一個值為sys.cpu.user或者對于一個標簽其值可能為42
Column Qualifiers?- 上面三種列類型中一種。
Column Value?- 一個無符號的整數,默認被編碼為3個byte,其值為UID。
例如以下幾行數據是從tsdb-uid表中查詢出來的數據,第一個列為row key,第二列為”列族:列名”,第三列為值,對應為UID
proc.stat.cpu id:metrics \x00\x00\x01 host id:tagk \x00\x00\x01 cdh1 id:tagv \x00\x00\x01- name 列族
Row Key?- 為UID
Column Qualifiers?- 上面三種列類型中一種或者為metrics_meta、tagk_meta、tagv_meta
Column Value?- 與UID對應的字符串,對于一個*_meta列,其值將會是一個UTF-8編碼的JSON格式字符串。不要在OpenTSDB外部去修改該值,其中的字段順序會影響CAS調用。
例如,以下幾行數據是從tsdb-uid表中查詢出來的數據,第一個列為row key,第二列為”列族:列名”,第三列為值,對應為UID
\x00\x00\x01 name:metrics proc.stat.cpu \x00\x00\x01 name:tagk host \x00\x00\x01 name:tagv cdh1 \x00\x00\x01 name:tagk_meta {"uid":"000001","type":"TAGK","name":"host","description":"","notes":"","created":1395213193,"custom":null,"displayName":""} \x00\x00\x01 name:tagv_meta {"uid":"000001","type":"TAGV","name":"cdh1","description":"","notes":"","created":1395213193,"custom":null,"displayName":""} \x00\x00\x01 name:metric_meta {"uid":"000001","type":"METRIC","name":"metrics proc.stat.cpu","description":"","notes":"","created":1395213193,"custom":null,"displayName":""}總結一下,tsdb-uid表結構如下:
上圖對應的一個datapoint如下:
proc.stat.cpu 1292148123 80 host=cdh1從上圖可以看出tsdb-uid的表結構以及數據存儲方式,對于一個data point來說,其被保存到opentsdb之前,會對metrics、tagk、tagv、metric_meta、tagk_meta、tagv_meta生成一個UID(如上圖中的000001),然后將其插入hbase表中,rowkey為UID,同時會存儲多行記錄,分別保存metrics、tagk、tagv、metric_meta、tagk_meta、tagv_meta到UID的映射。
3.3.3 Meta Table Schema
這個表是OpenTSDB中不同時間序列的一個索引,可以用來存儲一些額外的信息。這個表名稱叫做tsdb-meta,該表只有一個列族name,兩個列,分別為ts_meta、ts_ctr,該表中數據如下:
\x00\x00\x01\x00\x00\x01\x00\x00\x01 name:ts_ctr \x00\x00\x00\x00\x00\x00\x00p \x00\x00\x01\x00\x00\x01\x00\x00\x01 name:ts_meta {"tsuid":"000001000001000001","displayName":"","description":"","notes":"","created":1395213196,"custom":null,"units":"","dataType":"","retention":0,"max":"NaN","min":"NaN"}\x00\x00\x02\x00\x00\x01\x00\x00\x01 name:ts_ctr \x00\x00\x00\x00\x00\x00\x00p \x00\x00\x02\x00\x00\x01\x00\x00\x01 name:ts_meta {"tsuid":"000002000001000001","displayName":"","description":"","notes":"","created":1395213196,"custom":null,"units":"","dataType":"","retention":0,"max":"NaN","min":"NaN"}Row Key?和tsdb表一樣,其中不包含時間戳,<metric_uid><tagk1><tagv1>[...<tagkN><tagvN>]
TSMeta Column?和UIDMeta相似,其為UTF-8編碼的JSON格式字符串
ts_ctr Column?計數器,用來記錄一個時間序列中存儲的數據個數,其列名為ts_ctr,為8位有符號的整數。
3.3.4 Tree Table Schema
索引表,用于展示樹狀結構的,類似于文件系統,以方便其他系統使用,例如:Graphite
3.4 如何寫數據
## 3.5 如何查詢數據 ## 3.6 CLI Tools
tsdb支持以下參數:
[root@cdh1 build]# ./tsdb usage: tsdb <command> [args] Valid commands: fsck, import, mkmetric, query, tsd, scan, uid通過以下命令創建指標:
./tsdb mkmetric mysql.bytes_received mysql.bytes_sent執行上述命令的結果如下:
metrics mysql.bytes_received: [0, 0, -93] metrics mysql.bytes_sent: [0, 0, -92]3.11 Utilities
## 3.12 Logging
4. HTTP API
# 5. 誰在用OpenTSDB
- StumbleUpon?StumbleUpon is the easiest way to find cool new websites, videos, photos and images from across the Web
- box?Box simplifies online file storage, replaces FTP and connects teams in online workspaces.
- tumblr?一個輕量級博客,用戶可以跟進其他的會員并在自己的頁面上看到跟進會員發表的文章,還可以轉發他人在Tumblr上的文章
6. KairosDB
KairosDB是一個快速可靠的分布式時間序列數據庫,主要用于Cassandra當然也可以適用與HBase。KairosDB是在OpenTSDB基礎上重寫的,他不僅可以在HBase上存儲數據還支持Cassandra。
KairosDB主頁:https://code.google.com/p/kairosdb/
總結
以上是生活随笔為你收集整理的All Things OpenTSDB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: System.Net.WebExcept
- 下一篇: mysql语句:索引,游标,存储过程,视