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的插件機制來進行擴展(數據點偵聽器,數據存儲器,協議處理程序等)。
- Collectors——數據採集
- 其他說明
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上可以訪問寫入的數據:
另外一個例子是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
如果需要其他的系統數據,根據上面的腳本進行修改即可。
當然,如果需要長期進行監控,上面的腳本還需要進行修改,不再使用無限循環進行監控,改成使用crontab服務進行監控。
這裏有一些python操作redis的實例:
https://github.com/paladini/kairosdb-examples-python
並且,也有python、php、java、node.js等語言的客戶端封裝,可以通過:【點擊這裏查看】找到相應的客戶端進行安裝使用。
此外,我也使用了python進行了開發,將redis 的一些數據進行監控。實例稍後再進行更新。。。