InfluxDB 簡介

InfluxDB 是一個時間序列數據庫(TSDB), 被設計用來處理高寫入、高查詢負載,是 TICK 的一部分。linux

TSDB 是針對時間戳或時間序列數據進行優化的數據庫,專門爲處理帶有時間戳的度量和事件或度量而構建的。
而時間序列數據能夠是隨時間跟蹤、監視、下采樣和聚合的度量或事件,如服務器指標、應用程序性能、網絡數據、傳感器數據以及許多其餘類型的分析數據。sql

關鍵特性

  • 可以高速讀取和壓縮時間序列數據
  • 使用 Go 編寫,可以但文件運行,沒有依賴
  • 提供了簡單、高效的 HTTP 讀寫接口
  • 可以使用插件支持其餘的數據協議,如: Graphite=, =collectdOpenTSDB
  • 可輕鬆使用 SQL 語言查詢聚合數據
  • 可以使用 Tag 進行快速高效的查詢
  • 支持保留策略(Retention Policy), 可以自動清理舊數據
  • 支持持續查詢,可以自動按期計算聚合數據,提升了查詢的效率

注意: 開源版本的 InfluxDB 只運行在單個節點上,如需更好的性能或避免單點故障,請使用企業版。shell

安裝

  • deepin/Ubuntu/Debian

    sudo apt install influxdb influxdb-cli數據庫

  • Archlinux

    yaourt -S influxdbsudo pacman -S influxdb服務器

其餘請參見:Installing InfluxDB網絡

配置

InfluxDB 的配置文件爲: /etc/influxdb/influxdb.conf ,選項詳情請參見:Configuration Settings,這裏就不在贅述。curl

基本操做

服務相關

  • 啓用/中止服務

    systemctl start/stop influxdb.serviceide

數據庫

  • 鏈接數據庫

    使用 influx 命令鏈接數據庫,參看其幫組手冊瞭解使用方法函數

  • 建立數據庫

    CREATE DATABASE <name>性能

  • 刪除數據庫

    DROP DATABASE <name>

  • 列出數據庫

    SHOW DATABASES

  • 選擇數據庫

    USE <name>

寫入查詢

InfluxDB 中使用 measurement 表示表, tags 表示表的元數據, fields 表示數據。
表的 scheme 不用定義, null 值也不會被存儲。

tag 可理解爲表中須要索引的列, field 是不須要索引的列, point 表示一條記錄。
tags 之間或 fields 之間使用 ',' 分割, 而 tagsfields 之間使用空格分割。

  • 刪除表

    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_loadmeasurement 中添加了 tagsmachineregionfieldsvaluepoint

    不指定 timestamp 時,默認會使用 本地的當前時間 做爲 timestamp

  • 查詢數據

    查詢語法:

    SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]

    查詢語句中必需要有 field 存在 ,查詢語句還支持 Go 風格的正則,下面給出一些例子。

    • SELECT * FROM cpu_load

      查詢 cpu_load 中的全部 fieldstags

    • SELECT *::field FROM cpu_load

      查詢 cpu_load 中的全部 fields

    • SELECT value,machine FROM cpu_load

      只查詢 valuemachine

    • SELECT value::field,machine::tag FROM cpu_load

      只查詢 valuemachine ,並限定了類型,若是類型錯誤將返回 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

SERIESmeasurement,<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_queryWHERE 子句中的任何用戶指定的時間範圍將被系統忽略。

如建立一個一分鐘採樣一次 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 hourShard Duration 仍將設置爲 1 hour

  • 刪除

    DROP RETENTION POLICY <rp_name>

  • 修改

    ALTER RETENTION POLICY <rp_name> ON <database name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] DEFAULT

HTTP 接口

/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
相關文章
相關標籤/搜索