InfluxDB V2快速入门

influxdb Sep 21, 2021

InfluxDB是开源的时间序列数据库,可用于实时查看堆栈,传感器和系统的指标查看。

优势:

  • 时序数据库的优势,在于处理指标数据的聚合,并且读写效率非常高。

特点:

  • influxDB 不支持数据库的更新操作,毕竟时间数据只能随着时间产生新数据,肯定无法对过去的数据修改。
  • 从数据结构上说,时间序列数据数据没有单一的主键标识,必须包含时间戳,数据只能和时间戳进行关联,不适合普通业务数据。

用途

时间序列数据库可以作为特定场景(比如监控、统计)的主存储,也可以和关系型数据库搭配使用,作为一个辅助数据源,保存业务系统的指标数据。

只要符合写多读少、无事务要求、海量高并发持续写入、基于时间区间聚合分析以及基于时间区间快速查询的数据都可以使用Influx。

  • 监控

influxdb+telegraf+grafana组合

数据模型

InfluxDB里存储的数据被称为时间序列数据,其包含一个数值,就像CPU的load值或是温度值类似的。

时序数据有零个或多个数据点,每一个都是一个指标值。

  • time(一个时间戳) 【类比SQL中的主键】
  • 至少一个k-v格式的field(也即指标的数值例如 “value=0.64”或者“temperature=21.2”) 【类比SQL中的列】
  • 零个或多个tag,可以理解为列。与field不同的是,tag理解为一个对象,并且tag是被索引起来的。

下载安装

官方下载地址:

Downloads (influxdata.com)

安装步骤可参考官方文档,推荐使用docker安装,方便后续跨平台迁移部署。

V2安装后的启动端口默认是8086, 安装后可通过浏览器访问并进行相关设置。

V2和和V1

查询语法

V1: 类SQL语法

V2: Flux语法

v2名词

推荐查阅v2官方文档:

InfluxDB OSS 2.0 Documentation (influxdata.com)

bucket

所有 InfluxDB 数据都存储在一个存储桶中。相当与sql中的database

系统存储桶
_monitoring system bucket :该_monitoring系统桶存储InfluxDB数据用于 监控数据并发送警报。数据保留:7天
_tasks system bucket: 该_tasks系统桶存储与数据InfluxDB任务的执行。数据保留:1天

bucket schema

具有明确的schema-type的存储桶需要为每个度量指定显式架构。

organization

InfluxDB组织是一组用户的工作区。

measurement

相当与sql中的table

与传统的关系型数据库不同之处在于,在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。

timestamp

​ 时间戳

field key

属性键

field value

属性值

field set

字段集

tag key

标签键

tag value

标签值

tag set

标签集

series

point

数据点

写数据到InfluxDB

使用行协议格式( line protocol format )去写数据到InfluxDB,每行表示一个数据点,每个数据点需要测量(measurement)和字段集(field set),也可能包含标签集(tag set)和时间戳‎‎(timestamp)。

行协议格式如下:

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

::: warning
tag和field 之间有一个空格
:::

例如:

mem,host=host1 used_percent=23.43234543 1556892576842902000
cpu,host=host1 usage_user=3.8234,usage_system=4.23874 1556892726597397000
mem,host=host1 used_percent=21.83599203 1556892777007291000

::: tip
当写数据到InfluxDB时,推荐每个数据点都带上时间戳‎‎,如过数据点没有时间戳‎‎当会使用InfluxDB宿主机的时间戳(UTC)
:::

时间戳精度

  • ns - 纳秒
  • us - 微秒
  • ms - 毫秒
  • s - 秒

写数据的方式

csv

api

cli

...

cli作为写数据进行测试,其中分为:

行协议单行写入

influx write \
  -b bucketName \
  -o orgName \
  -p s \
  'myMeasurement,host=myHost testField="testData" 1556896326'

行协议来自文件写入

influx write \
  -b bucketName \
  -o orgName \
  -p s \
  --format=lp
  -f /path/to/line-protocol.txt

行协议从来自注释的csv文件

