「influxDB 原理与实践(二)」详解influxDB的写入与查询

时间:2022-07-24
本文章向大家介绍「influxDB 原理与实践(二)」详解influxDB的写入与查询,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. 操作模式

支持两种原生的操作模式:

  1. influx命令行工具,类似mysql命令行工具,可以方便的执行管理、运维、调试性质的操作。
  2. InfluxDB API,是一种可编程性强、编程语言友好的RESTful API的操作接口,支持HTTP和HTTPS协议。

1.1 influx命令行模式

上一篇讲过influx命令行的含义和基本用法。这里用几个示例演示。

  • format命令 设置服务器响应数据的格式,支持JSON/CSV/COLUMN3种数据格式。
  • history命令 显示命令操作的历史记录。默认情况下,influx记录最后使用的1000条命令,存储在主目录中的./influx_history文件中。
  • precision命令 指定查询和写入的时间戳的格式/精度,支持rfc3339(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)、h(小时)、m(分)、s(秒)、ms(毫秒)、u(微秒)、ns(纳秒),进度默认为纳秒。 设置命令 precision rfc3339 设置到h(小时)级别,precision h 设置到ns(纳秒)级别,precision ns
  • pretty,开启json格式的漂亮打印 format json pretty
  • settings

1.2 API模式

RESTful风格的接口,返回JSON格式的响应数据,并支持身份认证、JWT令牌、丰富的HTTP响应代码等。 influxDB API接口及接口的定义描述如下图所示:

api使用参考

2. 写入

写操作支持简明的行协议,行协议是一种基于文本格式的协议。

2.1 行协议

行协议的单行文本表示一条时序数据,由表、标签集、指标集和时间戳4部分组成,行协议的基本语法如下所示:

  • 标签tag-key=tag-value分别表示标签键和标签值,用于创建索引,提高查询性能。标签键和标签值都要求是字符串,该数据保存在META节点中。
  • 指标field-key=field-value分别是指标键和指标值,不会被索引,一般存放的是具体的时序数据,即随着时间戳的变化而变化的数据。指标键要求是字符串,而指标值可以是字符串类型、浮点型、整型、或布尔型
  • timestamp,可选参数,纳秒级精度的时间戳,如果没有该参数,InfluxDB将采用数据写入时间为时间戳
//cpu_usage是表明,host、region是tag,value、name是值,最后是时间戳
insert cpu_usage,host=server01,region=ch  value=2,name=zhongguo 1592906727717942736

2.1.1 数据类型

行协议中,不同的字段支持不通的数据类型

注意:整形数据,需要在数据后面加个i,否则会被当成浮点型。

2.1.2 特殊符号

行协议中一些字段对特殊符号较敏感,当需要使用这些敏感符号作为字段的一部分时,需要在前面加进行转义处理。

注意

1. 行协议对空格敏感,标签集和指标集中间必须有空格。

2. 时间戳参数不可以加引号,否则会报错。

3. 指标值支持字符串类型,要使用双引号将字符串类型的指标值括起来

2.1.3 保留字和命名规范

需避免在表明和字段名中使用InfluxDB的保留字。

注意 1.关键字time是一个特殊的保留字,time不可以用作标签键和指标键的命名。但可以用作其他命名,如表的命名、保留策略的命名 2.除了时间戳字段外,其他字段都是大小写敏感的

2.2 写入数据

写入数据前,先指定数据库 : use 数据库名

2.2.1通过API写入

实际应用中,我们也是通过API写入的。写入语法如下:

其中,line_protocol_expression表示行协议格式的时序数据,每条时序数据之间使用换行分隔符。

2.2.1文件数据导入

InfluxDB支持两种方式导入InfluxDB API导入和influx-import导入

InfluxDB API导入

支持导入内容为行协议格式时序数据的文本文件。

其中,<file>标识导入文件的存储路径

例子:将server1和server2某一天的内存监控数据导入monitor数据库

注意:

1.默认情况下InfluxDB API的超时时间为5秒,超时之后InfluxDB仍然会继续将数据写完,但请求方由于已经超时无法知道最终是否写入成功。

2.当写入数据超过5000个的时候,应使用多次HTTP请求分批次写入数据

2.2.1influx-import导入

