springboot整合influxdb库-influxdb专题
1、添加依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.tire.net</groupId> <artifactId>tire</artifactId> <version>0.0.1-SNAPSHOT</version> <name>tire</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- influxdb架包 --> <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、添加配置文件
spring: influx: url: * password: admin user: 123 database: test_data application: name: tire-net server: port: 8081
package com.tire.net.configure; import com.tire.net.utils.InfluxDbUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author bai */ @Configuration public class InfluxDbConfig { @Value("${spring.influx.url:''}") private String influxDBUrl; @Value("${spring.influx.user:''}") private String userName; @Value("${spring.influx.password:''}") private String password; @Value("${spring.influx.database:''}") private String database; @Bean public InfluxDbUtils influxDbUtils() { return new InfluxDbUtils(userName, password, influxDBUrl, database, ""); } }
package com.tire.net.utils; import lombok.Data; import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.Query; /** * @author bai */ @Data public class InfluxDbUtils { private String userName; private String password; private String url; public String database; private String retentionPolicy; /** * InfluxDB实例 */ private InfluxDB influxDB; public InfluxDbUtils(String userName, String password, String url, String database, String retentionPolicy) { this.userName = userName; this.password = password; this.url = url; this.database = database; this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy; this.influxDB = influxDbBuild(); } /** * 连接数据库 ,若不存在则创建 * * @return influxDb实例 */ private InfluxDB influxDbBuild() { if (influxDB == null) { influxDB = InfluxDBFactory.connect(url, userName, password); } try { createDB(database); influxDB.setDatabase(database); } catch (Exception e) { } finally { influxDB.setRetentionPolicy(retentionPolicy); } influxDB.setLogLevel(InfluxDB.LogLevel.BASIC); return influxDB; } /**** * 创建数据库 * @param database */ private void createDB(String database) { influxDB.query(new Query("CREATE DATABASE " + database)); } }
参考:https://www.hangge.com/blog/cache/detail_3009.html
官网文档:https://docs.influxdata.com/influxdb/v1.8/
基础命令:
create database mydb
show databases
use mydb
insert cpu,host=servera,region=us_west value=0.64
select ''host",from 'cup'
SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01'
InfluxQL允许您在WHERE子句中指定查询的时间范围。您可以使用日期时间字符串,这些日期时间字符串用单引号引起来,其格式为YYYY-MM-DD HH:MM:SS.mmm (mmm是毫秒,是可选的,还可以指定微秒或纳秒)。您还可以使用相对时间now()来引用服务器的当前时间戳:
SELECT * FROM "foodships" WHERE time > now() - 1h
删除方法:
您可以删除或删除序列,但不能删除或删除基于字段值的单个点。解决方法是,您可以搜索字段值,检索时间,然后根据time字段进行删除。
CREATE RETENTION POLICY "two_hours" ON "food_data" DURATION 2h REPLICATION 1 DEFAUL
制定52周的保留政策
CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1
查看保留策略
show retention policies on influxdb
修改保留策略
alter retention policy ''influx_retention" on influxdb duration 15d
删除保留策略
drop retention policy "influx_retention" on influxdb
注意:保留策略是对数据库设置的
influxd -config /etc/influxdb/influxdb.conf
3、docker部署influxdb
docker pull influxdb:1.7
4、安装和配置grafana
docker安装部署
docker pull grafana/grafana:7.4.3
docker run -d -p 8093:8083 -p 8086:8086 -v influxdb:/var/lib/influxdb influxdb:1.7
docker run -d -p 6060:3000 --name grafana grafana/grafana:7.4.3
参考:https://grafana.com/docs/grafana/latest/?utm_source=grafana_gettingstarted
https://blog.csdn.net/yy756127197/article/details/103411325
时序数据库介绍
时序数据是一组按照时间维度索引的数据。时序数据在日常生活中随处可见,比如每个整点的温度、湿度等天气数据,每分钟的股票价格数据等。我们常用曲线图、柱状图等形式去展现时序数据,也就是我们常常听到的“数据可视化”。
时序数据库是一种非关系型数据库,以时间作为数据主键,专门用来存储时序数据。
时序数据库的特点
-
高压缩比:由于数据每分每秒都在变化,海量的时序数据往往体量巨大,占用大量硬件资源,所以需要优化数据压缩算法提高数据压缩比。
-
高并发写入:时序数据库采用持续高并发写入数据,无更新的方式,对于时间相同的重复的数据,只保留一份。
-
低延时、高并发查询:通过索引降低查询延时,通过缓存等技术提高数据并发能力。
时序数据库的使用场景
-
IOT行业:电力、化工等工业物联网数据监测
-
金融行业:各类金融产品及其衍生品、数字货币数据存储与量化研究
-
IT行业:服务器、虚拟机、容器等的状态数据实时监测
-
互联网行业:用户行为轨迹,日志等数据。
-
……
InfluxDB特性
-
专为时间序列数据编写的定制高性能数据存储。TSM引擎可实现高提取速度和数据压缩
-
完全用Go编写。它可以编译为一个没有外部依赖项的二进制文件。
-
简单,高性能的写入和查询HTTP API。
-
插件支持其他数据协议,例如Graphite,collected和OpenTSDB。
-
类似于SQL的富有表现力的查询语言,旨在轻松查询聚合数据。
-
标签允许对系列进行索引,以进行快速有效的查询。
-
保留策略可以有效地自动过期数据。
-
连续查询会自动计算聚合数据,从而使频繁查询更加有效。
本教程基于InfluxDB v1.8
InfluxDB安装与启动
InfluxDB安装非常简单,根据操作系统执行对应的安装命令即可。
安装
Ubuntu和Debian
SHA256: ad4058db83f424dad21337f3d7135de921498b652d67e2fcd2e2e070d2997a2d
wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.4_amd64.deb
sudo dpkg -i influxdb_1.8.4_amd64.deb
RedHat和CentOS
SHA256: f13cc117d3763908f045fc244f95948d0a1637459518a81e3bb4f8ba1f202e35
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4.x86_64.rpm
sudo yum localinstall influxdb-1.8.4.x86_64.rpm
Mac OS X
SHA256: d69be0c5b798096dfe53440f10cd350fd7cd68517c3ffe774451de5e63fa1284
https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4_darwin_amd64.tar.gz
tar zxvf influxdb-1.8.4_darwin_amd64.tar.gz
Windows二进制文件(64位)
SHA256: 09c63a0afc3587a827670504d0354f0926192a046961838c922dbe8bd5a71783
https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4_windows_amd64.zip
unzip influxdb-1.8.4_windows_amd64.zip
Docker镜像
docker pull influxdb:1.8
OS X(通过Homebrew)
brew update
brew install influxdb@1.8.4
启动
启动influx数据服务
命令行执行以下命令
sudo service influxdb start
如果操作系统使用的是systemd(Ubuntu 15.04 +,Debian 8+,CentOS 7 +,RHEL 7+)
sudo systemctl start influxdb
设置开机自动启动
sudo systemctl enable influxdb
进入CLI(命令行界面)
在命令行输入命令influx即可启动CLI,并自动连接到本地InfluxDB实例。
$ influx
Connected to http://localhost:8086 version 1.8.4
InfluxDB shell version: 1.8.4
>
默认情况下,InfluxDB API在8086端口上运行。因此,influx将默认连接到端口localhost:8086。如果需要更改这些默认值,请运行influx --help。
InfluxDB名词解释
时序数据库由于其存储海量时序数据的特性,因此与传统数据库有些许不同,本文对influxdb时序数据库中涉及的基本概念作出解释。
influxdb中的database、measurement、point
database:数据库,同Mysql等关系型数据库中的“数据库Database”
measurement:数据表,相当于关系型数据库中的“表Table”
point:数据点,表示单条数据记录,相当于关系型数据库中的“一行数据”
由于database和measurement与传统数据库基本相同,这里不做过多解释,以下针对influxdb中特有的Point进行讲解。
Point
Point由时间(time)、数据(field)、标签(tags)三类字段组成。
time:代表每条数据的时间字段,是measurement中的数据主键,因此time字段具有索引属性。一条point只能有一个time。
field:代表各种数据的字段,例如气温、压力、股价等,field字段没有索引属性。一条point可以包括多个field。
tag:代表各类非数据字段,例如设备编码、地区、姓名等,tag字段有索引属性。一条point可以包括多个tag。
例子
两位科学家langstroth和perpetua于2015年8月18日在两个不同位置进行一项计算蝴蝶和蜜蜂数量的统计实验。假设他们使用同一个database,并使用同一个名为census的measurement录入数据。以下表示某一个point的样例数据:
其中time为time字段。butterflies和honeybees分别代表蝴蝶和蜜蜂的数量,因此他们是field字段。location和scientist代表科学家的位置和名字,因此他们是tag字段。
InfluxDB查询语言(InfluxQL)
InfluxQL
InfluxQL是一种类似于SQL的查询语言,用于与InfluxDB进行交互。如果你使用过关系数据库及SQL,那么你可以很快速的掌握InfluxQL。
然而,InfluxQL不完全是SQL,缺乏SQL中的一些高级的语法,例如UNION,JOIN,HAVING等,这些高级语法可以在InfluxDB的另一种专用查询语言Flux中使用。本文介绍InfluxQL语言的使用方法。
数据库操作
# 使用Command命令行进入influxdb
influx
# 创建数据库
CREATE DATABASE mydb
# 显示所有数据库
SHOW DATABASES
# 删除数据库
DROP DATABASE mydb
# 使用数据库
USE mydb
表操作
创建表:InfluxDB没有专门的创建表的命令,当插入一条数据point至某A表时,此A表会自动创建,并且表的格式、字段名、字段类型也由此条插入命令决定。
修改表:InfluxDB没有修改表的命令,但当插入一条新数据point至表A时,如果此point中的字段多于原A表的字段,会自动修改A表与此条插入数据的格式字段等一致。注意此种情况仅限于新插入的数据字段与表A字段的交集即表A的情况,否则例如新插入数据字段与表A完全不同会插入失败。
查询表:
# 显示该数据库中的表
SHOW MEASUREMENTS
删除表:
DROP MEASUREMENT "measurementName"
参考官网教程地址;https://docs.influxdata.com/influxdb/v1.7/
用户管理
#显示用户 show users #创建用户 create user "username" with password 'password' #创建管理员权限用户 create user "username" with password 'password' with all privileges #删除用户 drop user "username"
特别注意:
group by您不能用于GROUP BY
对字段进行分组。
GROUP BY *
按所有标签对结果进行分组
GROUP BY <tag_key>
按特定标签对结果进行分组
GROUP BY <tag_key>,<tag_key>
按多个标签对结果进行分组。标签键的顺序无关紧要。
如果查询包含WHERE
子句,则该GROUP BY
子句必须出现在该WHERE
子句之后。
tag和field设计
tag是字符串,field支持int,float类型,tag有索引,field没有
tag选择:经常查询数据,需要group by
字段选择:用于函数计算,非字符串
保留策略和分片
常见错误
InfluxDB数据库报错ERR: unable to parse authentication credentials Warning: It is possible this error is due to not setting a database. Please set a database with the command "use <database>".
报错的意思是要验证
执行auth命令进行授权验证,账户和密码必须是数据库管理员权限
系统架构
influxdb查询设置北京时间
InfluxDB默认以UTC时间存储并返回时间戳,当接收到一个时序数据记录时,InfluxDB将时间戳从本地时区时间转换为UTC时间并存储,查询时,InfluxDB返回的时间戳对应的是UTC时间。InfluxDB支持通过在tz()子句中指定TZ格式的时区名字,如Asia/Shanghai,将UTC时间转换为中国本地时间。
SELECT * FROM "cpu" WHERE time > now() - 5m tz('Asia/Shanghai')
SELECT * FROM "system" WHERE time > now() - 5m tz('Asia/Shanghai')
登录问题:
InfluxDB数据库报错ERR: unable to parse authentication credentials Warning: It is possible this error is due to not setting a database. Please set a database with the command "use <database>".