0%

COUNT计数

DISTINCT查找不同

INTEGRAL积分

MEAN平均值

MEDIAN中位数

MODE频率最高的数

SPREAD最大和最小差值

STDDEV标准差

SUM求和

BOTTOM返回最小的N个数

TOP返回最大的N个field值

FIRST返回时间戳最早的数

LAST返回时间戳最近的数

MAX最大值

MIN最小值

PERCENTILE返回较大百分之N的字段值

SAMPLE返回N个随机抽样的字段值

CUMULATIVE_SUM返回字段实时前序字段值的和

DERIVATIVE返回字段的相邻两个点的变化率

简介

InfluxDB每秒可以处理数十万的数据点。如果要长时间地存储大量的数据,对于存储会是很大的压力。一个很自然的方式就是对数据进行采样,对于高精度的裸数据存储较短的时间,而对于低精度的的数据可以保存得久一些甚至永久保存。
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是唯一的。

基本语法

CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
BEGIN
  <cq_query>
END

cq_query

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子句中的任何用户指定的时间范围将被系统忽略。

运行时间点以及覆盖的时间范围

  • CQ对实时数据进行操作。他们使用本地服务器的时间戳,GROUP BY time()间隔和InfluxDB的预设时间边界来确定何时执行以及查询中涵盖的时间范围。
  • CQs以与cq_query的GROUP BY time()间隔相同的间隔执行,并且它们在InfluxDB的预设时间边界开始时运行。如果GROUP BY time()间隔为1小时,则CQ每小时开始执行一次。
  • 当CQ执行时,它对于now()和now()减去GROUP BY time()间隔的时间范围运行单个查询。 如果GROUP BY time()间隔为1小时,当前时间为17:00,查询的时间范围为16:00至16:59999999999。

高级语法

链接

InfluxQL是一种类似于SQL的查询语言,用于与InfluxDB进行交互。它经过精心设计,可以使来自其他SQL或类似SQL环境的用户熟悉,同时还提供特定于存储和分析时间序列数据的功能。

InfluxQL的SELECT语句遵循SQL SELECT语句的形式:

SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>

WHERE是可选的。

要在上面的部分中获取InfluxDB输出,请输入:

SELECT * FROM "foodships"

如果您只想查看有关该行的数据Saturn,请输入:

SELECT * FROM "foodships" WHERE "planet" = 'Saturn'

如果您想Saturn在2015年4月16日世界标准时间12:00:01之后查看行星的数据,请输入:

SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01'

如上面的示例所示,InfluxQL允许您在WHERE子句中指定查询的时间范围。您可以使用日期时间字符串,这些日期时间字符串用单引号引起来,其格式为YYYY-MM-DD HH:MM:SS.mmm (mmm是毫秒,是可选的,还可以指定微秒或纳秒)。您还可以使用相对时间now()来引用服务器的当前时间戳:

SELECT * FROM "foodships" WHERE time > now() - 1h

该查询foodships以时间戳记比服务器当前时间减去一小时新的量度输出数据。用于指定持续时间的选项now()有:

格式 单位
ns 纳秒
u或µ 微秒
ms 毫秒
s
m 分钟
H 小时
d
w
  • InfluxQL还支持正则表达式,表达式,SHOW语句和GROUP BY语句中的算术运算。

  • InfluxQL功能包括COUNTMINMAXMEDIANDERIVATIVE等等。

  • 查询中的基本计算

SELECT声明支持使用基本数学运算符,如+,-,/,*,(),等。

-- Add two field keys
SELECT field_key1 + field_key2 AS "field_key_sum" FROM "measurement_name" WHERE time < now() - 15m

-- Subtract one field from another
SELECT field_key1 - field_key2 AS "field_key_difference" FROM "measurement_name" WHERE time < now() - 15m

-- Grouping and chaining mathematical calculations
SELECT (field_key1 + field_key2) - (field_key3 + field_key4) AS "some_calculation" FROM "measurement_name" WHERE time < now() - 15m
  • 计算查询中的百分比

使用基本的数学函数,您可以通过将一个字段值除以另一字段值并将结果乘以100来计算百分比:

SELECT (field_key1 / field_key2) * 100 AS "calculated_percentage" FROM "measurement_name" WHERE time < now() - 15m
  • 使用聚合函数计算百分比

