Kubernetes監控之InfluxDB

什麼是InfluxDB?

InfluxDB介紹

InfluxDB是一款用Go語言編寫的開源分佈式時序、事件和指標數據庫,無需外部依賴。
該數據庫如今主要用於存儲涉及大量的時間戳數據,如DevOps監控數據,APP metrics, loT傳感器數據和實時分析數據。
InfluxDB特徵:web

  • 無結構(無模式):能夠是任意數量的列sql

  • 能夠設置metric的保存時間數據庫

  • 支持與時間有關的相關函數(如min、max、sum、count、mean、median等),方便統計json

  • 支持存儲策略:能夠用於數據的刪改。(influxDB沒有提供數據的刪除與修改方法)數據結構

  • 支持連續查詢:是數據庫中自動定時啓動的一組語句,和存儲策略搭配能夠下降InfluxDB的系統佔用量。app

  • 原生的HTTP支持,內置HTTP APIcurl

  • 支持相似sql語法async

  • 支持設置數據在集羣中的副本數分佈式

  • 支持按期採樣數據,寫入另外的measurement,方便分粒度存儲數據。函數

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

關鍵概念

InfluxDB關鍵概念列表:

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

下面舉個例子進行概念介紹:
咱們虛擬一組數據,其中有一張數據表(measurement)爲census,該表記錄了由兩個科學家(langstroth和perpetua)在兩個不一樣的位置(1和2),統計了butterflies和honeybees的數據,時間段是2015-08-18 00: 00:00 -- 2015-08-18 06: 12:00. 咱們假設這些數據屬於叫my_database的數據庫(database),且該數據存儲在autogen的存儲策略(retention policy)中。
數據展現以下:

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

咱們針對數據來進行概念分析:
InfluxDB是時序數據庫,因此怎麼都繞不開時間,第一縱列time存儲着時間戳,而時間戳是與數據進行關聯,這樣才能將時間和數據進行展現。
接下去兩縱列(butterflies和honeybees),稱爲FieldsFields由field keys和field values組成。butterflies和honeybees兩個字符串就是field keys;而butterflies這個field key對應的field values就是12 -- 7, honeybees這個field key對應的field values就是23 -- 22。
Field values就是你的數據,它們能夠是string、float、int或者bool等。由於influxdb是時序數據庫,因此field values老是要和timestamp關聯。

field set是在數據層之上應用概念,由field key和field value組成了field set,如這裏有8組field set數據:

  • 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的必要結構,但也須要注意field是沒有索引的。

剩下的兩個縱列是location和scientist,它們是tagsTags也是由鍵值對(tag keys和tag values)組成。這裏的tag keys是字符串location和scientist;location 這個tag key有兩個tag values: 1和2;scientist這個tag key也有兩個tag values:perpetua和langstroth。
tag set也是數據之上的概念,是不一樣的tag key-value組合,這裏有4組tag sets數據:

  • location = 1, scientist = langstroth

  • location = 2, scientist = langstroth

  • location = 1, scientist = perpetua

  • location = 2, scientist = perpetua

Tags是可選的參數,也就是說你存儲的數據結構中不必定非要帶tags,可是它很是好用,由於能夠索引。通常都會經過tags來查詢數據會快不少。

measurement包含了tags、fields和time,就相似於傳統數據庫的表。一個measurement能夠屬於不一樣的retention policy(存儲策略),存儲策略描述了InfluxDB怎麼去保持數據(DURATION),須要在集羣中存儲多少份數據副本(REPLICATION)。
示例中的數據都屬於census這個measurement,而該measurement又屬於autogen這個存儲策略。InfluxDB通常都會建立一個default存儲策略,它有無限長的持續時間和等於1的副本數。

咱們瞭解過了measurements、tag sets和retention policies的概念後,是時候該知道series了。
在同一個database中,series由retention policy、measurement、tag sets三部分組成,在咱們上面的數據中有以下4個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

同一個Series的數據在物理上會按照時間順序排列存儲在一塊兒。
Series的key爲measurement + 全部tags的序列化字符串。
代碼結構以下:

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

介紹完Series後,就能夠解釋point了。point是在一個series中有相同時間戳的field set,也能夠理解如表裏的一行數據。示例中一個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)進行定義。而這個point的時間戳則是2015-08-18T 00: 00: 00Z。

InfluxDB Database能夠有多個users、continuous queries、retention policy、measurement。由於InfluxDB是一個結構化的數據庫,咱們能夠輕鬆的去新增measurements、tags、fields。

高級概念

Retention Policy

