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>".

 

posted @ 2021-02-24 10:29  刘百会  阅读(5617)  评论(0编辑  收藏  举报