度量驅(qū)動(dòng)開(kāi)發(fā)之 InfluxDB

MDD

度量驅(qū)動(dòng)開(kāi)發(fā) Metrics-Driven Development 即在軟件開(kāi)發(fā)過(guò)程中, 設(shè)計(jì)和實(shí)現(xiàn)方案的選擇及優(yōu)化建立在度量的基礎(chǔ)之上.
一切拿數(shù)據(jù)說(shuō)話(huà), 杜絕臆想和猜測(cè), 這是在大數(shù)據(jù)和 DevOPS 浪潮之下順應(yīng)而生的現(xiàn)代軟件開(kāi)發(fā)方法

  • 監(jiān)控: 采集產(chǎn)品的性能, 用量以及業(yè)務(wù)相關(guān)的統(tǒng)計(jì)數(shù)據(jù)
  • 存儲(chǔ): 把收集到的數(shù)據(jù)基于時(shí)間線(xiàn)或其他基準(zhǔn)分門(mén)別類(lèi)進(jìn)行存儲(chǔ)
  • 分析: 對(duì)于數(shù)據(jù)進(jìn)行各種維度的分析計(jì)算, 生成圖表, 并對(duì)關(guān)鍵指標(biāo)設(shè)置閥值, 在條件滿(mǎn)足時(shí)觸發(fā)報(bào)警

牽涉到的開(kāi)源工具不勝枚舉, 常用的就有

我們先從時(shí)間序列數(shù)據(jù)庫(kù) InfluxDB 說(shuō)起

時(shí)間序列數(shù)據(jù)

光陰似箭, 日月如梭, 很多事情都可以重頭再來(lái), 唯有時(shí)間一去不回頭.

在軟件應(yīng)用領(lǐng)域, 一寸光陰一寸金, 基于時(shí)間的數(shù)據(jù)收集, 度量和監(jiān)控每時(shí)每刻都在進(jìn)行.

比如股指的變化, 房?jī)r(jià)的漲跌, 天氣的冷暖, 應(yīng)用訪(fǎng)問(wèn)的頻率和次數(shù)等等
這些數(shù)據(jù)都有一個(gè)共通的地方, 那就是全部都是以時(shí)間為基軸

我們稱(chēng)這些數(shù)據(jù)為 Time-series Data 時(shí)間序列數(shù)據(jù), 由一系列來(lái)自相同數(shù)據(jù)源, 按一定時(shí)間間隔采樣的連續(xù)數(shù)據(jù)組成.

這些數(shù)據(jù)的重要性不言自明, 在 DevOps 的大潮下, 人們逐漸達(dá)成共識(shí), 一定要基于數(shù)據(jù)說(shuō)話(huà)和做決定

時(shí)間序列數(shù)據(jù)的存儲(chǔ)可以是數(shù)據(jù)庫(kù), 主鍵是時(shí)間點(diǎn), 字段是具體的數(shù)據(jù)值.
但有由于時(shí)間序列數(shù)據(jù)有它自身的特點(diǎn), 就如 Baron Schwartz 所總結(jié)的

  1. 90%以上的數(shù)據(jù)庫(kù)負(fù)載在于大量和高頻率的寫(xiě)操作
  2. 寫(xiě)操作一般都是在以有的數(shù)據(jù)度量之后按時(shí)間追加
  3. 這些寫(xiě)操作都是典型地按時(shí)間序列產(chǎn)生的, 比如每秒或每分
  4. 數(shù)據(jù)庫(kù)的主要瓶頸在于輸入輸出的限制
  5. 對(duì)于已存在的單個(gè)數(shù)據(jù)點(diǎn)的糾正和修改極少
  6. 刪除數(shù)據(jù)幾乎都是一個(gè)比較大的時(shí)間段(天, 月或年), 極少會(huì)只針對(duì)單條記錄
  7. 查詢(xún)數(shù)據(jù)庫(kù)一般都是基于某個(gè)序列的連續(xù)數(shù)據(jù), 并根據(jù)時(shí)間或時(shí)間的函數(shù)排序
  8. 執(zhí)行查詢(xún)常用并發(fā)讀取一個(gè)或多個(gè)序列

對(duì)于時(shí)間序列數(shù)據(jù)當(dāng)然可以使用傳統(tǒng)的數(shù)據(jù)庫(kù)來(lái)存儲(chǔ), 比如Oracle, MySQL, PostgreSQL, 或者一些KV store, 比如 Cassandra, Riak 等

但是對(duì)于上述時(shí)間序列數(shù)據(jù)的特點(diǎn)有針對(duì)性的優(yōu)化的一些時(shí)間序列數(shù)據(jù)庫(kù)逐漸流行起來(lái), 比如

時(shí)間序列數(shù)據(jù)庫(kù) InfluxDB

