成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Kubernetes監(jiān)控之InfluxDB

qieangel2013 / 3279人閱讀

摘要:也是由鍵值對(duì)和組成。用于指定數(shù)據(jù)的備份數(shù)量,是表示數(shù)據(jù)節(jié)點(diǎn)的數(shù)量。該每小時(shí)執(zhí)行一遍,然后將每個(gè)小時(shí)的寫入表中。

什么是InfluxDB? InfluxDB介紹

InfluxDB是一款用Go語言編寫的開源分布式時(shí)序、事件和指標(biāo)數(shù)據(jù)庫(kù),無需外部依賴。
該數(shù)據(jù)庫(kù)現(xiàn)在主要用于存儲(chǔ)涉及大量的時(shí)間戳數(shù)據(jù),如DevOps監(jiān)控?cái)?shù)據(jù),APP metrics, loT傳感器數(shù)據(jù)和實(shí)時(shí)分析數(shù)據(jù)。
InfluxDB特征:

無結(jié)構(gòu)(無模式):可以是任意數(shù)量的列

可以設(shè)置metric的保存時(shí)間

支持與時(shí)間有關(guān)的相關(guān)函數(shù)(如min、max、sum、count、mean、median等),方便統(tǒng)計(jì)

支持存儲(chǔ)策略:可以用于數(shù)據(jù)的刪改。(influxDB沒有提供數(shù)據(jù)的刪除與修改方法)

支持連續(xù)查詢:是數(shù)據(jù)庫(kù)中自動(dòng)定時(shí)啟動(dòng)的一組語句,和存儲(chǔ)策略搭配可以降低InfluxDB的系統(tǒng)占用量。

原生的HTTP支持,內(nèi)置HTTP API

支持類似sql語法

支持設(shè)置數(shù)據(jù)在集群中的副本數(shù)

支持定期采樣數(shù)據(jù),寫入另外的measurement,方便分粒度存儲(chǔ)數(shù)據(jù)。

自帶web管理界面,方便使用(登入方式:http://< InfluxDB-IP >:8083)

關(guān)鍵概念

InfluxDB關(guān)鍵概念列表:

database field key field set
field value measurement point
retention policy series tag key
tag set tag value timestamp

下面舉個(gè)例子進(jìn)行概念介紹:
我們虛擬一組數(shù)據(jù),其中有一張數(shù)據(jù)表(measurement)為census,該表記錄了由兩個(gè)科學(xué)家(langstroth和perpetua)在兩個(gè)不同的位置(1和2),統(tǒng)計(jì)了butterflies和honeybees的數(shù)據(jù),時(shí)間段是2015-08-18 00: 00:00 -- 2015-08-18 06: 12:00. 我們假設(shè)這些數(shù)據(jù)屬于叫my_database的數(shù)據(jù)庫(kù)(database),且該數(shù)據(jù)存儲(chǔ)在autogen的存儲(chǔ)策略(retention policy)中。
數(shù)據(jù)展示如下:

name: census
---------------------
time                    butterflies     honeybees     location     scientist
2015-08-18T00:00:00Z      12             23              1         langstroth
2015-08-18T00:00:00Z      1              30              1         perpetua
2015-08-18T00:06:00Z      11             28              1         langstroth
2015-08-18T00:06:00Z      3              28              1         perpetua
2015-08-18T05:54:00Z      2              11              2         langstroth
2015-08-18T06:00:00Z      1              10              2         langstroth
2015-08-18T06:06:00Z      8              23              2         perpetua
2015-08-18T06:12:00Z      7              22              2         perpetua

我們針對(duì)數(shù)據(jù)來進(jìn)行概念分析:
InfluxDB是時(shí)序數(shù)據(jù)庫(kù),所以怎么都繞不開時(shí)間,第一縱列time存儲(chǔ)著時(shí)間戳,而時(shí)間戳是與數(shù)據(jù)進(jìn)行關(guān)聯(lián),這樣才能將時(shí)間和數(shù)據(jù)進(jìn)行展示。
接下去兩縱列(butterflies和honeybees),稱為FieldsFields由field keys和field values組成。butterflies和honeybees兩個(gè)字符串就是field keys;而butterflies這個(gè)field key對(duì)應(yīng)的field values就是12 -- 7, honeybees這個(gè)field key對(duì)應(yīng)的field values就是23 -- 22。
Field values就是你的數(shù)據(jù),它們可以是string、float、int或者bool等。因?yàn)閕nfluxdb是時(shí)序數(shù)據(jù)庫(kù),所以field values總是要和timestamp關(guān)聯(lián)。

field set是在數(shù)據(jù)層之上應(yīng)用概念,由field key和field value組成了field set,如這里有8組field set數(shù)據(jù):

butterflies = 12 honeybees = 23

butterflies = 1 honeybees = 30

butterflies = 11 honeybees = 28

butterflies = 3 honeybees = 28

butterflies = 2 honeybees = 11

butterflies = 1 honeybees = 10

butterflies = 8 honeybees = 23

butterflies = 7 honeybees = 22

field是InfluxDB的必要結(jié)構(gòu),但也需要注意field是沒有索引的。

剩下的兩個(gè)縱列是location和scientist,它們是tags。Tags也是由鍵值對(duì)(tag keys和tag values)組成。這里的tag keys是字符串location和scientist;location 這個(gè)tag key有兩個(gè)tag values: 1和2;scientist這個(gè)tag key也有兩個(gè)tag values:perpetua和langstroth。
tag set也是數(shù)據(jù)之上的概念,是不同的tag key-value組合,這里有4組tag sets數(shù)據(jù):

location = 1, scientist = langstroth

location = 2, scientist = langstroth

location = 1, scientist = perpetua

location = 2, scientist = perpetua

Tags是可選的參數(shù),也就是說你存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)中不一定非要帶tags,但是它非常好用,因?yàn)榭梢运饕?。一般都?huì)通過tags來查詢數(shù)據(jù)會(huì)快很多。