以前講關鍵性概念時有簡單介紹了RP,這裏會進行較詳細的介紹。
InfluxDB的數據保留策略(RP)是用來定義數據在數據庫中存放的時間,或者定義保存某個期間的數據。
RP在InfluxDB中是比較重要的概念,由於InfluxDB自己是沒有提供數據的刪除操做,因此須要經過定義RP來控制數據量的問題。
(一個數據庫能夠有多個RP,可是每一個RP必須是獨一無二的。)

在具體介紹RP以前,先介紹下另一個跟RP相關的基礎概念(shard)。
shard:
每一個RP下面會存在不少shard,每一個shard都存儲了實際編碼和壓縮數據,而且不重複。例如你在建立RP時指定了shard duration爲1h,那麼7--8點存入shard_group0,8--9點就會存入shard_group1中。因此shard纔是真實存儲InfluxDB數據的地方。
每一個shard都屬於惟一一個shard group,一個group中會有多個shard;而每一個shard包含一組特定的series;全部的points都落在給定的series中,而series是都落在給定的shard group中;

問題1:每一個shard group指定了一段時間區域,並且其中有多個shard;每一個shard包含一組特定的series。那麼shard中存的數據是怎麼區分的?series是由RP、meansurement、tags組成,那麼shard的區分是根據tags??

shard duration:
shard duration決定了每一個shard group存放數據的時間區域。這段時間是在定義RP時由"SHARD DURATION"字段決定。
例如你建立RP時指定了SHARD DURATION爲1w,那麼每一個shard group的時間跨度就爲1w,它將包含全部在這一週時間戳內的points。

OK,大概瞭解了shard以後,繼續回到Retention Policy。

當你建立一個數據庫時,InfluxDB會自動給你建立一個叫"autogen"的retention Policy,這個RP的數據保留時間是無限。
1.建立RP語法:

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

注:
DURATION: 用於描述數據保留時間。可設置的時間區間是1h -- INF(無窮大)。
REPLICATION: 用於指定數據的備份數量,n是表示數據節點的數量。
SHARD DURATION: 用於指定shard group的時間區域,這個字段的duration是不支持INF的。默認狀況下,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: 可選參數,用於指定使用新的RP來做爲數據庫的默認RP。(具體新在哪?須要進一步查看)

2.修改RP語法:

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

注:
後面的參數字段都同樣,主要差異就在於關鍵字段:ALTER RETENTION POLICY

3.刪除RP語法:

DROP RETENTION POLICY {rp_name} ON {database_name}

注:
即便你企圖去刪除一個不存在的rp,命令返回值也是空,不會返回一個錯誤碼。

Continuous Queries

以前咱們介紹了數據保存策略,數據超過保存策略裏指定的時間以後,就會被刪除。但咱們不想徹底刪除這些數據,好比咱們想把每秒的監控數據至少保留成每小時,就須要用到連續查詢(Continuous Queries)功能。
連續查詢主要用在將數據歸檔,以下降系統空間的佔用率,但這主要是以下降數據精度爲代價。
基本語法:

CREATE CONTINUOUS QUERY {cq_name} ON {database_name}
BEGIN
    {cq_query}
END
注:cq_name表示建立的Continuous query的名字;database_name表示要操做的數據庫。

cq_query是操做函數,以下:
SELECT {function[s]} INTO {destnation_measurement} FROM {measurement} [WHERE {stuff}] GROUP BY time({interval})[,{tag_key[s]}]
注:destnation_measurement表示新生成的數據存放的表;measurement表示數據查詢的表;
GROUP BY time表示採樣分析的數據時間,好比設置1h,若是當前是17:00,那麼須要計算的數據時間就是16:00 -- 16:59。

例子1: 自動下降精度來採樣數據

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

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

連續查詢(cq_basic)經過在數據庫"transportation"中的"bus_data"表,計算每小時平均的旅客數,而後在該數據庫中新建"average_passengers"表,並將數據存入該表中。該cq_basic每小時執行一遍,而後將每一個小時的point寫入表中。

例子2:自動下降精度來採樣數據,並將數據存入另一個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

查看結果:
> 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

連續查詢(cq_basic_rp)經過在數據庫"transportation"中的"bus_data"表,計算每小時平均的旅客數,而後將數據存入transportation數據庫中的three_weeks(RP)的average_passengers表中。該cq_basic_rp每小時執行一遍,而後將每一個小時的point寫入表中。

例子3:採用通配符,自動下降精度採樣數據

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

查看結果:
> 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

