kairosDB

kairosDB持續更新中…

最近工作需要開始接觸kairosDB,其github網址爲:[http://kairosdb.github.io/][6],在此我會在這記錄一些操作與分享經驗。
經過近大半個月的學習,基本的功能已經掌握,這幾天會將這篇東西完成。
下面是我的環境說明

  • 使用VMware上安裝的Ubuntu操作系統
  • **
  • 因爲纔剛剛開始,所以內容會有些凌亂,隨着研究深入會逐漸修改
  • **
  • KairosDB 可以使用cassandra、H2(開發環境中)作爲後端存儲。默認情況下,KairosDB運行在H2數據庫下,開發環境不需要cassandra。
  • **
  • 在開始學習kairosDB之前如果對kairosDB沒有一個大概認知的話,可以參考:[http://liubin.org/blog/2016/02/18/tsdb-intro/ ],瞭解一些關於TSDB的知識。
  • **
  • 這裏是我的實驗代碼,有需要的可以參考:【https://github.com/congshenV/work/tree/master/kairosDB

kairosDB概要

KairosDB是一個快速可靠的分佈式時間序列數據庫,主要用Cassandra來做底層存儲,也可以使用H2。KairosDB是在OpenTSDB基礎上重寫的。 KairosDB主頁: https://code.google.com/p/kairosdb/
  • 其主要的功能如下:

1、可以獲取基礎設施和服務的實時狀態信息,展示集羣的各種軟硬件錯誤,性能變化以及性能瓶頸。

2、可以衡量系統的SLA(服務類型、服務質量等),理解複雜系統間的相互作用,展示資源消耗情況。集羣的整體作業情況,可以用以輔助預算和集羣資源協調。

3、可以展示集羣的主要性能瓶頸,經常出現的錯誤,從而可以着力重點解決重要問題。

  • 組成
    • Collectors——數據採集 數據可以通過多種協議寫入KairosDB,比如Telnet的按行寫入,HTTP API,Graphite以及批處理導入。此外,還可以使用或者自己編寫插件。
    • Storage——存儲 KairosDB 採用了 Cassandra 作爲數據存儲方式,Cassandra 也是一個比較流行的NoSQL數據庫,很多開源軟件基於此數據庫。
    • REST API KairosDB提供了REST API,以完成對metric名稱,tag等的查詢,當然,也少不了存儲和查詢數據點(data points)。
    • WEB UI KairosDB也提供了基於Web API的查詢接口。
    • Aggregators——聚合 作爲數據分析系統,分組和聚合則是必不可少的功能。 KairosDB的聚合(也就是down samples)功能,支持的標準函數有min、max、sum、count、mean、histogram、gaps等,而且都非常實用。
    • Tools——工具 KairosDB提供了進行數據導入導出的命令行工具。在kairosDB服務器上可進行命令行的導入導出操作,數據存儲的內部指標可以監視服務器的性能
    • Client library KairosDB客戶端是一個Java庫,使用HttpClient類,可以簡單地進行發送指標和查詢KairosDB服務器。
    • Plugins——插件 KairosDB也提供多種基於Guice的插件機制來進行擴展(數據點偵聽器,數據存儲器,協議處理程序等)。
  • 其他說明
    KairosDB是從OpenTSDB fork過來的,因此最初它是支持HBase的,不過現在HBase已經不能完全支持KairosDB所需的特性,將來會取消對HBase的支持,不過如果只是做簡單地實驗,可以繼續實驗HBase。

安裝

kairosDB運行需要安裝java運行環境。java的安裝可以比較簡單,可以參考:
[http://blog.csdn.net/rchm8519/article/details/48721913 ]

在[https://github.com/kairosdb/kairosdb/releases ]中下載kairosDB最新版本的壓縮包,然後tar -zxvf 到你想要放的地方,我放到了/usr/kairosdb/中。

到這裏,安裝就算完成了,接下來就是如何去使用這個kairosDB了。

使用kairosDB還需要配置存儲方式,這是最重要的配置,默認是使用H2,如果是用H2那就不需要進行修改了。

-數據存儲方式 kairosDB有幾種後端數據存儲方式。默認設置了內存H2數據庫(java開發的關係型數據庫)來存儲,一般來說比較慢,可以通過修改conf/kairosdb.properties文件中的kairosdb.service.datastore屬性來更改存儲方式。

使用H2:kairosdb.service.datastore=org.kairosdb.datastore.h2.H2Module
使用Cassandra:kairosdb.service.datastore=org.kairosdb.datastore.cassandra.CassandraModule
默認情況下使用H2作爲存儲方式,進入bin/目錄下,運行

./kairosdb.sh run #使用run是在前臺顯示服務執行過程,使用start是在後臺執行,使用stop是關閉服務。

可以通過可視界面查詢一些kairosDB的數據,通過訪問
http://localhost:8080/ #localhost改爲kairosDB的服務器IP,如果是本地,就用localhost

看到有一篇講kairosDB的安裝的文章,也很清晰:

[http://blog.csdn.net/lzqs201314/article/details/51326623 ]

-文件句柄 當客戶端數量較多,而句柄數量不足,可增加文件句柄數量


推送數據

這裏使用了默認的H2數據庫進行實例操作。

kairosDB可以使用telnet協議的4242端口或http的8080端口來推送數據(端口可以在kairosdb.properties文件中更改)。

#使用telnet寫入數據,格式如下
#put <metric name> <time stamp> <value> <tag> <tag>... \n
echo "put test.cpu.1 1453109876000 0.32 host=test-1" |nc -w 30 127.0.0.1 4242

通過查詢語句可以查到這條信息已經寫入

#查詢指標名稱
curl http://localhost:8080/api/v1/metricnames | jq .

這裏對上面幾個參數作一些簡單地介紹,metric name就是指標名稱,time stamp就是13位時間戳,value就是要監控的指標的值,tag就是標籤,在查看數據時方便進行將數據區分。
nc指令就是向指定端口中傳輸數據,-w 30表示超時時間爲30秒。

#使用http寫入數據,在命令行下格式如下
curl -v -H "Content-type: application/json" -X POST http://localhost:8080/api/v1/datapoints -d '
> [{
> "name":"asd.redis.cpu.1",
> "timestamp":1453109876000,
> "type":"double",
> "value":0.32,
> "tags":{"host":"redus-test"}
> }]
> '

#示例中的例子:
curl -v -H "Content-type: application/json" -X POST http://localhost:8080/api/v1/datapoints -d'
[{
    "name": "archive.file.tracked",
    "timestamp": 1349109376,
    "type": "long",
    "value": 123,
    "tags":{"host":"test"}
},
{
    "name": "archive.file.search",
    "timestamp": 999,
    "type": "double",
    "value": 32.1,
    "tags":{"host":"test"}
}]
'

這裏也對上面的參數進行簡單介紹,name、timestamp、value、tags和telnet協議的意思一樣。type確定數據的類型,這裏默認有三種:long、double、string。

這裏再詳細介紹一下指標所包含的各個參數:

  • Metric:一個可測量的單位的標稱。metric不包括一個數值或一個時間,其僅僅是一個標籤,包含數值和時間的叫datapoints,metric是用逗號連接的不允許有空格,例如
    kairosdb.datastore.xxx
    kairosdb.jvm.xxx
  • Tags:一個metric應該描述什麼東西被測量,通常的做法是用Tags來描述具有相同維度的metric。Tags由tagk和tagv組成,前者表示一個分組,後者表示一個特定的項。例如
    host=test
  • Timestamp:一個絕對時間,用來描述一個數值或者一個給定的metric是在什麼時候定義的。
  • Value:一個Value表示一個metric的實際數值

在安裝好kairosDB之後,kairosDB自帶監控一些metric,下面就介紹下原有的指標內容:

- kairosdb.datastore.cassandra.key_query_time —— 從Cassandra查詢行鍵的時間(以毫秒爲單位)。
- kairosdb.datastore.query_collisions ——同時運行的相同查詢請求的數量。(或者一個在另一個完成之前開始。)
- kairosdb.datastore.query_row_count —— The number of rows a query
retrieved data from.查詢從中檢索數據的行數。
- kairosdb.datastore.query_sample_size —— The number of data points a
query retrieves from Cassandra (before aggregation).查詢從Cassandra(聚合前)檢索的數據點的數量。
- kairosdb.datastore.query_time - The number of milliseconds to
retreive the data out of Cassandra for a query (not including key
lookup).從查詢的Cassandra中檢索數據的毫秒數(不包括鍵查找)。
- kairosdb.datastore.write_size - The number of data points written to
the data store during the last write.在上次寫入期間寫入數據存儲的數據點數。
- kairosdb.http.ingest_count - The number of data points ingested via
HTTP since the last report.自上次報告以來通過HTTP提取的數據點數。
- kairosdb.http.ingest_time - The amount of time to ingest the number
of metrics from kairosdb.http.ingest_count. So ingest_count /
ingest_time is an average of how fast a single metric is inserted.從kairosdb.http.ingest_count獲取度量標準的時間量。因此,ingest_count / ingest_time是單個指標插入速度的平均值。
- kairosdb.http.query_time - The amount of time a query takes from
processing the request to formating the response. Does not include
time to send data to client.查詢從處理請求到形成響應所需的時間。不包括向客戶端發送數據的時間。
- kairosdb.http.request_time - The total amount of time an HTTP request
takes from recieving data to sending response.HTTP請求從接收數據到發送響應所花費的總時間。
- kairosdb.jvm.free_memory - The amount of free memory available in the
JVM.JVM中可用的可用內存量。
- kairosdb.jvm.total_memory - The amount of total memory in the JVM.JVM中的總內存量。
- kairosdb.jvm.max_memory - The maximum amount of memory the JVM will
attempt to use.JVM將嘗試使用的最大內存量。
- kairosdb.jvm.thread_count - The total number of threads running in
the JVM. JVM中運行的線程總數。
- kairosdb.metric_counters - Counts the number of data points received
since the last report. Tags are used to separate one metric from
another.計算自上次報告以來接收的數據點數。標籤用於將一個指標與另一個指標分開。
- kairosdb.protocol.http_request_count - The number of HTTP requests
for each method. This includes a method tag that indicates the method
that was called. For example, method=query if a query was done.每個方法的HTTP請求數。這包括一個方法標記,指示被調用的方法。例如,如果查詢已完成,method = query。
- kairosdb.protocol.telnet_request_count - The number of telnet
requests for each method. This includes a method tag that indicates
the method that called. For example, method=put if the put method was
called.每個方法的telnet請求數。這包括一個方法標籤,指示被調用的方法。例如,如果put方法被調用,method = put。

Graphite協議,KairosDB現在支持Graphite純文本和pickle協議。可以整合KairosDB現有的應用程序和推送到Graphite的數據。


自定義metric推送

上面介紹了推送數據的方法,這裏我將做出一個自定義的metric實例。

自帶的metric裏面沒有cpu的數據,這裏做出一個cpu的metric。

#使用telnet寫入數據,具體內容如下:
#!/bin/bash
set -e
metric_name="newdata.loadavg"
time_out=30
ip=127.0.0.1
port=4242
while true
do
    cat /proc/loadavg |awk -v now=$(($(date +%s%N)/1000000)) -v host='yyc' \
    '{print "put newdata.loadavg.1m " now " " $1 " host=" host;
    print "put newdata.loadavg.5m " now " " $2 " host=" host;
    print "put newdata.loadavg.15m " now " " $3 " host=" host }' | nc -w $time_out $ip $port
    sleep 1
done

通過查詢語句或者在web上可以訪問寫入的數據:
loadavg數據
另外一個例子是cpu狀態的

``` shell
#使用telnet寫入數據:
#!/bin/bash
set -e
metric_name="newdata.stat"
time_out=30
ip=127.0.0.1
port=4242
while true
do
    cat /proc/stat | grep cpu0 |awk -v now=$(($(date +%s%N)/1000000)) -v host='yyc' \
    '{print "put newdata.stat " now " " ($2+$3+$4)/($2+$3+$4+$5) " host=" host }' | nc -w $time_out $ip $port
    sleep 1
done

stat


如果需要其他的系統數據,根據上面的腳本進行修改即可。
當然,如果需要長期進行監控,上面的腳本還需要進行修改,不再使用無限循環進行監控,改成使用crontab服務進行監控。


這裏有一些python操作redis的實例:
https://github.com/paladini/kairosdb-examples-python
並且,也有python、php、java、node.js等語言的客戶端封裝,可以通過:【點擊這裏查看】找到相應的客戶端進行安裝使用。
此外,我也使用了python進行了開發,將redis 的一些數據進行監控。實例稍後再進行更新。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章