measurement包含了tags、fields和time,就類似于傳統(tǒng)數(shù)據(jù)庫(kù)的表。一個(gè)measurement可以屬于不同的retention policy(存儲(chǔ)策略),存儲(chǔ)策略描述了InfluxDB怎么去保持?jǐn)?shù)據(jù)(DURATION),需要在集群中存儲(chǔ)多少份數(shù)據(jù)副本(REPLICATION)。
示例中的數(shù)據(jù)都屬于census這個(gè)measurement,而該measurement又屬于autogen這個(gè)存儲(chǔ)策略。InfluxDB一般都會(huì)創(chuàng)建一個(gè)default存儲(chǔ)策略,它有無限長(zhǎng)的持續(xù)時(shí)間和等于1的副本數(shù)。

我們了解過了measurements、tag sets和retention policies的概念后,是時(shí)候該知道series了。
在同一個(gè)database中,series由retention policy、measurement、tag sets三部分組成,在我們上面的數(shù)據(jù)中有如下4個(gè)series:

Arbitrary series number Retention policy Measurement Tag set
series 1 autogen census location = 1,scientist = langstroth
series 2 autogen census location = 2,scientist = langstroth
series 3 autogen census location = 1,scientist = perpetua
series 4 autogen census location = 2,scientist = perpetua

同一個(gè)Series的數(shù)據(jù)在物理上會(huì)按照時(shí)間順序排列存儲(chǔ)在一起。
Series的key為measurement + 所有tags的序列化字符串。
代碼結(jié)構(gòu)如下:

tyep Series struct {
    mu           sync.RWMutex
    Key          string
    Tags         map[string]string  
    id           uint64
    measurement  *Measurement
}

介紹完Series后,就可以解釋point了。point是在一個(gè)series中有相同時(shí)間戳的field set,也可以理解如表里的一行數(shù)據(jù)。示例中一個(gè)Point:

name: census
-----------------
time                   butterflies     honeybees     location     scientist
2015-08-18T00:00:00Z        1              30           1         perpetua

上例中,series由retention policy(autogen), measurement(census)和tag set(location=1,scientist=perpetua)進(jìn)行定義。而這個(gè)point的時(shí)間戳則是2015-08-18T 00: 00: 00Z。

InfluxDB Database可以有多個(gè)users、continuous queries、retention policy、measurement。因?yàn)镮nfluxDB是一個(gè)結(jié)構(gòu)化的數(shù)據(jù)庫(kù),我們可以輕松的去新增measurements、tags、fields。

高級(jí)概念 Retention Policy

之前講關(guān)鍵性概念時(shí)有簡(jiǎn)單介紹了RP,這里會(huì)進(jìn)行較詳細(xì)的介紹。
InfluxDB的數(shù)據(jù)保留策略(RP)是用來定義數(shù)據(jù)在數(shù)據(jù)庫(kù)中存放的時(shí)間,或者定義保存某個(gè)期間的數(shù)據(jù)。
RP在InfluxDB中是比較重要的概念,因?yàn)镮nfluxDB本身是沒有提供數(shù)據(jù)的刪除操作,所以需要通過定義RP來控制數(shù)據(jù)量的問題。
(一個(gè)數(shù)據(jù)庫(kù)可以有多個(gè)RP,但是每個(gè)RP必須是獨(dú)一無二的。)

在具體介紹RP之前,先介紹下另外一個(gè)跟RP相關(guān)的基礎(chǔ)概念(shard)。
shard:
每個(gè)RP下面會(huì)存在很多shard,每個(gè)shard都存儲(chǔ)了實(shí)際編碼和壓縮數(shù)據(jù),并且不重復(fù)。例如你在創(chuàng)建RP時(shí)指定了shard duration為1h,那么7--8點(diǎn)存入shard_group0,8--9點(diǎn)就會(huì)存入shard_group1中。所以shard才是真實(shí)存儲(chǔ)InfluxDB數(shù)據(jù)的地方。
每個(gè)shard都屬于唯一一個(gè)shard group,一個(gè)group中會(huì)有多個(gè)shard;而每個(gè)shard包含一組特定的series;所有的points都落在給定的series中,而series是都落在給定的shard group中;

問題1:每個(gè)shard group指定了一段時(shí)間區(qū)域,而且其中有多個(gè)shard;每個(gè)shard包含一組特定的series。那么shard中存的數(shù)據(jù)是怎么區(qū)分的?series是由RP、meansurement、tags組成,那么shard的區(qū)分是根據(jù)tags??

shard duration:
shard duration決定了每個(gè)shard group存放數(shù)據(jù)的時(shí)間區(qū)域。這段時(shí)間是在定義RP時(shí)由"SHARD DURATION"字段決定。
例如你創(chuàng)建RP時(shí)指定了SHARD DURATION為1w,那么每個(gè)shard group的時(shí)間跨度就為1w,它將包含所有在這一周時(shí)間戳內(nèi)的points。

OK,大概了解了shard之后,繼續(xù)回到Retention Policy。

當(dāng)你創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)時(shí),InfluxDB會(huì)自動(dòng)給你創(chuàng)建一個(gè)叫"autogen"的retention Policy,這個(gè)RP的數(shù)據(jù)保留時(shí)間是無限。
1.創(chuàng)建RP語法:

CREATE RETETION POLICY {rp_name} ON {database_name} DURATION {duration} REPLICATION {n} [SHARD DURATION {duration}] [DEFAULT]

注:
DURATION: 用于描述數(shù)據(jù)保留時(shí)間??稍O(shè)置的時(shí)間區(qū)間是1h -- INF(無窮大)。
REPLICATION: 用于指定數(shù)據(jù)的備份數(shù)量,n是表示數(shù)據(jù)節(jié)點(diǎn)的數(shù)量。
SHARD DURATION: 用于指定shard group的時(shí)間區(qū)域,這個(gè)字段的duration是不支持INF的。默認(rèn)情況下,shard group的duration由RP的duration決定。

