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
一個measurement
為cpu
,tag
是host
和region
,value
值為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
路徑,引數q
為CREATE 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格式的時間,可以在請求引數裡設定epoc
h引數,其中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