1 InfluxDB

1.1 InfluxDB 是啥?

InfluxDB是时序数据库,时序数据库通常用于监控场景,如:运维、IOT(物联网)领域。

1.2 InfluxDB 解释之使用场景

我们可以写一个程序将服务器上CPU使用情况,每隔10s向InfluxDB中写入一条数据,然后,我们写一条
FLUX查询语句,查询过去30sCPU平均使用情况,紧接着让这个查询语句每隔10s执行一次,最终,我们配置
一条报警规则,若查询语句执行结果>xxx,就立刻触发报警。

1.3 时序数据库InfluxDB与关系型数据库对比

1.3.1 写入性能

时间戳

数据结构

时序数据库

时序数据库字如其名

关系型数据库

支持时间戳,但是需要注意数据库的写入性能

1.3.2 数据价值

由于时序数据库一般用于指标监控场景,这个场景数据特点是冷热差别明显,通常,指标监控只会
监控近期一段时间数据,例如:我们只查询最近10min的记录,10min前的数据不再用了,此时这个
10min前数据,就称为冷数据,需要压缩放到磁盘节省空间,热数据常使用,应被存在内存,等待查询,
市面上常用时序数据库大都有类似设置。

1.3.3 时间不可倒流,数据只写不改

时序数据库描述一个实体在不同时间所处的不同状态。

例如:当我们查看CPU使用情况,发现CCPU使用率过高,于是杀死了一个进程,但10秒前数据不会因
     为我们关闭进程而发生改变。

因而,时序数据库插入操作居多。

1.3.4 InflxDB的组成——TICK技术栈

技术栈

解释

T:Telegref

数据采集组件:收集和发送数据到InfluxDB。

I:InfluxDB

存储数据:存储数据发送数据到 Chronograf。

C:Chronograf

查询:总的用户界面,起到总的管理功能。

K:Kapacitor

报警:后台处理报警信息。

grafana 设置 influxdb2数据源_iot


注意:在2.x时,TICK进一步融合,ICK功能全部融入InfluxDB。

1.4 InfluDB使用介绍

1.4.1 Web UI 使用

1.4.1.1 创建用户和初始化存储桶

grafana 设置 influxdb2数据源_iot_02

1.4.1.2 加载数据

grafana 设置 influxdb2数据源_java-influxdb_03

1.4.1.3 上传数据文件

grafana 设置 influxdb2数据源_时序数据库_04

点开会有提示你上传格式

grafana 设置 influxdb2数据源_时序数据库_05

1.4.1.4 写入InfluxDB的代码模块

相当于一个官方给你的API文档

grafana 设置 influxdb2数据源_java-influxdb_06

点开就会告诉你咋操作

grafana 设置 influxdb2数据源_物联网_07

1.4.1.5 管理存储桶

grafana 设置 influxdb2数据源_时序数据库_08

1.4.1.6 创建Bucket3

过期策略,永不过期或者设置过期时间。

grafana 设置 influxdb2数据源_influxDB_09

1.4.1.7 调整Bucket设置

grafana 设置 influxdb2数据源_时序数据库_10

1.4.1.8 设置Label,添加标签

grafana 设置 influxdb2数据源_iot_11

1.4.1.9 向Bucket添加数据

如下我们选择的“Line Protocol”被称为行协议。

grafana 设置 influxdb2数据源_influxDB_12

people,name=tony age=12
people,name=xiaohong age=13
people,name=xiaobai age=14
people,name=xiaohei age=15
people,name=xiaohua age=12


1.5 管理API Token

1.5.1 API Token是啥?

简单来说,influxdb会对外暴露一套HTTP API,后边所使用的命令行啥的都是封装对influxdb的HTTP请求,
因此,对权限的管理主要就提现在Token上,在我们使用客户端发起http请求时token会被放到http请求头上,
influxdb服务器就会根据客户端发来的请求头进行解析,来判断此token拥有的权限,及可以进行的操作。

1.5.1 API token的相关管理

1.5.1.1 查看API Token

grafana 设置 influxdb2数据源_时序数据库_13

1.5.1.2 修改API Token名称

grafana 设置 influxdb2数据源_influxDB_14

1.5.1.3 查看API Token可进行的操作

点击对应的token,便可查看token进行的相关操作

grafana 设置 influxdb2数据源_时序数据库_15

1.5.1.4 创建新的API Token

