OpenTSDB安裝,配置,資料存放區介紹_openTSDB
最後更新:2018-08-21
來源:互聯網
上載者:User
1.什麼是OpenTSDB
2.OpenTSDB是用什麼語言編寫和構建的。
3.如何安裝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 gnuplot 複製代碼
OpenTSDB是用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.sh 複製代碼
2.3 安裝 1. 首先安裝一個單節點或者多節點叢集的hbase環境,hbase版本要求為0.94 2. 設定環境變數並建立opentsdb使用的表,需要設定的環境變數為COMPRESSION和HBASE_HOME,前者設定是否啟用壓縮,或者設定hbase home目錄。如果使用壓縮,則還需要安裝lzo 3. 執行建表語句src/create_table.sh 4. 啟動TSD
tsdtmp=${TMPDIR-'/tmp'}/tsd # For best performance, make sure
mkdir -p "$tsdtmp" # your temporary directory uses tmpfs
./build/tsdb tsd --port=4242 --staticroot=build/staticroot --cachedir="$tsdtmp" --auto-metric 複製代碼
如果你使用的是hbase叢集,則你還需要設定--zkquorum,--cachedir對應的目錄會產生一些臨時檔案,你可以設定cron定時任務進行刪除。添加--auto-metric,則當新的資料被搜集時自動建立指標。 你可以將這些參數編寫到設定檔中,然後通過--config指定該檔案所在路徑。 5. 啟動成功之後,你可以通過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 tag 複製代碼
row表示格式為: 每個數字對應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] 複製代碼
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/