Retention Policy"s DURATION Shard Group Duration
< 2 days 1h
>= 2 days and <= 6 mouths 1day
> 6 mouths 7days

DEFAULT: 可選參數(shù),用于指定使用新的RP來作為數(shù)據(jù)庫(kù)的默認(rèn)RP。(具體新在哪?需要進(jìn)一步查看)

2.修改RP語法:

ALTER RETENTION POLICY {rp_name} ON {database_name} DURATION {duration} REPLICATION {n} SHARD DURATION {duration} DEFAULT

注:
后面的參數(shù)字段都一樣,主要差別就在于關(guān)鍵字段:ALTER RETENTION POLICY

3.刪除RP語法:

DROP RETENTION POLICY {rp_name} ON {database_name}

注:
即使你企圖去刪除一個(gè)不存在的rp,命令返回值也是空,不會(huì)返回一個(gè)錯(cuò)誤碼。

Continuous Queries

之前我們介紹了數(shù)據(jù)保存策略,數(shù)據(jù)超過保存策略里指定的時(shí)間之后,就會(huì)被刪除。但我們不想完全刪除這些數(shù)據(jù),比如我們想把每秒的監(jiān)控?cái)?shù)據(jù)至少保留成每小時(shí),就需要用到連續(xù)查詢(Continuous Queries)功能。
連續(xù)查詢主要用在將數(shù)據(jù)歸檔,以降低系統(tǒng)空間的占用率,但這主要是以降低數(shù)據(jù)精度為代價(jià)。
基本語法:

CREATE CONTINUOUS QUERY {cq_name} ON {database_name}
BEGIN
    {cq_query}
END
注:cq_name表示創(chuàng)建的Continuous query的名字;database_name表示要操作的數(shù)據(jù)庫(kù)。

cq_query是操作函數(shù),如下:
SELECT {function[s]} INTO {destnation_measurement} FROM {measurement} [WHERE {stuff}] GROUP BY time({interval})[,{tag_key[s]}]
注:destnation_measurement表示新生成的數(shù)據(jù)存放的表;measurement表示數(shù)據(jù)查詢的表;
GROUP BY time表示采樣分析的數(shù)據(jù)時(shí)間,比如設(shè)置1h,如果當(dāng)前是17:00,那么需要計(jì)算的數(shù)據(jù)時(shí)間就是16:00 -- 16:59。

例子1: 自動(dòng)降低精度來采樣數(shù)據(jù)

CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
BEGIN
    SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
END

查看結(jié)果:
> SELECT * FROM "average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T07:00:00Z   7
2016-08-28T08:00:00Z   13.75

連續(xù)查詢(cq_basic)通過在數(shù)據(jù)庫(kù)"transportation"中的"bus_data"表,計(jì)算每小時(shí)平均的旅客數(shù),然后在該數(shù)據(jù)庫(kù)中新建"average_passengers"表,并將數(shù)據(jù)存入該表中。該cq_basic每小時(shí)執(zhí)行一遍,然后將每個(gè)小時(shí)的point寫入表中。

例子2:自動(dòng)降低精度來采樣數(shù)據(jù),并將數(shù)據(jù)存入另外一個(gè)Retention Policy(RP)

CREATE CONTINUOUS QUERY "cq_basic_rp" ON "transportation"
BEGIN
    SELECT mean("passengers") INTO "transportation"."three_weeks"."average_passengers" FROM "bus_data" GROUP BY time(1h)
END

查看結(jié)果:
> SELECT * FROM "transportation"."three_weeks"."average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T07:00:00Z   7
2016-08-28T08:00:00Z   13.75

連續(xù)查詢(cq_basic_rp)通過在數(shù)據(jù)庫(kù)"transportation"中的"bus_data"表,計(jì)算每小時(shí)平均的旅客數(shù),然后將數(shù)據(jù)存入transportation數(shù)據(jù)庫(kù)中的three_weeks(RP)的average_passengers表中。該cq_basic_rp每小時(shí)執(zhí)行一遍,然后將每個(gè)小時(shí)的point寫入表中。

例子3:采用通配符,自動(dòng)降低精度采樣數(shù)據(jù)

CREATE CONTINUOUS QUERY "cq_basic_br" ON "transportation"
BEGIN
    SELECT mean(*) INTO "dowmsample_transportation"."autogen".:MEASUREMENT FROM /.*/ GROUP BY time(30m),*
END

查看結(jié)果:
> SELECT * FROM "downsample_transportation"."autogen"."bus_data"
name: bus_data
--------------
time                   mean_complaints   mean_passengers
2016-08-28T07:00:00Z   9                 6.5
2016-08-28T07:30:00Z   9                 7.5
2016-08-28T08:00:00Z   8                 11.5
2016-08-28T08:30:00Z   7                 16

連續(xù)查詢(cq_basic_br),計(jì)算數(shù)據(jù)庫(kù)(transportation)中每張表(這里只有一張表"bus_data"),每30分鐘平均的旅客數(shù)和投訴量,然后將數(shù)據(jù)存入downsample_transportation數(shù)據(jù)庫(kù)中的autogen(RP)中。該cq_basic_br每30分鐘執(zhí)行一遍,然后將每個(gè)小時(shí)的point寫入表中。

例子4:配置CQ的時(shí)間偏移,來采集數(shù)據(jù):

CREATE CONTINUOUS QUERY "cq_basic_offset" ON "transportation"
BEGIN
    SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h,15m)
END

查看結(jié)果:
> SELECT * FROM "average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T07:15:00Z   7.75      //注意時(shí)間是從7:15 -- 8:15
2016-08-28T08:15:00Z   16.75

該CQ(cq_basic_offset),設(shè)置了每整點(diǎn)往后偏移15分鐘,再進(jìn)行每小時(shí)的平均值計(jì)算。比如會(huì)將8 : 15--9: 15,來代替8: 00--9: 00。

高級(jí)語法:

