influxDB 原理与实践

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

2020-06-24  本文已影响0人  源码之路

1. 操作模式

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

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

1.1 influx命令行模式

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

1.2 API模式

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


2. 写入

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

2.1 行协议

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


//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过滤时间戳

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支持的时间单位有:

3.9.1 相对时间

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




3.10 关于双引号

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

3.11 数学运算符

3.12函数

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

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



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
上一篇 下一篇

猜你喜欢

热点阅读