InfluxDB是时序数据库,时序数据库通常用于监控场景,如:运维、IOT(物联网)领域。
我们可以写一个程序将服务器上CPU使用情况,每隔10s向InfluxDB中写入一条数据,然后,我们写一条
FLUX查询语句,查询过去30sCPU平均使用情况,紧接着让这个查询语句每隔10s执行一次,最终,我们配置
一条报警规则,若查询语句执行结果>xxx,就立刻触发报警。
时间戳 | 数据结构 |
---|---|
时序数据库 | 时序数据库字如其名 |
关系型数据库 | 支持时间戳,但是需要注意数据库的写入性能 |
由于时序数据库一般用于指标监控场景,这个场景数据特点是冷热差别明显,通常,指标监控只会
监控近期一段时间数据,例如:我们只查询最近10min的记录,10min前的数据不再用了,此时这个
10min前数据,就称为冷数据,需要压缩放到磁盘节省空间,热数据常使用,应被存在内存,等待查询,
市面上常用时序数据库大都有类似设置。
时序数据库描述一个实体在不同时间所处的不同状态。
例如:当我们查看CPU使用情况,发现CCPU使用率过高,于是杀死了一个进程,但10秒前数据不会因
为我们关闭进程而发生改变。
因而,时序数据库插入操作居多。
技术栈 | 解释 |
---|---|
T:Telegref | 数据采集组件:收集和发送数据到InfluxDB。 |
I:InfluxDB | 存储数据:存储数据发送数据到 Chronograf。 |
C:Chronograf | 查询:总的用户界面,起到总的管理功能。 |
K:Kapacitor | 报警:后台处理报警信息。 |
注意:在2.x时,TICK进一步融合,ICK功能全部融入InfluxDB。
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
简单来说,influxdb会对外暴露一套HTTP API,后边所使用的命令行啥的都是封装对influxdb的HTTP请求,
因此,对权限的管理主要就提现在Token上,在我们使用客户端发起http请求时token会被放到http请求头上,
influxdb服务器就会根据客户端发来的请求头进行解析,来判断此token拥有的权限,及可以进行的操作。
注意:Web UI 上提供只是生成Token的模板,准备了常用需求,不代表其全部功能
在influxDB的查询中,有两个查询实现方式分别为,**FLUX语言**与**InfluxQL语言,**其中InfluxQL语言在2.0版本后已被移除,被flux语言所替代,InfluxQL语言中与SQL语言高度类似。然而,flux语言更能适用于时序数据库。
当我们可视化选择条件进行查询时,实质是Web UI根据我们指定条件生成一套FLUX脚本语言
点击后便可查看到FLUX语句
Notebook是influxDB 2.X后推出的功能,交互上模仿Jupyter NoteBook,器可以用来开发、文档编写、运行代码以及展示结果。
influxDB笔记本就是按照顺序处理数据的集合。其可以帮我们进行如下操作:
- 执行flux代码、可视化数据和添加注释性片段。
- 创建报警或计划任务。
- 对数据进行将采样或清洗。
- 生成要和团队分享的Runbooks。
- 将数据写到存储桶。
Notebook与Data Explorer相比,Notebook将数据拆分一个又一个具体步骤,并且Notebook可用来开发告警任务,Data Explorer不能。
在创建引导界面,influxDB通过3个模板,分别为Set an Alert(设置一个报警)、Schedule a Task (调度一个任务)、write a Flux Script(写一个 Flux 脚本)。![image.png](https://img-blog.csdnimg.cn/img_convert/19d46b9bb25dfedbef8430147f439828.png#averageHue=#0f1622&clientId=u4c90e686-1d69-4&from=paste&height=577&id=u35f8dc33&originHeight=793&originWidth=1578&originalType=binary&ratio=1.375&rotation=0&showTitle=false&size=215762&status=done&style=none&taskId=uf4ccfdb6-8d79-4978-9ab2-b69825c0ad2&title=&width=1147.6363636363637)
在页面上看到的一个一个卡片,在Notebook中成Cell,一个Notebook工作流就是多个cell按照先后顺序组合起来的执行流程,这些Cell中间随时可插入其他Cell,且Cell和Cell可以调换顺序。
数据源相关Cell | 可视化相关Cell | 行为Cell |
---|---|---|
查询构造器 | 将数据展示为一个table | 进行报警 |
直接编写FLUX脚本 | 将数据展示为一张图, | |
或者添加笔记 | 定时任务设定 |
通常,Notebook 工作流以查询数据开始,后面的Cell把数据展示出来,当数据需要进一步修改时,再加一个flux脚本Cell,Notebook为我们留一个接口,后边的Flux cell可以将前面的数据作为数据源进行查询。最终,Notebook 工作流可以以任务设置或者报警操作作为整个工作流终点(**不是强制要求**)。
当开启此选型,查询构造器和FLUX脚本的Cell会被折叠。
默认,我们所创建的空白Notebook,自带3个Cell。
- 第一个cell默认是一个查询构造器,相比DataExplorer,Notebook无开窗聚合操作(就是那个可视化图)
注意:说白了MySQL有SQL查询语言,InfluxDB有FLUX查询语言(2.0版本前还有InfluxQL语言,后边被移除了)
类比水处理,flux语言就是如下操作:
Flux是一种函数式数据脚本语言,其旨在将查询、处理、分析和操作数据统一为一种语法。
从概念上理解FLUX,可以联系在水处理的过程,首先,我们从源头把水抽取出来,然后,按照我
们用水需求,在管道上进行一系列的处理修改(去除沉积物,精华)等,最后,以消耗品的方式输送到
我们目的地。
函数 | 说明 |
---|---|
from( ) | 指定数据源 |
| > | 管道转发符,将一个函数输入转发给下一个函数 |
range( ),fliter( ) | 根据列的值对数据进行过滤 |
mean( ) | 计算所剩数据平均值 |
yield( ) | 将最终计算结果返回给用户 |
//处理水类似,首先,从数据源中查询指定数量的数据,其次,根据时间或字段筛选数据,然后,
//将数据进行处理或聚合以得到预期结果,最后,返回最终结果。
//第一步:从数据库bucket中取数据。
//第二步:删选数据。
//第三步:对数据进行处理此处是求平均。
//第四步:返回最终结果。
from(bucket: "example-bucket")
|> range(start: -1d)
|> filter(fn: (r) => r._measurement == "example-measurement")
|> mean()
|> yield(name: "_results")
//第一步:从数据源取出数据
//第二步:过滤数据
//第三步:处理数据,此处是求平均
//第四步:返回最终结果
import "csv"
csv.from(file: "path/to/example/data.csv")
|> range(start: -1d)
|> filter(fn: (r) => r._measurement == "example-measurement")
|> mean()
|> yield(name: "_results")
//第一步:指定数据源,此处是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")
influx中无多行注释,只有单行注释,示例如下:
// 这是一行注释
使用“=”将表达式的结果赋值变量,示例如下:
s = "foo" //string
i = 1 //Integer
f = 2.0 //float(floating point number)
s // Returns foo
i // Returns 1
f // Returns 2.0
表达式 | 说明 |
---|---|
+ | 数字相加或字符串拼接 |
- | 数字减法 |
* | 数字相乘 |
/ | 数字除法 |
% | 取模 |
谓词表达式的返回结果只能为true或false
"John" == "John" //Returns true
41 < 30 //Returns false
于逻辑:and;或逻辑:or
if else
for while 循环
try catch 异常捕获