CREATE CONTINUOUS QUERY {cq_name} ON {database_name}
RESAMPLE EVERY {val1} FOR {val2}
BEGIN
    {cq_query}
END

注意: cq_name、database_name、cq_query和之前的基本語法都一致。
EVERY后面帶的時(shí)間,表示每val1點(diǎn)時(shí)間就觸發(fā)一次數(shù)據(jù)采樣,而數(shù)據(jù)的區(qū)間是和cq_query、FOR有關(guān)。在這段時(shí)間內(nèi)每val1點(diǎn)時(shí)間再采集一次。比如cq_query設(shè)置1h,val1設(shè)置為30m,表示在1h內(nèi)會(huì)有兩次數(shù)據(jù)計(jì)算。比如8點(diǎn)--9點(diǎn)之間就會(huì)有兩次數(shù)據(jù)的計(jì)算,第一次計(jì)算是8:30觸發(fā)的,計(jì)算的區(qū)間是8:00--8:30,第二次計(jì)算是9:00觸發(fā)的,計(jì)算的區(qū)間是8:00--9:00。在目的數(shù)據(jù)庫(kù)中,默認(rèn)第二次的計(jì)算結(jié)果會(huì)覆蓋第一次的計(jì)算結(jié)果。
FOR后面帶的時(shí)間,表示修改了cq_query計(jì)算的數(shù)據(jù)區(qū)間,比如cq_query時(shí)間設(shè)置為30m,val2設(shè)置的是1h。那么cq每30m會(huì)觸發(fā)一次數(shù)據(jù)計(jì)算,計(jì)算的區(qū)間是(now-1h)--now。

示例數(shù)據(jù): 給下面的例子使用

name: bus_data
--------------
time                   passengers
2016-08-28T06:30:00Z   2
2016-08-28T06:45:00Z   4
2016-08-28T07:00:00Z   5
2016-08-28T07:15:00Z   8
2016-08-28T07:30:00Z   8
2016-08-28T07:45:00Z   7
2016-08-28T08:00:00Z   8
2016-08-28T08:15:00Z   15
2016-08-28T08:30:00Z   15
2016-08-28T08:45:00Z   17
2016-08-28T09:00:00Z   20

例子1:配置執(zhí)行間隔

CREATE CONTINUOUS QUERY "cq_advanced_every" ON "transportation"
RESAMPLE EVERY 30m
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
END

中間的執(zhí)行過程:
At 8:00, cq_advanced_every executes a query with the time range WHERE time >= "7:00" AND time < "8:00".
cq_advanced_every writes one point to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T07:00:00Z   7

At 8:30, cq_advanced_every executes a query with the time range WHERE time >= "8:00" AND time < "9:00".
cq_advanced_every writes one point to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T08:00:00Z   12.6667

At 9:00, cq_advanced_every executes a query with the time range WHERE time >= "8:00" AND time < "9:00".
cq_advanced_every writes one point to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T08:00:00Z   13.75

查看結(jié)果:
> SELECT * FROM "average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T07:00:00Z   7
2016-08-28T08:00:00Z   13.75

cq_advanced_every在8點(diǎn)--9點(diǎn)執(zhí)行了兩次。第一次8:30觸發(fā),因?yàn)閏q_query設(shè)置了1h,所以數(shù)據(jù)區(qū)間是8: 00--9: 00,但因?yàn)槭窃?:30觸發(fā)的,8: 30--9: 00的數(shù)據(jù)還沒產(chǎn)生呢,所以實(shí)際采集的數(shù)據(jù)區(qū)間是在8: 00--8: 30,即數(shù)據(jù)(8, 15, 15), 計(jì)算的平均值為12.6667;第二次9:00觸發(fā),計(jì)算的區(qū)間是8: 00--9: 00,即數(shù)據(jù)(8, 15, 15, 17),計(jì)算的平均值為13.75.

例子2:配置重采樣的時(shí)間區(qū)間

CREATE CONTINUOUS QUERY "cq_advanced_for" ON "transportation"
RESAMPLE FOR 1h
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
END

采樣過程:
At 8:00 cq_advanced_for executes a query with the time range WHERE time >= "7:00" AND time < "8:00".
cq_advanced_for writes two points to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T07:00:00Z   6.5
2016-08-28T07:30:00Z   7.5

At 8:30 cq_advanced_for executes a query with the time range WHERE time >= "7:30" AND time < "8:30".
cq_advanced_for writes two points to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T07:30:00Z   7.5
2016-08-28T08:00:00Z   11.5

At 9:00 cq_advanced_for executes a query with the time range WHERE time >= "8:00" AND time < "9:00".
cq_advanced_for writes two points to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T08:00:00Z   11.5
2016-08-28T08:30:00Z   16

結(jié)果查詢:
> SELECT * FROM "average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T07:00:00Z   6.5
2016-08-28T07:30:00Z   7.5
2016-08-28T08:00:00Z   11.5
2016-08-28T08:30:00Z   16

該cq_advanced_for,每30m重采樣一次,采樣的區(qū)間是(now-1h -- now), 也就是每觸發(fā)一次執(zhí)行,就會(huì)進(jìn)行兩次計(jì)算。因?yàn)椴蓸拥膮^(qū)間是1h,而需要計(jì)算的是每30m的平均值。

例子3:配置cq的執(zhí)行區(qū)間和時(shí)間范圍

CREATE CONTINUOUS QUERY "cq_advanced_every_for" ON "transportation"
RESAMPLE EVERY 1h FOR 90m
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
END

采樣過程:
At 8:00 cq_advanced_every_for executes a query with the time range WHERE time >= "6:30" AND time < "8:00".
cq_advanced_every_for writes three points to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T06:30:00Z   3
2016-08-28T07:00:00Z   6.5
2016-08-28T07:30:00Z   7.5