這里就重點(diǎn)講講現(xiàn)在比較流行的 InfluxDB , 它是由InfluxData開(kāi)發(fā)的一個(gè)開(kāi)源的時(shí)間序列數(shù)據(jù)庫(kù)。 它是由 Go 語(yǔ)言寫(xiě)的, 為了快速并且高可靠性的時(shí)間序列數(shù)據(jù)存取做了一些優(yōu)化仍秤, 應(yīng)用范圍包括操作監(jiān)視, 應(yīng)用度量临燃, 物聯(lián)傳感器數(shù)據(jù)以及實(shí)時(shí)分析等方面。

概述

首先 InfluxDB是一個(gè)基于時(shí)間序列數(shù)據(jù)組織的壁拉,例如 cpu占用率, 溫度等度量數(shù)據(jù)谬俄, 在時(shí)間序列上有一個(gè)或多個(gè)數(shù)據(jù)在連續(xù)的時(shí)間間隔上的采樣

理論上講, 你可以認(rèn)為 measurement 就象傳統(tǒng)數(shù)據(jù)庫(kù)中的表 table, 它的主鍵永遠(yuǎn)是 time, tags 和 fields 是表中的字段弃理, tags 是有索引的字段溃论,而 fields 沒(méi)有.

橫向比較一下 InfluxDBI, Oracle 和 Cassandra

InfluxDB Oracle Cassandra
Measurement Table Column Family
Timestamp as PK Customized PK Parition Key
Tag Indexed field Clustering column
Field not Indexed field column

區(qū)別在于, InfluxDB 中可以有數(shù)百萬(wàn)的 measurements, 無(wú)需事先定義 schema, 不會(huì)有 null 類(lèi)型的數(shù)據(jù)痘昌, 數(shù)據(jù)點(diǎn) Point 寫(xiě)到 InfluxDB 中是采用 Line 協(xié)議钥勋, 即如下格式

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

下面就是一個(gè)例子

cpu,host=serverA,region=us_west value=0.64payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230stock,symbol=AAPL bid=127.46,ask=127.48temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000

** 注:** 更多有關(guān) line 協(xié)議的信息可參見(jiàn) 行協(xié)議書(shū)寫(xiě)語(yǔ)法.

存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)大體如下

{
"database" : "mydb", 
"retentionPolicy" : "bar", 
"points" : 
    [ 
        {"name" : "disk", 
        "tags" : {"server" : "bwi23", "unit" : "1"}, 
        "timestamp" : "2015-03-16T01:02:26.234Z", 
        "fields" : {"total" : 100, "used" : 40, "free" : 60}}
    ]
}

安裝

MAC OS

brew install influxdb

CentOS

先添加一個(gè) yum 配置文件

cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

測(cè)試

