摘要:本文所闡述的時間序列數(shù)據(jù)庫,系筆者所負(fù)責(zé)產(chǎn)品對性能指標(biāo)進(jìn)行聚合分組過濾過程中的梳理和總結(jié)。列出這個能列出系統(tǒng)中所有的。
【編者按】
劉斌,OneAPM后端研發(fā)工程師,擁有10多年編程經(jīng)驗(yàn),參與過大型金融、通信以及Android手機(jī)操作系的開發(fā),熟悉Linux及后臺開發(fā)技術(shù)。曾參與翻譯過《第一本Docker書》、《GitHub入門與實(shí)踐》、《Web應(yīng)用安全權(quán)威指南》、《WEB+DB PRESS》、《Software Design》等書籍,也是Docker入門與實(shí)踐課程主講人。本文所闡述的「時間序列數(shù)據(jù)庫」,系筆者所負(fù)責(zé)產(chǎn)品 Cloud Insight 對性能指標(biāo)進(jìn)行聚合、分組、過濾過程中的梳理和總結(jié)。
今天我們來介紹一下 KairosDB.
按照官方的說明,KairosDB 是一個 “Fast Time Series Database on Cassandra”,即基于 Cassandra 的高速時序列數(shù)據(jù)庫。
特點(diǎn) 數(shù)據(jù)采集數(shù)據(jù)可以通過多種協(xié)議寫入 KairosDB,比如 Telnet 的按行寫入,HTTP API,Graphite 以及批處理導(dǎo)入。此外,還可以使用或者自己編寫插件。
存儲KairosDB 采用了 Cassandra 作為數(shù)據(jù)存儲方式,Cassandra 也是一個比較流行的NoSQL數(shù)據(jù)庫,很多開源軟件基于此數(shù)據(jù)庫。
Rest APIKairosDB 提供了 REST API,已完成對 metric 名稱,tag 等的查詢,當(dāng)然,也少不了存儲和查詢數(shù)據(jù)點(diǎn)(data points)。
自定義數(shù)據(jù)類型(Custom Data)KairosDB 支持存儲和聚合自定義數(shù)據(jù)類型。默認(rèn)情況下 KairosDB 支持 long、double 和字符串的 value,這比 OpenTSDB 要豐富一些。
分組和聚合作為數(shù)據(jù)分析系統(tǒng),分組和聚合則是必不可少的功能。 KairosDB的聚合(也就是down samples)功能,支持的標(biāo)準(zhǔn)函數(shù)有 min、max、sum、count、mean、histogram、gaps 等,而且都非常實(shí)用。
比如 percentile,可以計算一個指標(biāo)值大概的百分比位置,非常適合存儲類似“你打敗了xx%的人”這種需求場景。
支持工具KairosDB 提供了進(jìn)行數(shù)據(jù)導(dǎo)入導(dǎo)出的命令行工具。根據(jù)官方文檔的說明,在一臺分配了 2Gig 內(nèi)存的 SSD Cassandra 上,1 秒鐘能導(dǎo)入 13 萬條數(shù)據(jù)。
插件機(jī)制KairosDB 也提供多種基于 Guice 的插件機(jī)制來進(jìn)行擴(kuò)展(data point 監(jiān)聽器,數(shù)據(jù)存儲,協(xié)議處理等。)
KairosDB 是從 OpenTSDB fork 過來的,因此最初它是支持 HBase 的,不過現(xiàn)在 HBase 已經(jīng)不能完全支持 KairosDB 所需的特性,將來會取消對 HBase 的支持。
入門 KairosDB 安裝 KairosDB這里我們以當(dāng)前最新的1.1.1版本為例進(jìn)行說明。
首先,需要確保你的JAVA_HOME已經(jīng)設(shè)置好了,且Java版本高于1.6。
$ echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
然后需要到 GitHub 上去下載安裝包。我用的是 OS X 系統(tǒng),因此我選擇了kairosdb-1.1.1-1.tar.gz (注意:點(diǎn)擊這個鏈接即可下載)
解壓后可以看看它的配置文件conf/kairosdb.properties,有一些東西適合 OpenTSDB 一樣的,比如 4242 端口。
KairosDB 集成了 jetty,你可以通過 jetty 訪問 WEB UI,而且還支持添加 SSL 支持,這樣安全性上比 OpenTSDB 高了一個層級。
配置文件中還能對 Cassandra 進(jìn)行設(shè)置,比如服務(wù)器地址、keyspace 等。不過默認(rèn)的話 KairosDB 使用 H2 作為數(shù)據(jù)存儲,這樣在開發(fā)環(huán)境下我們就不必配置Cassandra 了。這里我們也以 H2 為例來初步認(rèn)識一下 KairosDB,這也是 KairosDB 的默認(rèn)配置。
所以在這個例子里,我們不必修改配置文件,直接啟動 KairosDB 即可:
$ bin/kairosdb.sh run # 或者 $ bin/kairosdb.sh start
其中run參數(shù)會以前臺運(yùn)行的方式啟動 KairosDB,而start則以后臺進(jìn)程的方式啟動 KairosDB。
停止 KairosDB 只需要運(yùn)行bin/kairosdb.sh stop就可以了。
寫入數(shù)據(jù)和 OpenTSDB 一樣,KairosDB 也支持基于 telnet 和 HTTP API 的方式寫入數(shù)據(jù)。
Telnet 的方式數(shù)據(jù)格式很簡單:
`
put
`
這里我們就不做演示了。
只需要發(fā)送 JSON 數(shù)據(jù)到 http://localhost:8080/api/v1/datapoints 就可以了。
$ curl -v -H "Content-type: application/json" -X POST http://localhost:8080/api/v1/datapoints -d " [{ "name": "cpu.load.1", "timestamp": 1453109876000, "type": "double", "value": 0.32, "tags":{"host":"test-1"} }, { "name": "cpu.load.1", "timestamp": 1453109876000, "type": "double", "value": 0.21, "tags":{"host":"test-2"} }] " * Connected to localhost (::1) port 8080 (#0) > POST /api/v1/datapoints HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.43.0 > Accept: */* > Content-type: application/json > Content-Length: 262 > * upload completely sent off: 262 out of 262 bytes < HTTP/1.1 204 No Content < Access-Control-Allow-Origin: * < Pragma: no-cache < Cache-Control: no-cache < Expires: 0 < Content-Type: application/json; charset=UTF-8 < Server: Jetty(8.1.16.v20140903) < * Connection #0 to host localhost left intact
從服務(wù)器返回結(jié)果我們可以看到,HTTP 204 狀態(tài)碼,也是 KairosDB 成功寫入數(shù)據(jù)的結(jié)果。
查詢數(shù)據(jù)同樣 KairosDB 提供了查詢用 API:
$ curl -H "Content-type: application/json" -X POST http://localhost:8080/api/v1/datapoints/query -d " { "metrics": [ { "tags": {}, "name": "cpu.load.1", "group_by": [ { "name": JSON"tag", "tags": [ "host" ] } ], "aggregators": [ { "name": "sum", "align_sampling": true, "sampling": { "value": "1", "unit": "minutes" } } ] } ], "cache_time": 0, "start_absolute": 1453046400000, "end_absolute": 1453132800000, "time_zone": "Asia/Chongqing" }" | jq .
注意上面命令最后的 jq,這是用來對 JSON 數(shù)據(jù)進(jìn)行格式化的工具。
最終結(jié)果可能像下面一樣:
{ "queries": [ { "sample_size": 2, "results": [ { "name": "cpu.load.1", "group_by": [ { "name": "tag", "tags": [ "host" ], "group": { "host": "test-1" } }, { "name": "type", "type": "number" } ], "tags": { "host": [ "test-1" ] }, "values": [ [ 1453109876000, 0.32 ] ] }, { "name": "cpu.load.1", "group_by": [ { "name": "tag", "tags": [ "host" ], "group": { "host": "test-2" } }, { "name": "type", "type": "number" } ], "tags": { "host": [ "test-2" ] }, "values": [ [ 1453109876000, 0.21 ] ] } ] } ] }WEB UI
KairosDB 自帶了一個 Web 界面,你可以通過 http://localhost:8080 訪問。不過這個 UI 主要是以開發(fā)為目的的,可以看到查詢的 JSON 文本,方便調(diào)試,比較直觀。默認(rèn)的 UI 使用了 Flot 來畫圖,如果你愿意,也可以使用 Highcharts 替換。
LibraryKairosDB 目前有一個多帶帶的 Java Client,在官網(wǎng)還有一些其他語言的客戶端,比如 Python、PHP 等。
由于是 Java 客戶端,所以還是很容易上手的。比如寫入數(shù)據(jù):
MetricBuilder builder = MetricBuilder.getInstance(); builder.addMetric("metric1") .addTag("host", "server1") .addTag("customer", "Acme") .addDataPoint(System.currentTimeMillis(), 10) .addDataPoint(System.currentTimeMillis(), 30L); HttpClient client = new HttpClient("http://localhost:8080"); Response response = client.pushMetrics(builder); client.shutdown();
讀取數(shù)據(jù):
QueryBuilder builder = QueryBuilder.getInstance(); builder.setStart(2, TimeUnit.MONTHS) .setEnd(1, TimeUnit.MONTHS) .addMetric("metric1") .addAggregator(AggregatorFactory.createAverageAggregator(5, TimeUnit.MINUTES)); HttpClient client = new HttpClient("http://localhost:8080"); QueryResponse response = client.query(builder); client.shutdown();
這應(yīng)該會非常方便,開發(fā)起來比 OpenTSDB 要快不少了。
其他APIKairosDB 竟然支持 metric 刪除功能,這個功能會有多少人需要呢?
列出 metric 名、tag 列表、列出 tag 值,說不定有人會喜歡,比如在輸入框自動提示燈功能,可能需要這些元數(shù)據(jù)。
列出指標(biāo)名這里除了cpu.load.1是我們自己寫入的 metric,其余的都是 KairosDB 自己的指標(biāo)數(shù)據(jù)。
$ curl http://localhost:8080/api/v1/metricnames | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 501 0 501 0 0 45058 0 --:--:-- --:--:-- --:--:-- 50100 { "results": [ "kairosdb.datastore.query_time", "kairosdb.protocol.telnet_request_count", "kairosdb.http.ingest_count", "kairosdb.datastore.query_row_count", "cpu.load.1", "kairosdb.protocol.http_request_count", "kairosdb.http.ingest_time", "kairosdb.jvm.thread_count", "kairosdb.jvm.total_memory", "kairosdb.jvm.max_memory", "kairosdb.metric_counters", "kairosdb.jvm.free_memory", "kairosdb.datastore.query_sample_size", "kairosdb.datastore.query_collisions", "kairosdb.http.query_time", "kairosdb.http.request_time" ] }列出 tag key
這個 API 能列出系統(tǒng)中所有的 tag key。不過遺憾的是它不支持只列出某一給定指標(biāo)的所有 tag key。
$ curl http://localhost:8080/api/v1/tagnames | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 67 0 67 0 0 4188 0 --:--:-- --:--:-- --:--:-- 4466 { "results": [ "method", "metric_name", "query_index", "request", "host" ] }列出 tag value
這個 API 能列出系統(tǒng)中所有的 tag value。同樣遺憾的是它也不支持只列出某一給定指標(biāo)的所有 tag value。
所以這兩個 API 幾乎可以說是然并卵、無鳥用。
$ curl http://localhost:8080/api/v1/tagvalues | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 163 0 163 0 0 5011 0 --:--:-- --:--:-- --:--:-- 5093 { "results": [ "1", "lius-MacBook-Pro.local", "tagnames", "/datapoints/query", "test-1", "test-2", "metricnames", "query", "tags", "version", "datapoints", "putm", "cpu.load.1" ] }總結(jié)
KairosDB 畢竟是 OpenTSDB 的一個 fork,因此根本上的功能都差不多,而且隨著 OpenTSDB 對 Cassandra 的支持,感覺 KairosDB 相比 OpenTSDB 也沒有什么太大的優(yōu)勢。
相關(guān)閱讀這是本系列文章的其他部分:
時序列數(shù)據(jù)庫武斗大會之什么是TSDB
時序列數(shù)據(jù)庫武斗大會之TSDB名錄 Part 1
時序列數(shù)據(jù)庫武斗大會之TSDB名錄 Part 2
時序列數(shù)據(jù)庫武斗大會之OpenTSDB篇
Cloud Insight 集監(jiān)控、管理、計算、協(xié)作、可視化于一身,幫助所有 IT 公司,減少在系統(tǒng)監(jiān)控上的人力和時間成本投入,讓運(yùn)維工作更加高效、簡單。
本文轉(zhuǎn)自 OneAPM 官方博客
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/17519.html
摘要:本文所闡述的時間序列數(shù)據(jù)庫,系筆者所負(fù)責(zé)產(chǎn)品對性能指標(biāo)進(jìn)行聚合分組過濾過程中的梳理和總結(jié)。列出這個能列出系統(tǒng)中所有的。 【編者按】劉斌,OneAPM后端研發(fā)工程師,擁有10多年編程經(jīng)驗(yàn),參與過大型金融、通信以及Android手機(jī)操作系的開發(fā),熟悉Linux及后臺開發(fā)技術(shù)。曾參與翻譯過《第一本Docker書》、《GitHub入門與實(shí)踐》、《Web應(yīng)用安全權(quán)威指南》、《WEB+DB PRE...
摘要:在前面時序列數(shù)據(jù)庫武斗大會之名錄我們已經(jīng)介紹了一些常見的,這里我們再對剩余的一些做些簡單介紹。是一個多租戶的時間序列和資源數(shù)據(jù)庫。是基于的時序列數(shù)據(jù)庫。 【編者按】劉斌,OneAPM后端研發(fā)工程師,擁有10多年編程經(jīng)驗(yàn),參與過大型金融、通信以及Android手機(jī)操作系的開發(fā),熟悉Linux及后臺開發(fā)技術(shù)。曾參與翻譯過《第一本Docker書》、《GitHub入門與實(shí)踐》、《Web應(yīng)用安全...
閱讀 1662·2019-08-30 12:51
閱讀 656·2019-08-29 17:30
閱讀 3696·2019-08-29 15:17
閱讀 852·2019-08-28 18:10
閱讀 1356·2019-08-26 17:08
閱讀 2169·2019-08-26 12:16
閱讀 3429·2019-08-26 11:47
閱讀 3497·2019-08-23 16:18