At 9:00 cq_advanced_every_for executes a query with the time range WHERE time >= "7:30" AND time < "9:00".
cq_advanced_every_for writes three points to the average_passengers measurement:
name: average_passengers
------------------------
time                   mean
2016-08-28T07:30:00Z   7.5
2016-08-28T08:00:00Z   11.5
2016-08-28T08:30:00Z   16

結(jié)果查詢:
> SELECT * FROM "average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T06:30:00Z   3
2016-08-28T07:00:00Z   6.5
2016-08-28T07:30:00Z   7.5
2016-08-28T08:00:00Z   11.5
2016-08-28T08:30:00Z   16

該cq_advanced_every_for,需要計(jì)算30m的平均值,每1小時(shí)觸發(fā)一次cq執(zhí)行,采樣的數(shù)據(jù)區(qū)間是90m,所以每觸發(fā)一次就會(huì)計(jì)算3次平均值。

例子4:配置CQ的采樣時(shí)間區(qū)間,并且填充空結(jié)果

CREATE CONTINUOUS QUERY "cq_advanced_for_fill" ON "transportation"
RESAMPLE FOR 2h
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h) fill(1000)
END

采樣過程:
At 6:00, cq_advanced_for_fill executes a query with the time range WHERE time >= "4:00" AND time < "6:00".
cq_advanced_for_fill writes nothing to average_passengers; bus_data has no data that fall within that time range. 

At 7:00, cq_advanced_for_fill executes a query with the time range WHERE time >= "5:00" AND time < "7:00".
cq_advanced_for_fill writes two points to average_passengers:
name: average_passengers
------------------------
time                   mean
2016-08-28T05:00:00Z   1000          <------ fill(1000)
2016-08-28T06:00:00Z   3             <------ average of 2 and 4

[…] 

At 11:00, cq_advanced_for_fill executes a query with the time range WHERE time >= "9:00" AND time < "11:00".
cq_advanced_for_fill writes two points to average_passengers:
name: average_passengers
------------------------
2016-08-28T09:00:00Z   20            <------ average of 20
2016-08-28T10:00:00Z   1000          <------ fill(1000)     

At 12:00, cq_advanced_for_fill executes a query with the time range WHERE time >= "10:00" AND time < "12:00".
cq_advanced_for_fill writes nothing to average_passengers; bus_data has no data that fall within that time range.

結(jié)果查詢:
> SELECT * FROM "average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T05:00:00Z   1000
2016-08-28T06:00:00Z   3
2016-08-28T07:00:00Z   7
2016-08-28T08:00:00Z   13.75
2016-08-28T09:00:00Z   20
2016-08-28T10:00:00Z   1000

該cq_advcanced_for_fill,增加了空數(shù)據(jù)區(qū)的默認(rèn)值填充,使用fill(value)來實(shí)現(xiàn)。

連續(xù)查詢使用案例:
1.實(shí)現(xiàn)重采樣和數(shù)據(jù)保留:
使用CQ和retention policy配合達(dá)到該功能??梢越档蛿?shù)據(jù)庫(kù)存儲(chǔ)壓力。

2.預(yù)先計(jì)算來解決費(fèi)時(shí)的查詢:
CQ會(huì)自動(dòng)進(jìn)行重采樣,將高精度的數(shù)據(jù)轉(zhuǎn)換為低精度的數(shù)據(jù)。低精度的數(shù)據(jù)查詢會(huì)耗費(fèi)更少的資源和時(shí)間。

3.替代HAVING條款:
InfluxDB不支持HAVING字段,需要使用CQ+別的命令來實(shí)現(xiàn)替換。
例子:

SELECT mean("bees") FROM "farm" GROUP BY time(30m) HAVING mean("bees") > 20

以上的命令,InfluxDB不支持。其實(shí)就是需要實(shí)現(xiàn)采集30m的平均值,然后取那些大于20的值。
InfluxDB的替代方案:

先創(chuàng)建CQ:

CREATE CONTINUOUS QUERY "bee_cq" ON "mydb" 
BEGIN
    SELECT mean("bees") AS "mean_bees" INTO "aggregate_bees" FROM "farm" GROUP BY time(30m) 
END

該創(chuàng)建的CQ,每30m進(jìn)行bees的平均值計(jì)算,并將結(jié)果寫入aggregate_bees表中的mean_bees field中。

查詢CQ結(jié)果:
這一步就是需要運(yùn)行HAVING mean("bees") > 20這條命令。InfluxDB命令使用如下:

SELECT "mean_bees" FROM "aggregate_bees" WHERE "mean_bees" > 20

4.替代內(nèi)嵌函數(shù):
InfluxDB不支持內(nèi)嵌函數(shù),比如:

SELECT mean(count("bees")) FROM "farm" GROUP BY time(30m)

替換上述方案:

創(chuàng)建CQ:

CREATE CONTINUOUS QUERY "bee_cq" ON "mydb" 
BEGIN
    SELECT count("bees") AS "count_bees" INTO "aggregate_bees" FROM "farm" GROUP BY time(30m) 
END

查詢CQ結(jié)果:
這一步就是需要執(zhí)行mean([...])這條命令,其實(shí)就是計(jì)算某段區(qū)間的count("bees")平均值,如下:

SELECT mean("count_bees") FROM "aggregate_bees" WHERE time >= {start_time} AND time <= {end_time}

Kapacitor是InfluxData的數(shù)據(jù)處理引擎,它可以達(dá)到CQ一樣的功能。參考HERE

InfluxDB使用 數(shù)據(jù)庫(kù)配置

參考Here

Database

1.查詢:

SHOW DATABASES 

2.創(chuàng)建:

CREATE DATABASE {database_name} [WITH [DURATION ] [REPLICATION ] [SHARD DURATION ] [NAME ]]
注:WITH帶的這段屬性,就是Retention Policy的,可以參考它。

3.刪除:

DROP DATABASE {database_name}
RETENTION POLICY

1.查詢:

SHOW RETETION POLICIES

2.創(chuàng)建:

CREATE RETENTION POLICY {retention_policy_name} ON {database_name} DURATION {duration} REPLICATION {n} [SHARD DURATION {duration}] [DEFAULT]