連續查詢(cq_basic_br),計算數據庫(transportation)中每張表(這裏只有一張表"bus_data"),每30分鐘平均的旅客數和投訴量,而後將數據存入downsample_transportation數據庫中的autogen(RP)中。該cq_basic_br每30分鐘執行一遍,而後將每一個小時的point寫入表中。

例子4:配置CQ的時間偏移,來採集數據:

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

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

該CQ(cq_basic_offset),設置了每整點日後偏移15分鐘,再進行每小時的平均值計算。好比會將8 : 15--9: 15,來代替8: 00--9: 00。

高級語法:

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

注意: cq_name、database_name、cq_query和以前的基本語法都一致。
EVERY後面帶的時間,表示每val1點時間就觸發一次數據採樣,而數據的區間是和cq_query、FOR有關。在這段時間內每val1點時間再採集一次。好比cq_query設置1h,val1設置爲30m,表示在1h內會有兩次數據計算。好比8點--9點之間就會有兩次數據的計算,第一次計算是8:30觸發的,計算的區間是8:00--8:30,第二次計算是9:00觸發的,計算的區間是8:00--9:00。在目的數據庫中,默認第二次的計算結果會覆蓋第一次的計算結果。
FOR後面帶的時間,表示修改了cq_query計算的數據區間,好比cq_query時間設置爲30m,val2設置的是1h。那麼cq每30m會觸發一次數據計算,計算的區間是(now-1h)--now。

示例數據: 給下面的例子使用

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:配置執行間隔

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

中間的執行過程:
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

查看結果:
> 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點--9點執行了兩次。第一次8:30觸發,由於cq_query設置了1h,因此數據區間是8: 00--9: 00,但由於是在8:30觸發的,8: 30--9: 00的數據還沒產生呢,因此實際採集的數據區間是在8: 00--8: 30,即數據(8, 15, 15), 計算的平均值爲12.6667;第二次9:00觸發,計算的區間是8: 00--9: 00,即數據(8, 15, 15, 17),計算的平均值爲13.75.

例子2:配置重採樣的時間區間

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

結果查詢:
> 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重採樣一次,採樣的區間是(now-1h -- now), 也就是每觸發一次執行,就會進行兩次計算。由於採樣的區間是1h,而須要計算的是每30m的平均值。

例子3:配置cq的執行區間和時間範圍

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

結果查詢:
> 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,須要計算30m的平均值,每1小時觸發一次cq執行,採樣的數據區間是90m,因此每觸發一次就會計算3次平均值。

例子4:配置CQ的採樣時間區間,而且填充空結果

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.

結果查詢:
> 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,增長了空數據區的默認值填充,使用fill(value)來實現。

連續查詢使用案例:
1.實現重採樣和數據保留:
使用CQ和retention policy配合達到該功能。能夠下降數據庫存儲壓力。

2.預先計算來解決費時的查詢:
CQ會自動進行重採樣,將高精度的數據轉換爲低精度的數據。低精度的數據查詢會耗費更少的資源和時間。

3.替代HAVING條款:
InfluxDB不支持HAVING字段,須要使用CQ+別的命令來實現替換。
例子:

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

以上的命令,InfluxDB不支持。其實就是須要實現採集30m的平均值,而後取那些大於20的值。
InfluxDB的替代方案:

  • 先建立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

該建立的CQ,每30m進行bees的平均值計算,並將結果寫入aggregate_bees表中的mean_bees field中。

  • 查詢CQ結果:
    這一步就是須要運行HAVING mean("bees") > 20這條命令。InfluxDB命令使用以下:

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

4.替代內嵌函數:
InfluxDB不支持內嵌函數,好比:

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

替換上述方案:

  • 建立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結果:
    這一步就是須要執行mean([...])這條命令,其實就是計算某段區間的count("bees")平均值,以下:

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

Kapacitor是InfluxData的數據處理引擎,它能夠達到CQ同樣的功能。參考HERE

InfluxDB使用

數據庫配置

參考Here

Database

1.查詢:

SHOW DATABASES

2.建立:

CREATE DATABASE {database_name} [WITH [DURATION <duration>] [REPLICATION <n>] [SHARD DURATION <duration>] [NAME <retention-policy-name>]]
注:WITH帶的這段屬性,就是Retention Policy的,能夠參考它。

3.刪除:

DROP DATABASE {database_name}

RETENTION POLICY

1.查詢:

SHOW RETETION POLICIES

2.建立:

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.建立:

參考以前的例子,介紹了較多的建立方式。

3.刪除:

