1. 程式人生 > >influxdb 學習

influxdb 學習

InfluxDB 學習

安裝

brew install influxdb

啟動

influxd -config /usr/local/etc/influxdb.conf

入門

$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.2.x
InfluxDB shell 1.2.x
>
  • InfluxDB的HTTP介面預設起在8086上,所以inlux預設也是連的本地的8086埠,你可以通過influx --help來看怎麼修改預設值。
  • -precision引數表明了任何返回的時間戳的格式和精度,在上面的例子裡,rfc3339是讓InfluxDB返回RFC339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)的時間戳。

用exit 退出命令列。

建立資料庫

CREATE DATABASE <db-name>

例如:

CREATE DATABASE mydb

檢視資料庫

SHOW DATABASES

系統自帶的_internal資料庫。

  • _internal資料庫是用來儲存InfluxDB內部的實時監控資料的。
> show databases
name: databases
name
----
_internal
mydb

查看錶

show measurements

使用資料庫

USE <db-name>

如:

> USE mydb
Using database mydb

讀寫資料

現在我們已經有了一個數據庫,那麼InfluxDB就可以開始接收讀寫了。

InfluxDB裡儲存的資料被稱為時間序列資料

時序資料有零個或多個數據點,每一個都是一個指標值。

資料點包括time(一個時間戳),measurement(例如cpu_load),至少一個k-v格式的field(也即指標的數值例如 “value=0.64”或者“temperature=21.2”),零個或多個tag,其一般是對於這個指標值的元資料(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。

measurement類比於SQL裡面的table,其主鍵索引總是時間戳。tag

field是在table裡的其他列,tag是被索引起來的,field沒有。

在InfluxDB裡,你可以有幾百萬的measurements,你不用事先定義資料的scheme,並且null值不會被儲存。

將資料點寫入InfluxDB,只需要遵守如下的行協議:

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

例如

cpu,host=serverA,region=us_west value=0.64

使用CLI插入單條的時間序列資料到InfluxDB中,用INSERT後跟資料點:

INSERT cpu,host=serverA,region=us_west value=0.64

一個measurementcputaghostregionvalue值為0.64的資料點被寫入了InfluxDB中。

> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time                        host    region  value
----                        ----    ------  -----
2019-04-16T02:14:49.279748Z serverA us_west 0.64

說明:我們在寫入的時候沒有包含時間戳,當沒有帶時間戳的時候,InfluxDB會自動新增本地的當前時間作為它的時間戳。

支援golang樣式的正則

> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9

使用

寫入資料

向InfluxDB寫資料的方式,包括命令列、客戶端還有一些像Graphite有一樣資料格式的外掛

使用HTTP介面建立資料庫

使用POST方式傳送到URL的/query路徑,引數qCREATE DATABASE <new_database_name>

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

使用HTTP介面寫資料

通過HTTP介面POST資料到/write路徑是我們往InfluxDB寫資料的主要方式

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'

measurement為cpu_load_short,tag的key為host和region,對應tag的value是server01和us-west,field的key是value,對應的數值為0.64,而時間戳是1434055562000000000。

POST的請求體我們稱之為Line Protocol,包含了你希望儲存的時間序列資料。它的組成部分有measurement,tags,fields和timestamp。measurement是InfluxDB必須的, 嚴格地說,tags是可選的,但是對於大部分資料都會包含tags用來區分資料的來源,讓查詢變得容易和高效。 tag的key和value都必須是字串。fields的key也是必須的,而且是字串,預設情況下field的value是float型別的。 timestamp在這個請求行的最後,是一個從1/1/1970 UTC開始到現在的一個納秒級的Unix time,它是可選的,如果不傳, InfluxDB會使用伺服器的本地的納米級的timestamp來作為資料的時間戳,注意無論哪種方式,在InfluxDB中的timestamp只能是UTC時間。

同時寫入多個點

同時傳送多個數據點到多個series(在InfluxDB中measurement加tags組成了一個series),可以用新的行來分開這些資料點。這種批量傳送的方式可以獲得更高的效能。

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'

寫了三個資料點到mydb資料庫中。第一個點屬於series其measurement為cpu_load_short,tag是host=server02, timestamp是server本地的時間戳;第二個點同樣是measurement為cpu_load_short, 但是tag為host=server02,region=us-west,且有明確timestamp為1422568543702900257的series; 第三個資料點和第二個的timestamp是一樣的,但是series不一樣,其measurement為cpu_load_short, tag為direction=in,host=server01,region=us-west。

寫入檔案中的資料

可以通過curl的@filename來寫入檔案中的資料,且這個檔案裡的資料的格式需要滿足InfluxDB那種行的語法。

正確的檔案(cpu_data.txt)的例子

cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257

把cpu_data.txt裡的資料寫入mydb資料庫

curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt

如果你的資料檔案的資料點大於5000時,你必須把他們拆分到多個檔案再寫入InfluxDB。 因為預設的HTTP的timeout的值為5秒,雖然5秒之後,InfluxDB仍然會試圖把這批資料寫進去,但是會有資料丟失的風險

無模式設計

InfluxDB是一個無模式(schemaless)的資料庫,你可以在任意時間新增measurement,tags和fields。注意:如果你試圖寫入一個和之前的型別不一樣的資料(例如,filed欄位之前接收的是數字型別,現在寫了個字串進去),那麼InfluxDB會拒絕這個資料。

對於REST的一個說明

InfluxDB API並不是RESTful的。InfluxDB也只提供了三個API。

HTTP返回值

  • 2xx:如果你寫了資料後收到HTTP 204 No Content,說明寫入成功了!
  • 4xx:表示InfluxDB不知道你發的是什麼鬼。
  • 5xx:系統過載或是應用受損。

查詢資料

使用HTTP介面查詢資料

過傳送一個GET請求到/query路徑,並設定URL的db引數為目標資料庫,設定URL引數q為查詢語句。

curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"

多個查詢

在一次API呼叫中傳送多個InfluxDB的查詢語句,可以簡單地使用分號;分隔每個查詢,

curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west';SELECT count(\"value\") FROM \"cpu_load_short\" WHERE \"region\"='us-west'"

其他可選引數

時間戳格式

在InfluxDB中的所有資料都是存的UTC時間,時間戳預設返回RFC3339格式的納米級的UTC時間,例如2015-08-04T19:05:14.318570484Z,如果你想要返回Unix格式的時間,可以在請求引數裡設定epoch引數,其中epoch可以是[h,m,s,ms,u,ns]之一。例如返回一個秒級的epoch:

curl -G 'http://localhost:8086/query' --data-urlencode "db=mydb" --data-urlencode "epoch=s" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
{"results":[{"statement_id":0,"series":[{"name":"cpu_load_short","columns":["time","value"],"values":[[1422568543,2],[1422568543,0.55]]}]}]}
認證

InfluxDB裡面的認證預設是關閉的,

最大行限制

可選引數max-row-limit允許使用者限制返回結果的數目,以保護InfluxDB不會在聚合結果的時候導致的記憶體耗盡。

在1.2.0和1.2.1版本中,InfluxDB預設會把返回的數目截斷為10000條,如果有超過10000條返回,那麼返回體裡面會包含一個"partial":true的標記。該預設設定可能會導致Grafana面板出現意外行為,如果返回值大於10000時,這個面板就會看到截斷/部分資料。

在1.2.2版本中,max-row-limit引數預設被設定為了0,這表示說對於返回值沒有限制。

這個最大行的限制僅僅作用於非分塊(non-chunked)的請求中,分塊(chunked)的請求還是返回無限制的資料。

分塊(chunking)

可以設定引數chunked=true開啟分塊,使返回的資料是流式的batch,而不是單個的返回。返回結果可以按10000資料點被分塊,為了改變這個返回最大的分塊的大小,可以在查詢的時候加上chunk_size引數,例如返回資料點是每20000為一個批次。

curl -G 'http://localhost:8086/query' --data-urlencode "db=deluge" --data-urlencode "chunked=true" --data-urlencode "chunk_size=20000" --data-urlencode "q=SELECT * FROM liters"

取樣和資料保留

InfluxDB提供了兩個特性——連續查詢(Continuous Queries簡稱CQ)和保留策略(Retention Policies簡稱RP),分別用來處理資料取樣和管理老資料的。

Continuous Query (CQ)是在資料庫內部自動週期性跑著的一個InfluxQL的查詢,CQs需要在SELECT語句中使用一個函式,並且一定包括一個GROUP BY time()語句。

Retention Policy (RP)是InfluxDB資料架構的一部分,它描述了InfluxDB儲存資料的時間。InfluxDB會比較伺服器本地的時間戳和你資料的時間戳,並刪除比你在RPs裡面用DURATION設定的更老的資料。單個數據庫中可以有多個RPs但是每個資料的RPs是唯一的。

我的部落格即將同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1u7stsfxrqbez

參考

InfluxDB中文文件

Telegraf+Influxdb+Grafana