3.修改:

ALTER RETENTION POLICY {rp_name} ON {database_name} DURATION {duration} REPLICATION {n} SHARD DURATION {duration} DEFAULT

4.刪除:

DROP RETENTION POLICY {rp_name} ON {database_name}
CONTINUOUS QUERY:

1.查詢:

SHOW CONTINUOUS QUERY

2.創(chuàng)建:

參考之前的例子,介紹了較多的創(chuàng)建方式。

3.刪除:

DROP CONTINUOUS QUERY {cq_name} ON {database_name}

舉了部分例子,具體的可以再查看官方資料。

API

InfluxDB API提供了較簡(jiǎn)單的方式用于數(shù)據(jù)庫(kù)交互。該API使用了HTTP的方式,并以JSON格式進(jìn)行返回。
下面對(duì)API進(jìn)行介紹:

支持的Endpoints
Endpoint 描述
/ping 使用/ping用于檢查InfluxDB的狀態(tài)或者版本信息
/query 使用/query用于查詢數(shù)據(jù),管理數(shù)據(jù)庫(kù)、rp、users等
/write 使用/write去寫數(shù)據(jù)到數(shù)據(jù)庫(kù)中
/ping

/ping支持GET和HEAD,都可用于獲取指定信息。
定義:

GET http://localhost:8086/ping

HEAD http://localhost:8086/ping

示例:
獲取InfluxDB版本信息:

$ curl -sl -I http://localhost:8086/ping
HTTP/1.1 204 No Content
Request-Id: 245a330d-baba-11e6-8098-000000000000
X-Influxdb-Version: 0.9.4.1
Date: Mon, 05 Dec 2016 07:12:11 GMT
/query

/query支持GET和POST的HTTP請(qǐng)求??捎糜诓樵償?shù)據(jù)和管理數(shù)據(jù)庫(kù)、rp、users。
定義:

GET http://localhost:8086/query

POST http://localhost:8086/query

用法說明:

動(dòng)作 查詢類型
GET 用于所有數(shù)據(jù)的查詢:
SELECT *
SHOW
POST 支持的動(dòng)作如下:
ALTER
CREATE
DELETE
DROP
GRANT
KILL
REVOKE

只有SELECT特殊點(diǎn),支持INTO字段

示例:
1.使用SELECT查詢數(shù)據(jù):

$ curl -G "http://localhost:8086/query?db=mydb" --data-urlencode "q=SELECT * FROM "mymeas""