注意:Web UI 上提供只是生成Token的模板,准备了常用需求,不代表其全部功能

grafana 设置 influxdb2数据源_物联网_16

点击开仅能读和写的范围,会有如下选择界面

grafana 设置 influxdb2数据源_时序数据库_17

1.6 查询工具

1.6.1 查询语言说明

在influxDB的查询中,有两个查询实现方式分别为,**FLUX语言**与**InfluxQL语言,**其中InfluxQL语言在2.0版本后已被移除,被flux语言所替代,InfluxQL语言中与SQL语言高度类似。然而,flux语言更能适用于时序数据库。

1.6.1 Data Explorer

grafana 设置 influxdb2数据源_influxDB_18

1.6.2 查询编辑区

1.6.2.1 查询构造器

grafana 设置 influxdb2数据源_influxDB_19

1.6.2.2 FLUX脚本编辑器
1.6.2.3 数据预览区

grafana 设置 influxdb2数据源_influxDB_20

1.6.3 示例:使用Data Explorer进行查询和可视化

1.6.3.1 打开 Data Explorer

grafana 设置 influxdb2数据源_时序数据库_21

1.6.3.2 可视化设置查询条件

grafana 设置 influxdb2数据源_时序数据库_22

1.6.3.3 窗口聚合选项

grafana 设置 influxdb2数据源_时序数据库_23

最后,再点击SUBMIT完成提交。

grafana 设置 influxdb2数据源_时序数据库_24

1.6.3.4 查看原始数据

grafana 设置 influxdb2数据源_iot_25

1.6.4 可视化查询原理

当我们可视化选择条件进行查询时,实质是Web UI根据我们指定条件生成一套FLUX脚本语言

grafana 设置 influxdb2数据源_java-influxdb_26

点击后便可查看到FLUX语句

grafana 设置 influxdb2数据源_influxDB_27

1.7 Notebook

1.7.1 Notebook是啥 ?

Notebook是influxDB 2.X后推出的功能,交互上模仿Jupyter NoteBook,器可以用来开发、文档编写、运行代码以及展示结果。

influxDB笔记本就是按照顺序处理数据的集合。其可以帮我们进行如下操作:

  • 执行flux代码、可视化数据和添加注释性片段。
  • 创建报警或计划任务。
  • 对数据进行将采样或清洗。
  • 生成要和团队分享的Runbooks。
  • 将数据写到存储桶。
Notebook与Data Explorer相比,Notebook将数据拆分一个又一个具体步骤,并且Notebook可用来开发告警任务,Data Explorer不能。

1.7.2 Notebook的使用

1.7.2.1 进入Notebook

在创建引导界面,influxDB通过3个模板,分别为Set an Alert(设置一个报警)、Schedule a Task (调度一个任务)、write a Flux Script(写一个 Flux 脚本)。![image.png]()

1.7.2.2 创建空白Notebook

grafana 设置 influxdb2数据源_物联网_28

1.7.3 Notebook 工作流——Cell

在页面上看到的一个一个卡片,在Notebook中成Cell,一个Notebook工作流就是多个cell按照先后顺序组合起来的执行流程,这些Cell中间随时可插入其他Cell,且Cell和Cell可以调换顺序。

grafana 设置 influxdb2数据源_物联网_29

1.7.3.1 Cell的分类

grafana 设置 influxdb2数据源_时序数据库_30

数据源相关Cell

可视化相关Cell

行为Cell

查询构造器

将数据展示为一个table

进行报警

直接编写FLUX脚本

将数据展示为一张图,

或者添加笔记

定时任务设定

1.7.3.2 Notebook 工作流范式

通常,Notebook 工作流以查询数据开始,后面的Cell把数据展示出来,当数据需要进一步修改时,再加一个flux脚本Cell,Notebook为我们留一个接口,后边的Flux cell可以将前面的数据作为数据源进行查询。最终,Notebook 工作流可以以任务设置或者报警操作作为整个工作流终点(**不是强制要求**)。

grafana 设置 influxdb2数据源_java-influxdb_31

1.7.4 Notebook相关控件

1.7.4.1 时区转换

grafana 设置 influxdb2数据源_时序数据库_32

1.7.4.2 仅显示可视化

当开启此选型,查询构造器和FLUX脚本的Cell会被折叠。

grafana 设置 influxdb2数据源_物联网_33

1.7.4.3 删除按钮与运行按钮