influx write \
  -b bucketName \
  -o orgName \
  -p s \
  --format=csv
  -f /path/to/data.csv

Flux查询语句

Flux 是 InfluxData 的功能性数据脚本语言,设计用于查询、分析和处理数据,它是InfluxQL 和其他类似 SQL 的查询语言的替代品。

InfluxDB 之所以创造 Flux 语法,而不使用 SQL,主要有两个原因:

  1. 更强的查询功能:SQL 无法轻松完成时序查询。
  2. 时间序列的查询需要基于流的函数模型,而不是 SQL 的代数模型。

SQL和FLUX的对比可以参考:

SQL vs. Flux: Choose the right query language for time-series data (timescale.com)

数据源

from(bucket:"example-bucket")

::: warning
单独使用会报错,需要加上范围(range)。
:::

时间查询

查询example-bucket桶过去一小时的数据。

from(bucket:"example-bucket")
  |> range(start: -1h)

::: danger
查询的数据源的时候必须带个range不然报错。
:::

查询example-bucket桶过去1小时到过去10分钟的数据。

from(bucket:"example-bucket")
  |> range(start: -1h, stop: -10m)

查询example-bucket桶两个绝对时间的数据

from(bucket:"example-bucket")
  |> range(start: 2018-11-05T23:30:00Z, stop: 2018-11-06T00:00:00Z)

数据过滤

将范围数据传递到filter()函数中,以根据数据属性或列缩小结果范围。filter()函数有一个参数 ,fn它需要一个匿名函数,该函数具有基于列属性过滤数据的逻辑。

匹配规则:

(r) => (r.recordProperty comparisonOperator comparisonExpression)

单个过滤

(r) => (r._measurement == "cpu")

多重过滤

(r) => (r._measurement == "cpu") and (r._field != "usage_system" )

按cpu度量、usage_system字段和cpu-total标记值过滤

from(bucket:"example-bucket")
  |> range(start: -15m)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"

分组

|> group(columns: [""_field""])

属性过滤

|> filter(fn: (r) => r["_field"] == "age" or r["_field"] == "username" ) 

指定查询数据

Fluxyield()函数将过滤后的表作为查询结果输出。

yield()只有在同一个 Flux 查询中包含多个查询时,才需要显式调用。

from(bucket:"example-bucket")
  |> range(start: -15m)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"
  )
  |> yield()
这里yield()可以省略,会隐式调用。

数据转换

使用函数,将数据聚合为平均值、下采样数据等。

更新范围从最后一小时拉取数据

from(bucket:"example-bucket")
  |> range(start: -1h)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"
  )

以五分钟为间隔的窗口化数据

from(bucket:"example-bucket")
  |> range(start: -1h)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"
  )
  |> window(every: 5m)

聚合窗口数据

from(bucket:"example-bucket")
  |> range(start: -1h)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"
  )
  |> window(every: 5m)
  |> mean()

添加时间列到聚合函数

from(bucket:"example-bucket")
  |> range(start: -1h)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"
  )
  |> window(every: 5m)
  |> mean()
  |> duplicate(column: "_stop", as: "_time")

取消窗口聚合表,将所有点收集到一个无限的窗口中

from(bucket:"example-bucket")
  |> range(start: -1h)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"
  )
  |> window(every: 5m)
  |> mean()
  |> duplicate(column: "_stop", as: "_time")
  |> window(every: inf)

辅助函数(将聚合或选择器函数应用于固定的时间窗口,通过every指定窗口的持续时间)

from(bucket:"example-bucket")
  |> range(start: -1h)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_system" and
    r.cpu == "cpu-total"
  )
  |> aggregateWindow(every: 5m, fn: mean)

(完)

参考

InfluxDB OSS 2.0 Documentation (influxdata.com)

SQL vs. Flux: Choose the right query language for time-series data (timescale.com)

【InfluxDB V2.0】介绍与使用,flux查询、数据可视化_xbl的博客-CSDN博客

InfluxDB数据模型和实践 - 知乎 (zhihu.com)

标签

猫君

记录想法、故事和灵感。

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.