{"results":[{"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[["2016-05-20T21:30:00Z",12,"1",null],["2016-05-20T21:30:20Z",11,"2",null],["2016-05-20T21:30:40Z",18,null,"1"],["2016-05-20T21:31:00Z",19,null,"3"]]}]}]}

再使用額外的INTO字段:

$ curl -XPOST "http://localhost:8086/query?db=mydb" --data-urlencode "q=SELECT * INTO "newmeas" FROM "mymeas""

{"results":[{"series":[{"name":"result","columns":["time","written"],"values":[["1970-01-01T00:00:00Z",4]]}]}]}

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

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

{"results":[{}]}

Query參數(shù)說明:

參數(shù) 是否可選 描述
chunked=[true or {number_of_points}] 可選 返回批量的points信息,以代替單個(gè)響應(yīng)。設(shè)置成true,InfluxDB返回一批series或者10000個(gè)points;或者設(shè)置對(duì)應(yīng)的points數(shù)量
db={db_name} 必選 設(shè)置數(shù)據(jù)庫(kù)名
epoch=[h,m,s,ms,u,ns] 可選 指定時(shí)間戳的精度,默認(rèn)是ns
p={password} 可選 如果設(shè)置了認(rèn)證,則需要用戶密碼
pretty=true 可選 優(yōu)化輸出格式,設(shè)置之后會(huì)議json格式進(jìn)行輸出,利于調(diào)試
rp={rp_name} 可選 設(shè)置查詢的rp。如果沒有設(shè)置,則查詢默認(rèn)的rp
u={username} 可選 如果設(shè)置了認(rèn)證,則需要用戶密碼

示例1:使用http認(rèn)證來創(chuàng)建數(shù)據(jù)庫(kù):

$ curl -XPOST "http://localhost:8086/query?u=myusername&p=mypassword" --data-urlencode "q=CREATE DATABASE "mydb""

{"results":[{}]}

示例2:使用基礎(chǔ)認(rèn)證來創(chuàng)建數(shù)據(jù)庫(kù):

$ curl -XPOST -u myusername:mypassword "http://localhost:8086/query" --data-urlencode "q=CREATE DATABASE "mydb""

{"results":[{}]}

數(shù)據(jù)請(qǐng)求體:

--data-urlencode "q=< influxDB query >"

可支持多條請(qǐng)求命令: 需要使用分號(hào)(;),來進(jìn)行命令分隔

可支持導(dǎo)入文件的格式進(jìn)行查詢: 如果文件中使用了多條請(qǐng)求命令,則也需要使用分號(hào)(;)進(jìn)行分隔

語法:
curl -F "q=@" -F "async=true" http://localhost:8086/query

以CSV的格式返回請(qǐng)求結(jié)果:

語法:
curl -H "Accept: application/csv" -G "http://localhost:8086/query [...]

支持綁定參數(shù):
該API支持使用WHERE綁定參數(shù),來進(jìn)行指定field values或者tag vaules。

Query語法:
--data-urlencode "q= SELECT [...] WHERE [ < field_key > | < tag_key > ] = $< placeholder_key >"

Map語法:
--data-urlencode "params={"< placeholder_key >":[ < placeholder_float_field_value > | < placeholder_integer_field_value > | "< placeholder_string_field_value >" | < placeholder_boolean_field_value > | "< placeholder_tag_value >" ]}"

示例1:發(fā)送多條Query命令

$ curl -G "http://localhost:8086/query?db=mydb&epoch=s" --data-urlencode "q=SELECT * FROM "mymeas";SELECT mean("myfield") FROM "mymeas""

{"results":[{"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[[1463779800,12,"1",null],[1463779820,11,"2",null],[1463779840,18,null,"1"],[1463779860,19,null,"3"]]}]},{"series":[{"name":"mymeas","columns":["time","mean"],"values":[[0,15]]}]}]}

示例2:以CSV格式返回請(qǐng)求結(jié)果

curl -H "Accept: application/csv" -G "http://localhost:8086/query?db=mydb" --data-urlencode "q=SELECT * FROM "mymeas" LIMIT 3"

name,tags,time,tag1,tag2,value
mymeas,,1478030187213306198,blue,tag2,23
mymeas,,1478030189872408710,blue,tag2,44
mymeas,,1478030203683809554,blue,yellow,101

示例3:通過文件的形式導(dǎo)入Queries

curl -F "[email protected]" -F "async=true" "http://localhost:8086/query"
文本內(nèi)容如下:
CREATE DATABASE mydb;
CREATE RETENTION POLICY four_weeks ON mydb DURATION 4w REPLICATION 1;

示例4:通過WHERE字段指定tag value

curl -G "http://localhost:8086/query?db=mydb" --data-urlencode "q=SELECT * FROM "mymeas" WHERE "mytagkey" = $tag_value" --data-urlencode "params={"tag_value":"mytagvalue1"}"

{"results":[{"series":[{"name":"mymeas","columns":["time","myfieldkey","mytagkey"],"values":[["2016-09-05T18:25:08.479629934Z",9,"mytagvalue1"],["2016-09-05T18:25:20.892472038Z",8,"mytagvalue1"],["2016-09-05T18:25:30.408555195Z",10,"mytagvalue1"],["2016-09-05T18:25:39.108978991Z",111,"mytagvalue1"]]}]}]}

示例5:通過WHERE字段指定數(shù)字區(qū)間

curl -G "http://localhost:8086/query?db=mydb" --data-urlencode "q=SELECT * FROM "mymeas" WHERE "myfieldkey" > $field_value" --data-urlencode "params={"field_value":9}"

{"results":[{"series":[{"name":"mymeas","columns":["time","myfieldkey","mytagkey"],"values":[["2016-09-05T18:25:30.408555195Z",10,"mytagvalue1"],["2016-09-05T18:25:39.108978991Z",111,"mytagvalue1"],["2016-09-05T18:25:46.587728107Z",111,"mytagvalue2"]]}]}]}

示例6:通過WHERE字段指定多個(gè)條件

curl -G "http://localhost:8086/query?db=mydb" --data-urlencode "q=SELECT * FROM "mymeas" WHERE "mytagkey" = $tag_value AND  "myfieldkey" > $field_value" --data-urlencode "params={"tag_value":"mytagvalue2","field_value":9}"

{"results":[{"series":[{"name":"mymeas","columns":["time","myfieldkey","mytagkey"],"values":[["2016-09-05T18:25:46.587728107Z",111,"mytagvalue2"]]}]}]}
/write

/wirte只支持POST的HTTP請(qǐng)求,使用該Endpoint可以寫數(shù)據(jù)到已存在的數(shù)據(jù)庫(kù)中。
定義:
POST http://localhost:8086/write

Query參數(shù)說明:

參數(shù) 是否可選 描述
consistency=[any,one,quorum,all] 可選 設(shè)置point的寫入一致性,默認(rèn)是one.詳細(xì)的請(qǐng)參考HERE
db={db_name} 必選 設(shè)置數(shù)據(jù)庫(kù)名
precision=[h,m,s,ms,u,n] 可選 指定時(shí)間戳的精度,默認(rèn)是ns
p={password} 可選 如果設(shè)置了認(rèn)證,則需要用戶密碼
rp={rp_name} 可選 設(shè)置查詢的rp。如果沒有設(shè)置,則查詢默認(rèn)的rp
u={username} 可選 如果設(shè)置了認(rèn)證,則需要用戶密碼

示例1:使用秒級(jí)的時(shí)間戳,將一個(gè)point寫入數(shù)據(jù)庫(kù)mydb

$ curl -i -XPOST "http://localhost:8086/write?db=mydb&precision=s" --data-binary "mymeas,mytag=1 myfield=90 1463683075"

示例2:將一個(gè)point寫入數(shù)據(jù)庫(kù)mydb,并指定RP為myrp

$ curl -i -XPOST "http://localhost:8086/write?db=mydb&rp=myrp" --data-binary "mymeas,mytag=1 myfield=90"

示例3:使用HTTP認(rèn)證的方式,將一個(gè)point寫入數(shù)據(jù)庫(kù)mydb

$ curl -i -XPOST "http://localhost:8086/write?db=mydb&u=myusername&p=mypassword" --data-binary "mymeas,mytag=1 myfield=91"

示例4:使用基礎(chǔ)認(rèn)證的方式,將一個(gè)point寫入數(shù)據(jù)庫(kù)mydb

$ curl -i -XPOST -u myusername:mypassword "http://localhost:8086/write?db=mydb" --data-binary "mymeas,mytag=1 myfield=91"

數(shù)據(jù)請(qǐng)求體:

--data-binary "< Data in Line Protocol format >"

所有寫入的數(shù)據(jù)必須是二進(jìn)制,且使用Line Protocol格式。

示例1:寫多個(gè)points到數(shù)據(jù)庫(kù)中,需要使用新的一行

$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary "mymeas,mytag=3 myfield=89
mymeas,mytag=2 myfield=34 1463689152000000000"

示例2:通過導(dǎo)入文件的形式,寫入多個(gè)points。需要使用@來指定文件

$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary @data.txt
文件內(nèi)容如下
mymeas,mytag1=1 value=21 1463689680000000000
mymeas,mytag1=1 value=34 1463689690000000000
mymeas,mytag2=8 value=78 1463689700000000000
mymeas,mytag3=9 value=89 1463689710000000000

響應(yīng)的狀態(tài)碼:

HTTP狀態(tài)碼 描述
204 No Content 成功
400 Bad Request 不能接受的請(qǐng)求??赡苁荓ine Protocol語法錯(cuò)誤;寫入錯(cuò)誤的field values類型;等。。
404 Not Fount 不能接受的請(qǐng)求??赡苁菙?shù)據(jù)庫(kù)不存在,或者別的原因
500 Internal Server Error 系統(tǒng)超負(fù)荷了或者明顯受損。可能是用戶企圖去寫一個(gè)不存在的RP。或者別的原因
InfluxDB集群化

InfluxDB v0.12及以上版本已經(jīng)不再開源其集群部分代碼,轉(zhuǎn)為商業(yè)版本功能。
可以參考支持集群的最新版本v0.11。

參考資料

1.官方概念介紹: https://docs.influxdata.com/i...
2.InfluxDB詳解之TSM存儲(chǔ)引擎解析(一): http://blog.fatedier.com/2016...
 InfuxDB詳解之TSM存儲(chǔ)引擎解析(二):http://blog.fatedier.com/2016...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17561.html

相關(guān)文章

  • Kubernetes監(jiān)控Heapster介紹

    摘要:在每個(gè)上都會(huì)運(yùn)行,它會(huì)收集本機(jī)以及容器的監(jiān)控?cái)?shù)據(jù)。使用這里主要介紹的使用,及可獲取的。參考資料文檔文檔及可用在官方文檔中都介紹的比較齊全。我們沒有采用該方式,是考慮到如果和監(jiān)控系統(tǒng)相互依賴,會(huì)導(dǎo)致異常之后,存在監(jiān)控系統(tǒng)無法使用的隱患。 什么是Heapster? Heapster是容器集群監(jiān)控和性能分析工具,天然的支持Kubernetes和CoreOS。Kubernetes有個(gè)出名的監(jiān)控...

    LeviDing 評(píng)論0 收藏0
  • Kubernetes監(jiān)控Heapster源碼分析

    摘要:源碼版本簡(jiǎn)介是下的一個(gè)監(jiān)控項(xiàng)目,用于進(jìn)行容器集群的監(jiān)控和性能分析?;镜墓δ芗案拍罱榻B可以回顧我之前的一篇文章監(jiān)控之介紹。在源碼分析之前我們先介紹的實(shí)現(xiàn)流程,由上圖可以看出會(huì)從各個(gè)上獲取相關(guān)的監(jiān)控信息,然后進(jìn)行匯總發(fā)送給后臺(tái)數(shù)據(jù)庫(kù)。 源碼版本 heapster version: release-1.2 簡(jiǎn)介 Heapster是Kubernetes下的一個(gè)監(jiān)控項(xiàng)目,用于進(jìn)行容器集群的監(jiān)控...

    gclove 評(píng)論0 收藏0
  • 容器監(jiān)控實(shí)踐—cAdvisor

    摘要:在中包含大量的了相關(guān)的信息參考原生監(jiān)控文章的收集器更多源碼參考文章總結(jié)優(yōu)缺點(diǎn)優(yōu)點(diǎn)谷歌開源產(chǎn)品,監(jiān)控指標(biāo)齊全,部署方便,而且有官方的鏡像。 概述 為了解決docker stats的問題(存儲(chǔ)、展示),谷歌開源的cadvisor誕生了,cadvisor不僅可以搜集一臺(tái)機(jī)器上所有運(yùn)行的容器信息,還提供基礎(chǔ)查詢界面和http接口,方便其他組件如Prometheus進(jìn)行數(shù)據(jù)抓取,或者cadvis...

    andycall 評(píng)論0 收藏0
  • 容器監(jiān)控實(shí)踐—cAdvisor

    摘要:在中包含大量的了相關(guān)的信息參考原生監(jiān)控文章的收集器更多源碼參考文章總結(jié)優(yōu)缺點(diǎn)優(yōu)點(diǎn)谷歌開源產(chǎn)品,監(jiān)控指標(biāo)齊全,部署方便,而且有官方的鏡像。 概述 為了解決docker stats的問題(存儲(chǔ)、展示),谷歌開源的cadvisor誕生了,cadvisor不僅可以搜集一臺(tái)機(jī)器上所有運(yùn)行的容器信息,還提供基礎(chǔ)查詢界面和http接口,方便其他組件如Prometheus進(jìn)行數(shù)據(jù)抓取,或者cadvis...

    kbyyd24 評(píng)論0 收藏0
  • Kubernetes v1.0特性解析

    摘要:?jiǎn)栴}是不是定義的一個(gè)的容器集群是只部署在同一個(gè)主機(jī)上楊樂到目前是,同一個(gè)里的是部署在同一臺(tái)主機(jī)的。問題這個(gè)圖里的是安裝在哪里的所有的客戶端以及會(huì)連接這個(gè)嘛楊樂可以任意地方,只要能訪問到集群,會(huì)作為的出口。 kubernetes1.0剛剛發(fā)布,開源社區(qū)400多位貢獻(xiàn)者一年的努力,多達(dá)14000多次的代碼提交,最終達(dá)到了之前預(yù)計(jì)的milestone, 并意味著這個(gè)開源容器編排系統(tǒng)可以正式在...

    HackerShell 評(píng)論0 收藏0
  • kubernetes安裝heapster、influxdb及grafana

    摘要:下載在這里下載修改替換鏡像修改添加,同時(shí)把由改為。因?yàn)榈母械牡臎_突了。修改新增的暴露出來,同時(shí)添加創(chuàng)建配置修改下數(shù)據(jù)源的查看數(shù)據(jù)總結(jié)部署詳解監(jiān)控 下載yaml 在這里下載deploy/kube-config/influxdb 修改yaml 替換鏡像 gcr.io/google_containers/heapster-grafana:v4.0.2 registry.cn-hangzho...

    waterc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<