InfluxDB
是一個時間序列數據庫(TSDB
), 被設計用來處理高寫入、高查詢負載,是 TICK 的一部分。linux
TSDB
是針對時間戳或時間序列數據進行優化的數據庫,專門爲處理帶有時間戳的度量和事件或度量而構建的。
而時間序列數據能夠是隨時間跟蹤、監視、下采樣和聚合的度量或事件,如服務器指標、應用程序性能、網絡數據、傳感器數據以及許多其餘類型的分析數據。sql
Go
編寫,可以但文件運行,沒有依賴HTTP
讀寫接口Graphite=, =collectd
和 OpenTSDB
SQL
語言查詢聚合數據Tag
進行快速高效的查詢Retention Policy
), 可以自動清理舊數據注意: 開源版本的 InfluxDB
只運行在單個節點上,如需更好的性能或避免單點故障,請使用企業版。shell
sudo apt install influxdb influxdb-cli
數據庫
yaourt -S influxdb
或 sudo pacman -S influxdb
服務器
其餘請參見:Installing InfluxDB網絡
InfluxDB
的配置文件爲: /etc/influxdb/influxdb.conf
,選項詳情請參見:Configuration Settings,這裏就不在贅述。curl
systemctl start/stop influxdb.service
ide
使用 influx
命令鏈接數據庫,參看其幫組手冊瞭解使用方法函數
CREATE DATABASE <name>
性能
DROP DATABASE <name>
SHOW DATABASES
USE <name>
InfluxDB
中使用 measurement
表示表, tags
表示表的元數據, fields
表示數據。
表的 scheme
不用定義, null
值也不會被存儲。
tag
可理解爲表中須要索引的列, field
是不須要索引的列, point
表示一條記錄。tags
之間或 fields
之間使用 ','
分割, 而 tags
與 fields
之間使用空格分割。
DROP MEASUREMENTS <name>
SHOW MEASUREMENTS
寫入數據
point
寫入的語法以下:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
插入一條 cpu load
的數據: INSERT cpu_load,machine=001,region=ch value=0.56
,
這就向名爲 cpu_load
的 measurement
中添加了 tags
爲 machine
和 region
, fields
爲 value
的 point
。
不指定 timestamp
時,默認會使用 本地的當前時間 做爲 timestamp
。
查詢數據
查詢語法:
SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]
查詢語句中必需要有 field
存在 ,查詢語句還支持 Go
風格的正則,下面給出一些例子。
SELECT * FROM cpu_load
查詢 cpu_load
中的全部 fields
和 tags
SELECT *::field FROM cpu_load
查詢 cpu_load
中的全部 fields
SELECT value,machine FROM cpu_load
只查詢 value
與 machine
SELECT value::field,machine::tag FROM cpu_load
只查詢 value
與 machine
,並限定了類型,若是類型錯誤將返回 null
,若是全部查詢字段的類型都錯誤將沒有 point
返回
SELECT * FROM /.*/
查詢全部表中的全部字段
**注意:** `WHERE` 語句後的值不爲數字的,必須引發來。 更多用法參見: [Data exploration using InfluxQL](https://docs.influxdata.com/influxdb/v1.7/query%5Flanguage/data%5Fexploration/) 。
Point
InfluxDB
不支持 Point
的刪除操做,但能夠經過 Retention Policy
清理 Point
。
SERIES
是 measurement,<tag1>,<tag2>...
的集合,如以前的寫入的 SERIES
就是 cpu_load,machine,region
查看語法:
SHOW SERIES FROM [measurement],[tag1],[tag2]...
FROM
能夠不加,如:
SHOW SERIES
顯示數據庫中全部的 series
SHOW SERIES FROM cpu_load
顯示錶 cpu_load
中的全部 series
DROP
DROP
將刪除全部的記錄,並刪除全部的索引,語法:
DROP SERIES FROM <measurement> WHERE [condition]
DELETE
DELETE
將刪除全部的記錄,但不會刪除索引,並支持在 WHERE
語句中使用 =timestamp=,語法:
DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]~
連續查詢(Continuous Queries
簡稱 CQ
)是 InfluxQL
對實時數據自動週期運行的查詢,而後把查詢結果寫入到指定的 measurement
中。
語法以下:
CREATE CONTINUOUS QUERY <cq_name> ON <database_name> BEGIN <cq_query> END
刪除語法: DROP CONTINUOUS QUERY <cq_name> ON <database_name>
cq_query
須要一個函數,一個 INTO
子句和一個 GROUP BY time()
子句:
SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]
注意: 在 WHERE
子句中, cq_query
不須要時間範圍。 InfluxDB
在執行 CQ
時自動生成 cq_query
的時間範圍。cq_query
的 WHERE
子句中的任何用戶指定的時間範圍將被系統忽略。
如建立一個一分鐘採樣一次 cpu_load
並寫入 cpu_load_1min
表的連續查詢:
CREATE CONTINUOUS QUERY "cpu_load_1min" ON "learn_test" BEGIN SELECT mean("value") INTO "cpu_load_1min" FROM "cpu_load" GROUP BY time(1m) END
value
將以 mean
爲名保存在 cpu_load_1min
中。
更多高級用法參加: InfluxQL Continuous Queries
InfluxDB
是沒有提供直接刪除數據記錄的方法,可是提供數據保存策略,主要用於指定數據保留時間,超過指定時間,就刪除這部分數據。
能夠有多個 RP
並存,但 default
代表默認策略。
更多用法參見: Database management using InfluxQL 。
SHOW RETENTION POLICY ON <database name>
建立
建立語法:
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
REPLICATION
子句肯定每一個點在集羣中存儲多少個獨立副本,其中 n
是數據節點的數量,對單節點實例無效。
碎片持續時間子句肯定碎片組覆蓋的時間範圍,是一個 duration
文字,不支持 INF (infinite) duration
。這個設置是可選的。
默認狀況下,碎片組的持續時間由保留策略的持續時間決定:
RP Duration | Shard Duration |
---|---|
< 2 days | 1 hour |
>= 2 days and <= 6 months | 1 day |
> 6 months | 7 days |
若是 RP Duration
大於 0s
小於 1 hour
, Shard Duration
仍將設置爲 1 hour
。
DROP RETENTION POLICY <rp_name>
修改
ALTER RETENTION POLICY <rp_name> ON <database name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] DEFAULT
/query
數據主要使用 query
接口查詢,下面給出一些常見用法,而更多用法參見: Querying data with the HTTP API 。
建立數據庫
POST
請求可用於建立數據庫,如:
curl -X POST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE <database name>"
查詢
curl -X GET http://localhost:8086/query?pretty=true --data-urlencode 'db=<database name>' --data-urlencode 'q=SELECT "field1","tag1"... FROM <measurement> WHERE <condition>'
多個查詢
多個查詢語句間用 ;
分割,如:
curl -X GET http://localhost:8086/query?pretty=true --data-urlencode 'db=<database name>' --data-urlencode 'q=SELECT "field1","tag1"... FROM <measurement> WHERE <condition>;SELECT fields FROM <measurement>'
最大行限制(max-row-limit
) 容許使用者限制返回結果的數目,以保護InfluxDB不會在聚合結果的時候致使的內存耗盡。
分塊(chunking) 能夠設置參數 chunked=true
開啓分塊,使返回的數據是流式的 batch
,而不是單個的返回。返回結果能夠按 100
數據點被分塊,爲了改變這個返回最大的分塊的大小,
能夠在查詢的時候加上 chunk_size
參數,例如返回數據點是每 20000
爲一個批次。
curl -X GET 'http://localhost:8086/query' --data-urlencode "db=<name>" --data-urlencode "chunked=true" --data-urlencode "chunk_size=100" --data-urlencode "q=SELECT * FROM cpu_load"
/write
發送 POST
請求是寫入數據的主要方式,,下面給出一些常見用法,而更多用法參見: Writing data with the HTTP API 。
插入一條 Point
curl -X POST http://localhost:8086/write?db=<database name> --data-binary "cpu_load,machine=001,region=cn value=0.56 1555164637838240795"
必須指定 database name
插入多條 Point
多條 Point
之間用行分割,如:
curl -X POST http://localhost:8086/write?db=<database name> --data-binary "cpu_load,machine=001,region=cn value=0.56 1555164637838240795 cpu_load,machine=001,region=cn value=0.65 1555164637838340795 cpu_load,machine=003,region-cn value=0.6 1555164637839240795"
若是須要寫入 Point
過多,能夠將 Point
放入文件中,而後經過 POST
請求上傳。
文件(cpu_data.txt
)內容如:
cpu_load,machine=001,region=cn value=0.56 1555164637838240795 cpu_load,machine=001,region=cn value=0.65 1555164637838340795 cpu_load,machine=003,region-cn value=0.6 1555164637839240795
而後上傳:
curl -X POST http://localhost:8086/write?db=<database name> --data-binary @cpu_data.txt