如果在百分比计算中使用汇总函数,则必须使用汇总函数引用所有数据。 您不能混合使用汇总数据和非汇总数据。

所有聚合功能都需要一个GROUP BY time()子句,该子句定义将数据点分组和聚合的时间间隔。

SELECT (sum(field_key1) / sum(field_key2)) * 100 AS "calculated_percentage" FROM "measurement_name" WHERE time < now() - 15m GROUP BY time(1m)

支持的API client

参考官网

http

创建数据库

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

写入数据

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

配置gzip压缩

InfluxDB支持gzip压缩。要减少网络流量,请考虑以下选项:

  • 要接受来自InfluxDB的压缩数据,请将Accept-Encoding: gzip标头添加到InfluxDB API请求中。
  • 要在将数据发送到InfluxDB之前压缩数据,请将Content-Encoding: gzip标头添加到InfluxDB API请求中。

批量写入

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

从文件写入

通过传递@filename到文件来写入文件中的点curl。文件中的数据应遵循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.txtmydb与数据库:

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

注意:如果您的数据文件具有5,000个以上的点,则可能有必要将该文件拆分为几个文件,以便将数据批量写入InfluxDB。默认情况下,HTTP请求在五秒钟后超时。超时后,InfluxDB仍将尝试写入这些点,但是不会确认它们已成功写入。

HTTP响应摘要

  • 2xx:如果收到您的写请求HTTP 204 No Content,那就成功了!
  • 4xx:InfluxDB无法理解该请求。
  • 5xx:系统过载或严重损坏

查询数据

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'"

InfluxDB返回JSON。您的查询结果将显示在”results”数组中。如果发生错误,InfluxDB会设置一个”error”包含错误说明的密钥。

{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "cpu_load_short",
                    "columns": [
                        "time",
                        "value"
                    ],
                    "values": [
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            2
                        ],
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            0.55
                        ],
                        [
                            "2015-06-11T20:46:02Z",
                            0.64
                        ]
                    ]
                }
            ]
        }
    ]
}

注意:附加pretty=true到URL会启用精美打印的JSON输出。尽管这对于调试或在使用诸如之类的工具直接查询时很有用curl,但不建议用于生产环境,因为它会消耗不必要的网络带宽。

多个查询

通过单个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'"

返回:

{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "cpu_load_short",
                    "columns": [
                        "time",
                        "value"
                    ],
                    "values": [
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            2
                        ],
                        [
                            "2015-01-29T21:55:43.702900257Z",
                            0.55
                        ],
                        [
                            "2015-06-11T20:46:02Z",
                            0.64
                        ]
                    ]
                }
            ]
        },
        {
            "statement_id": 1,
            "series": [
                {
                    "name": "cpu_load_short",
                    "columns": [
                        "time",
                        "count"
                    ],
                    "values": [
                        [
                            "1970-01-01T00:00:00Z",
                            3
                        ]
                    ]
                }
            ]
        }
    ]
}

java

influxdb-java

  • Java 1.8+ (tested with jdk8 and jdk11)
  • Maven 3.0+ (tested with maven 3.5.0)

  org.influxdb
  influxdb-java
  2.17

compile 'org.influxdb:influxdb-java:2.17'

python

influxdb-python

go

influxdb1-client

CLI连接

参考链接

influx -precision rfc3339
  • influx默认使用本地8086端口和localhost连接,更多参考influx --help
  • -precision格式化时间,rfc3339使用RFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ).

管理连接

exit

创建数据库

CREATE DATABASE <db-name>

例如CREATE DATABASE mydb.default是默认关键字,不能用于数据库名.

查看数据库

创建完数据库可以用SHOW DATABASES查看所有数据库.

> SHOW DATABASES
name: databases
name
----
_internal
mydb

使用数据库

USE <db-name>

> USE mydb
Using database mydb

存储策略

查看当前数据库Retention Policies

show retention policies on "db_name"

创建新的Retention Policies

create retention policy "rp_name" on "db_name" duration 3w replication 1 default

数据格式

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
  • measurement相当于表名.
  • tag是数据的标签,可以有多个
  • field是数据的值,可以有多个,例如 “value=0.64”, or “temperature=21.2”
  • timestamp是数据的时间戳