打開(kāi) http://localhost:8083/,這是它的 Web 控制臺(tái)
(注: /etc/influxdb/influxdb.conf 中的# https-enabled = false 要改成 true)

還有兩種方式訪(fǎng)問(wèn)influxdb, 命令行方式和API方式

用法

創(chuàng)建數(shù)據(jù)庫(kù)

curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"

或者

influx -execute 'create database mydb'

查詢(xún)數(shù)據(jù)結(jié)構(gòu)

  • 查看 databases
SHOW DATABASES
  • 查看 retention policies
 SHOW RETENTION POLICIES
  • 查看 series
 SHOW SERIES
  • 查看 measurements
SHOW MEASUREMENTS
  • 查看 tag keys
SHOW TAG KEYS
  • 查看 tag values
SHOW TAG VALUES
  • 查看 field keys
SHOW FIELD KEYS

插入數(shù)據(jù)

curl -XPOST 'http://localhost:8086/write?db=mydb' \\\\\\\\\\\\\\\\-d 'cpu,host=server01,region=uswest load=42 1434055562000000000'curl -XPOST 'http://localhost:8086/write?db=mydb' \\\\\\\\\\\\\\\\-d 'cpu,host=server02,region=uswest load=78 1434055562000000000'curl -XPOST 'http://localhost:8086/write?db=mydb' \\\\\\\\\\\\\\\\-d 'cpu,host=server03,region=useast load=15.4 1434055562000000000'

influx -execute 'INSERT into mydb.autogen cpu,host=serverA,region=us_west value=0.64'

查詢(xún)數(shù)據(jù)

influx -execute 'show databases'
influx -execute 'show measurements' -database mydb
influx -execute 'SELECT host, region, value FROM cpu' -database mydb

curl -G 'http://localhost:8086/query?db=mydb' --data-urlencode "q=SHOW MEASUREMENTS"

curl -G http://localhost:8086/query?pretty=true --data-urlencode "db=mydb" --data-urlencode "q=SELECT * FROM cpu WHERE host='server01' AND time < now() - 1d"

分析數(shù)據(jù)

curl -G http://localhost:8086/query?pretty=true --data-urlencode "db=mydb" --data-urlencode "q=SELECT mean(load) FROM cpu WHERE region='uswest'"

InfluxDB Client library

Java Client library

Maven 依賴(lài)

<dependency>
  <groupId>org.influxdb</groupId>
  <artifactId>influxdb-java</artifactId>
  <version>2.4</version>
</dependency>

示例


import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.BatchPoints;
import org.influxdb.dto.Point;
import org.influxdb.dto.Pong;
import org.influxdb.dto.Query;
import org.influxdb.dto.QueryResult;

import java.util.concurrent.TimeUnit;

public class InfluxDbSample {


    public static void main(String[] args) {
        InfluxDB influxDB = InfluxDBFactory.connect("http://127.0.0.1:8086", "root", "");
        Pong pong = influxDB.ping();
        System.out.println("pong: " + pong);

        String dbName = "aTimeSeries";
        influxDB.createDatabase(dbName);

        // Flush every 2000 Points, at least every 100ms
        //influxDB.enableBatch(2000, 100, TimeUnit.MILLISECONDS);
        System.out.println("--- created database and will insert data ---");

        BatchPoints batchPoints = BatchPoints
                .database(dbName)
                .tag("async", "true")
                .retentionPolicy("default")
                .consistency(InfluxDB.ConsistencyLevel.ALL)
                .build();
        Point point1 = Point.measurement("cpu")
                .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
                .addField("idle", 90L)
                .addField("user", 9L)
                .addField("system", 1L)
                .build();
        Point point2 = Point.measurement("disk")
                .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
                .addField("used", 80L)
                .addField("free", 1L)
                .build();
        batchPoints.point(point1);
        batchPoints.point(point2);
        influxDB.write(batchPoints);
        Query query = new Query("SELECT idle FROM cpu", dbName);
        QueryResult rs = influxDB.query(query);

        System.out.println("result: " + rs.toString());
        influxDB.deleteDatabase(dbName);
    }
}

--- output ---

pong: Pong{version=0.13.0, responseTime=245}
--- created database and will insert data ---
result: QueryResult [results=[Result [series=[Series [name=cpu, tags=null, columns=[time, idle], values=[[2016-11-03T14:51:42.486Z, 90.0], [2016-11-03T14:52:33.328Z, 90.0], [2016-11-03T14:54:03.474Z, 90.0], [2016-11-03T14:55:55.839Z, 90.0], [2016-11-03T15:00:15.402Z, 90.0], [2016-11-03T15:02:50.596Z, 90.0]]]], error=null]], error=null]

實(shí)用鏈接

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辆苔,一起剝皮案震驚了整個(gè)濱河市算灸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驻啤,老刑警劉巖菲驴,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異骑冗,居然都是意外死亡赊瞬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)贼涩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巧涧,“玉大人,你說(shuō)我怎么就攤上這事遥倦“” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缩筛。 經(jīng)常有香客問(wèn)我消略,道長(zhǎng),這世上最難降的妖魔是什么歪脏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任疑俭,我火速辦了婚禮,結(jié)果婚禮上婿失,老公的妹妹穿的比我還像新娘。我一直安慰自己啄寡,他們只是感情好豪硅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著挺物,像睡著了一般懒浮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上识藤,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天砚著,我揣著相機(jī)與錄音,去河邊找鬼痴昧。 笑死稽穆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赶撰。 我是一名探鬼主播舌镶,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼豪娜!你這毒婦竟也來(lái)了餐胀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘤载,失蹤者是張志新(化名)和其女友劉穎否灾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸣奔,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墨技,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溃蔫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片健提。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伟叛,靈堂內(nèi)的尸體忽然破棺而出私痹,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布紊遵,位于F島的核電站账千,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏暗膜。R本人自食惡果不足惜匀奏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望学搜。 院中可真熱鬧娃善,春花似錦、人聲如沸瑞佩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炬丸。三九已至瘫寝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稠炬,已是汗流浹背焕阿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留首启,地道東北人暮屡。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闽坡,于是被迫代替她去往敵國(guó)和親栽惶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 什么是InfluxDB疾嗅? InfluxDB介紹 InfluxDB是一款用Go語(yǔ)言編寫(xiě)的開(kāi)源分布式時(shí)序外厂、事件和指標(biāo)數(shù)...
    BilyLuo閱讀 3,309評(píng)論 0 18
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)代承,斷路器汁蝶,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Apache Cassandra 是一個(gè)開(kāi)源的、分布式论悴、去中心化掖棉、彈性可擴(kuò)展、高可用性膀估、容錯(cuò)幔亥、一致性可調(diào)、面向行的...
    梁睿坤閱讀 14,054評(píng)論 2 25
  • 隨著線(xiàn)上服務(wù)的全面docker化察纯,對(duì)docker容器的監(jiān)控就很重要了帕棉。SA的監(jiān)控系統(tǒng)是物理機(jī)的監(jiān)控针肥,在一個(gè)物理機(jī)跑...
    __七把刀__閱讀 14,123評(píng)論 3 22
  • 選擇行業(yè)比選擇公司更重要慰枕。這確實(shí)。 現(xiàn)在的我在機(jī)關(guān)單位單位上班即纲,待了三年多了具帮。我見(jiàn)證它從單純走向復(fù)雜。好不夸張講低斋,...
    豪小閱讀 388評(píng)論 0 2