功能更丰富。

当数据量较大时,每插入100000条数据会输出一次执行状态日志。 使用-compressed参数可以导入gz压缩文件中的时序数据。

3.查询

支持类sql的语法进行数据查询,简称influxQL。 支持SELECT语句、GROUP BY语句、INTO语句、正则表达式、SHOW语句、数据库管理语句、保留策略管理语句、DROP语句、持续查询、丰富的函数和数据运算符等。

3.1基本的SELECT语句

其中,<field_key>和<measurement_name>是必须的,其它部分为可选。<field_key>[,<field_key>,<tag_key>]表示指定查询结果展现的字段:

3.2WHERE过滤

<conditional_expression>表示查询过滤条件,AND表示条件与,OR表示条件或。

注意:不支持在where语句中使用or来指定多个时间范围。

select * from my where time='2019-07-31T20:07:00Z' or time='2019-07-31T20:07:00Z' 将返回空

3.2.1过滤指标

从cpu_usage表中查询CPU使用率大于30的时序数据

select * from cpu_usage where percent > 30

3.2.2过滤标签

在cpu_usage中过滤主机名为server1的时序数据

3.2.3过滤时间戳

  • 查询主机名为server1的最近一天的数据 select * from cpu_usage where host='server01' and time>now()-1d

3.3 GROUP BY

根据用户指定的标签或者时间间隔对查询结果数据进行分组。

3.4 ORDER BY

对结果集进行排序,排序方式包括时间升序和时间降序

3.5 LIMIT

3.6 SLIMIT

返回指定查询的前N个时间序列线中的时序数据,一般与GROUP BY搭配使用。 SLIMET是对分组个数进行限制,LIMIT是对记录数进行限制。

3.7 OFFSET

类似于分页功能。

3.8 SOFFSET

对分组进行分页啦。

3.9 时间语法

作为时序数据库, 支持丰富的时间计算、时间查询、时间分组等操作。 时间语法支持绝对时间和相对时间。

3.9.1 绝对时间

可以通过rfc3339时间字符串或Epoch时间来指定绝对时间。 rfc3339时间字符串如下:

其中,.nnnnnnnnnZ为可选,默认为000000000 简化版rfc3339时间字符串如下:

其中,HH:MM:SS.nnnnnnnnnZ为可选,默认全为0

infludDB支持的时间单位有:

  • ns 纳秒
  • u 微妙
  • ms 毫秒
  • s 秒
  • m 分钟
  • h小时
  • d天
  • w周

3.9.1 相对时间

可以通过now()函数实现相对当前服务器本地时间的数据查询,now()函数以当前服务器本地时间作为值,使用+ -等操作符获取指定时间间隔的当前绝对时间

3.10 关于双引号

select查询语句<database> <field_key> <measurement> <retension_policy> <tag_key>中以下情况要加双引号

  • 包含非[A-z,0-9]范围的字符
  • 以数字开头
  • 使用保留字 其他情况,允许使用不加双引号的简写。

3.11 数学运算符

  • '+' 、'-'、 '*'、 '/'、 '%' 在select等语句中,指标值和WHERE条件语句支持以上数学运算。

通过”内存使用量/内存使用率=总内存“可以只到两台服务器都是8G内存

  • 与 或 异或 & 按位与 | 按位或 ^ 按位异或 select value&10 from cpu

3.12函数

包括聚合函数和选择函数。

  • 聚合函数

select count(distinct(value)) from cpu_usage select mean(value) from cpu_usage where host='server01'

  • 选择函数

返回value最大的4个值 select TOP(value,4) from cpu_usage

3.13通过API查询数据

InfluxDB API接口是生产环境中常用的查询方式,通过发送一个GET请求/query路径,并设置URL的db参数为目标数据库,设置URL参数q为查询语句

注意,多条查询用;隔离,这在influx客户端是没问题的,但是应用程序需要将;号转换成%3B才能正常放回两条结果,不然不返回也不会报错。如下所示:

http://192.168.0.138:8086/query?--data-urlencode&db=my&--data-urlencod=&q=select * from cpu where myname='丛治志' %3Bselect count(myname) from cpu

参考https://blog.csdn.net/qq_35981283/article/details/76254420