每一条数据称之为points.

插入一条数据

INSERT cpu,host=serverA,region=us_west value=0.64
INSERT temperature,machine=unit42,type=assembly external=25,internal=37

查询数据

SELECT "host", "region", "value" FROM "cpu"
SELECT * FROM "temperature"
> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
SELECT * FROM cpu where time = '2020-02-20T06:43:42.9206681Z'

influxdb简介

influxdb是一款常年在db-engine使用排名第一的时序数据库,提供存储管理、用户管理、http接口、各类语言API接口。

TSM

时序数据使用类似 LSM Tree 的 TSM Tree (Time Series Merge Tree)存储,而且是一种「列式」存储结构。

数据写入时:

  • 先保存到 cache 和 WAL 当中
  • 当 WAL 当中数据超出阈值时,将 WAL 文件写入到 level 1 的 TSM 文件当中,cache 和 WAL 也随之清空
  • 每个 TSM 文件主要分成两部分:时序数据,以及时序数据的索引,通过索引可以使用二分查找找到我们需要的数据
  • 随着 TSM 文件变多,系统会将多个小 的TSM 文件会合并成一个的更大的 TSM 文件,持续这个过程保证文件数量不会过多
  • TSM 文件的合并策略是比较老的 size-tiered 策略,将小的文件压缩成大的文件,这一点和 leveldb 不太一样,leveldb 要严格保证每个 level 下的文件没有重叠,但是 influxdb 不会。

之所以这么设计,应该是因为查询时序数据的时候,一般会根据时间进行筛选,而大部分时候每个 TSM 文件当中都是越老的文件数据也越老,数据天然会按照时间排序,虽然会有重叠的情况,但是权衡利弊,最终可以容忍这种情况,查询的时候做数据合并的成本更小。

TSI

TSI 是 Time Series Index 的缩写,influxdb 用 TSI 来保存时序数据的倒排索引。可以通过 TSI 快速查询到某个表中,包含某个 tag 的 series 都有哪些。

TSI 的另一个工作是将倒排索引保存在磁盘当中,在 TSI 之前,influxdb 完全是使用内存存储倒排索引的,当时序数据变多的时候,特别是「表」变多的时候,倒排索引消耗的内存会飙升。TSI 使用类似 TSM 的文件结构来存储索引。

inflxdb数据库安装

centos安装

  1. 下载地址
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.10.x86_64.rpm
sudo yum localinstall influxdb-1.7.10.x86_64.rpm
  1. 安装
yum localinstall influxdb-1.7.10.x86_64.rpm
  1. 卸载
rpm -qa | grep influx
rpm -e influxdb-1.7.10.x86_64
  1. 启动
service influxdb start
systemctl enable influxdb
systemctl start influxdb
systemctl restart influxdb
systemctl stop influxdb

windows

https://dl.influxdata.com/influxdb/releases/influxdb-1.7.10_windows_amd64.zip unzip influxdb-1.7.10_windows_amd64.zip

docker安装

docker pull influxdb

可视化UI-Chronograf

docker安装

docker pull quay.io/influxdb/chronograf:1.7.17

centos

wget https://dl.influxdata.com/chronograf/releases/chronograf-1.7.17.x86_64.rpm
sudo yum localinstall chronograf-1.7.17.x86_64.rpm

windows

https://dl.influxdata.com/chronograf/releases/chronograf-1.7.17_windows_amd64.zip
unzip chronograf-1.7.17_windows_amd64.zip

数据收集器-Telegraf

docker安装

docker pull telegraf

centos

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.13.3-1.x86_64.rpm
sudo yum localinstall telegraf-1.13.3-1.x86_64.rpm

windows

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.13.3_windows_amd64.zip
unzip telegraf-1.13.3_windows_amd64.zip

处理和监控服务-Kapacitor

docker安装

docker pull kapacitor

centos

wget https://dl.influxdata.com/kapacitor/releases/kapacitor-1.5.4-1.x86_64.rpm
sudo yum localinstall kapacitor-1.5.4-1.x86_64.rpm

windows

wget https://dl.influxdata.com/kapacitor/releases/kapacitor-1.5.4_windows_amd64.zip
unzip kapacitor-1.5.4_windows_amd64.zip