grafana 设置 influxdb2数据源_influxDB_34

1.7.5 示例:使用Notebook查询和可视化数据

1.7.5.1 使用查询构造器查询

默认,我们所创建的空白Notebook,自带3个Cell。

  • 第一个cell默认是一个查询构造器,相比DataExplorer,Notebook无开窗聚合操作(就是那个可视化图)

grafana 设置 influxdb2数据源_java-influxdb_35


1.7.5.2 提交查询

grafana 设置 influxdb2数据源_时序数据库_36

1.7.5.3 添加说明cell

我们可以在Notebook中添加说明性cell。我们选择在最前面加一个说明性Cell

grafana 设置 influxdb2数据源_iot_37


grafana 设置 influxdb2数据源_时序数据库_38


grafana 设置 influxdb2数据源_时序数据库_39

1.8 FlUX语法

1.8.1 啥是FLUX?

注意:说白了MySQL有SQL查询语言,InfluxDB有FLUX查询语言(2.0版本前还有InfluxQL语言,后边被移除了)
类比水处理,flux语言就是如下操作:

  • ① 从数据源中查询指定数量的数据。
  • ② 根据时间或字段筛选数据。
  • ③ 将数据进行处理或聚合得到预期结果。
  • ④ 返回最终结果。

Flux是一种函数式数据脚本语言,其旨在将查询、处理、分析和操作数据统一为一种语法。

从概念上理解FLUX,可以联系在水处理的过程,首先,我们从源头把水抽取出来,然后,按照我
们用水需求,在管道上进行一系列的处理修改(去除沉积物,精华)等,最后,以消耗品的方式输送到
我们目的地。

grafana 设置 influxdb2数据源_iot_40

1.8.2 示例:FLUX语句

函数

说明

from( )

指定数据源

| >

管道转发符,将一个函数输入转发给下一个函数

range( ),fliter( )

根据列的值对数据进行过滤

mean( )

计算所剩数据平均值

yield( )

将最终计算结果返回给用户

1.8.2.1 从influxDB中查询数据并聚合
//处理水类似,首先,从数据源中查询指定数量的数据,其次,根据时间或字段筛选数据,然后,
//将数据进行处理或聚合以得到预期结果,最后,返回最终结果。
//第一步:从数据库bucket中取数据。
//第二步:删选数据。
//第三步:对数据进行处理此处是求平均。
//第四步:返回最终结果。
from(bucket: "example-bucket")
|> range(start: -1d)
|> filter(fn: (r) => r._measurement == "example-measurement")
|> mean()
|> yield(name: "_results")
1.8.2.2 从CSV文件查询数据并聚合
//第一步:从数据源取出数据
//第二步:过滤数据
//第三步:处理数据,此处是求平均
//第四步:返回最终结果
import "csv"
csv.from(file: "path/to/example/data.csv")
|> range(start: -1d)
|> filter(fn: (r) => r._measurement == "example-measurement")
|> mean()
|> yield(name: "_results")
1.8.2.3 从PostgreSQL查询数据并聚合
//第一步:指定数据源,此处是PostgreSQL数据库,因此需要数据库连接要素
//第二步:过滤数据
//第四步:处理数据
//第五步:返回最终结果
import "sql"
sql.from(
driverName: "postgres",
dataSourceName: "postgresql://user:password@localhost",
query: "SELECT * FROM TestTable",
)
|> filter(fn: (r) => r.UserID == "123ABC456DEF")
|> mean(column: "purchase_total")
|> yield(name: "_results")

1.8.3 flux语法

1.8.3.1 注释

influx中无多行注释,只有单行注释,示例如下:

// 这是一行注释
1.8.3.2 变量与赋值

使用“=”将表达式的结果赋值变量,示例如下:

s = "foo" //string
i = 1 //Integer
f = 2.0 //float(floating point number)

s // Returns foo
i // Returns 1
f // Returns 2.0
1.8.3.3 基本表达式

表达式

说明

+

数字相加或字符串拼接

-

数字减法

*

数字相乘

/

数字除法

%

取模

1.8.3.4 比较运算符

谓词表达式的返回结果只能为true或false

"John" ==   "John" //Returns true
41 < 30 //Returns false
1.8.3.5 逻辑运算符

于逻辑:and;或逻辑:or

1.8.3.6 控制语句
if else
for while 循环
try catch 异常捕获