DROP CONTINUOUS QUERY {cq_name} ON {database_name}

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

API

InfluxDB API提供了較簡單的方式用於數據庫交互。該API使用了HTTP的方式,並以JSON格式進行返回。
下面對API進行介紹:

支持的Endpoints

Endpoint 描述
/ping 使用/ping用於檢查InfluxDB的狀態或者版本信息
/query 使用/query用於查詢數據,管理數據庫、rp、users等
/write 使用/write去寫數據到數據庫中

/ping

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

示例:
獲取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請求。可用於查詢數據和管理數據庫、rp、users。
定義:

用法說明:

動做 查詢類型
GET 用於全部數據的查詢:
SELECT *
SHOW
POST 支持的動做以下:
ALTER
CREATE
DELETE
DROP
GRANT
KILL
REVOKE

只有SELECT特殊點,支持INTO字段

示例:
1.使用SELECT查詢數據:

$ 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.建立數據庫:

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

{"results":[{}]}

Query參數說明:

參數 是否可選 描述
chunked=[true or {number_of_points}] 可選 返回批量的points信息,以代替單個響應。設置成true,InfluxDB返回一批series或者10000個points;或者設置對應的points數量
db={db_name} 必選 設置數據庫名
epoch=[h,m,s,ms,u,ns] 可選 指定時間戳的精度,默認是ns
p={password} 可選 若是設置了認證,則須要用戶密碼
pretty=true 可選 優化輸出格式,設置以後會議json格式進行輸出,利於調試
rp={rp_name} 可選 設置查詢的rp。若是沒有設置,則查詢默認的rp
u={username} 可選 若是設置了認證,則須要用戶密碼

示例1:使用http認證來建立數據庫:

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

{"results":[{}]}

示例2:使用基礎認證來建立數據庫:

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

{"results":[{}]}

數據請求體:

--data-urlencode 'q=< influxDB query >'
  • 可支持多條請求命令: 須要使用分號(;),來進行命令分隔

  • 可支持導入文件的格式進行查詢: 若是文件中使用了多條請求命令,則也須要使用分號(;)進行分隔

    語法:
    curl -F "q=@<path_to_file>" -F "async=true" http://localhost:8086/query
  • 以CSV的格式返回請求結果:

    語法:
    curl -H "Accept: application/csv" -G 'http://localhost:8086/query [...]
  • 支持綁定參數:
    該API支持使用WHERE綁定參數,來進行指定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:發送多條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格式返回請求結果

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:經過文件的形式導入Queries

curl -F "q=@queries.txt" -F "async=true" 'http://localhost:8086/query'
文本內容以下:
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字段指定數字區間

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字段指定多個條件

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請求,使用該Endpoint能夠寫數據到已存在的數據庫中。
定義:
POST http://localhost:8086/write

Query參數說明:

參數 是否可選 描述
consistency=[any,one,quorum,all] 可選 設置point的寫入一致性,默認是one.詳細的請參考HERE
db={db_name} 必選 設置數據庫名
precision=[h,m,s,ms,u,n] 可選 指定時間戳的精度,默認是ns
p={password} 可選 若是設置了認證,則須要用戶密碼
rp={rp_name} 可選 設置查詢的rp。若是沒有設置,則查詢默認的rp
u={username} 可選 若是設置了認證,則須要用戶密碼

示例1:使用秒級的時間戳,將一個point寫入數據庫mydb

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

示例2:將一個point寫入數據庫mydb,並指定RP爲myrp

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

示例3:使用HTTP認證的方式,將一個point寫入數據庫mydb

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

示例4:使用基礎認證的方式,將一個point寫入數據庫mydb

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

數據請求體:

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

全部寫入的數據必須是二進制,且使用Line Protocol格式。

示例1:寫多個points到數據庫中,須要使用新的一行

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

示例2:經過導入文件的形式,寫入多個points。須要使用@來指定文件

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

響應的狀態碼:

HTTP狀態碼 描述
204 No Content 成功
400 Bad Request 不能接受的請求。多是Line Protocol語法錯誤;寫入錯誤的field values類型;等。。
404 Not Fount 不能接受的請求。多是數據庫不存在,或者別的緣由
500 Internal Server Error 系統超負荷了或者明顯受損。多是用戶企圖去寫一個不存在的RP。或者別的緣由

InfluxDB集羣化

InfluxDB v0.12及以上版本已經再也不開源其集羣部分代碼,轉爲商業版本功能。
能夠參考支持集羣的最新版本v0.11。

參考資料

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

相關文章
相關標籤/搜索