摘要:也是由鍵值對和組成。用于指定數據的備份數量,是表示數據節點的數量。該每小時執行一遍,然后將每個小時的寫入表中。
什么是InfluxDB? InfluxDB介紹
InfluxDB是一款用Go語言編寫的開源分布式時序、事件和指標數據庫,無需外部依賴。
該數據庫現在主要用于存儲涉及大量的時間戳數據,如DevOps監控數據,APP metrics, loT傳感器數據和實時分析數據。
InfluxDB特征:
無結構(無模式):可以是任意數量的列
可以設置metric的保存時間
支持與時間有關的相關函數(如min、max、sum、count、mean、median等),方便統計
支持存儲策略:可以用于數據的刪改。(influxDB沒有提供數據的刪除與修改方法)
支持連續查詢:是數據庫中自動定時啟動的一組語句,和存儲策略搭配可以降低InfluxDB的系統占用量。
原生的HTTP支持,內置HTTP API
支持類似sql語法
支持設置數據在集群中的副本數
支持定期采樣數據,寫入另外的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),稱為Fields。Fields由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,它們是tags。Tags也是由鍵值對(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)功能。
連續查詢主要用在將數據歸檔,以降低系統空間的占用率,但這主要是以降低數據精度為代價。
基本語法:
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
Database1.查詢:
SHOW DATABASES
2.創建:
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.創建:
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}
舉了部分例子,具體的可以再查看官方資料。
APIInfluxDB API提供了較簡單的方式用于數據庫交互。該API使用了HTTP的方式,并以JSON格式進行返回。
下面對API進行介紹:
Endpoint | 描述 |
---|---|
/ping | 使用/ping用于檢查InfluxDB的狀態或者版本信息 |
/query | 使用/query用于查詢數據,管理數據庫、rp、users等 |
/write | 使用/write去寫數據到數據庫中 |
/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請求。可用于查詢數據和管理數據庫、rp、users。
定義:
GET http://localhost:8086/query
POST http://localhost:8086/query
用法說明:
動作 | 查詢類型 |
---|---|
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=@" -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 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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17561.html
摘要:在每個上都會運行,它會收集本機以及容器的監控數據。使用這里主要介紹的使用,及可獲取的。參考資料文檔文檔及可用在官方文檔中都介紹的比較齊全。我們沒有采用該方式,是考慮到如果和監控系統相互依賴,會導致異常之后,存在監控系統無法使用的隱患。 什么是Heapster? Heapster是容器集群監控和性能分析工具,天然的支持Kubernetes和CoreOS。Kubernetes有個出名的監控...
摘要:源碼版本簡介是下的一個監控項目,用于進行容器集群的監控和性能分析。基本的功能及概念介紹可以回顧我之前的一篇文章監控之介紹。在源碼分析之前我們先介紹的實現流程,由上圖可以看出會從各個上獲取相關的監控信息,然后進行匯總發送給后臺數據庫。 源碼版本 heapster version: release-1.2 簡介 Heapster是Kubernetes下的一個監控項目,用于進行容器集群的監控...
摘要:在中包含大量的了相關的信息參考原生監控文章的收集器更多源碼參考文章總結優缺點優點谷歌開源產品,監控指標齊全,部署方便,而且有官方的鏡像。 概述 為了解決docker stats的問題(存儲、展示),谷歌開源的cadvisor誕生了,cadvisor不僅可以搜集一臺機器上所有運行的容器信息,還提供基礎查詢界面和http接口,方便其他組件如Prometheus進行數據抓取,或者cadvis...
摘要:在中包含大量的了相關的信息參考原生監控文章的收集器更多源碼參考文章總結優缺點優點谷歌開源產品,監控指標齊全,部署方便,而且有官方的鏡像。 概述 為了解決docker stats的問題(存儲、展示),谷歌開源的cadvisor誕生了,cadvisor不僅可以搜集一臺機器上所有運行的容器信息,還提供基礎查詢界面和http接口,方便其他組件如Prometheus進行數據抓取,或者cadvis...
摘要:問題是不是定義的一個的容器集群是只部署在同一個主機上楊樂到目前是,同一個里的是部署在同一臺主機的。問題這個圖里的是安裝在哪里的所有的客戶端以及會連接這個嘛楊樂可以任意地方,只要能訪問到集群,會作為的出口。 kubernetes1.0剛剛發布,開源社區400多位貢獻者一年的努力,多達14000多次的代碼提交,最終達到了之前預計的milestone, 并意味著這個開源容器編排系統可以正式在...
摘要:下載在這里下載修改替換鏡像修改添加,同時把由改為。因為的跟中的的沖突了。修改新增的暴露出來,同時添加創建配置修改下數據源的查看數據總結部署詳解監控 下載yaml 在這里下載deploy/kube-config/influxdb 修改yaml 替換鏡像 gcr.io/google_containers/heapster-grafana:v4.0.2 registry.cn-hangzho...
閱讀 3754·2021-08-11 11:16
閱讀 1621·2019-08-30 15:44
閱讀 1995·2019-08-29 18:45
閱讀 2267·2019-08-26 18:18
閱讀 996·2019-08-26 13:37
閱讀 1565·2019-08-26 11:43
閱讀 2109·2019-08-26 11:34
閱讀 372·2019-08-26 10:59