zoukankan      html  css  js  c++  java
  • 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命令进行授权验证,账户和密码必须是数据库管理员权限

    系统架构

  • 相关阅读:
    【JZOJ4928】【NOIP2017提高组模拟12.18】A
    【JZOJ4922】【NOIP2017提高组模拟12.17】环
    【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢
    【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见
    【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇
    【JZOJ4920】【NOIP2017提高组模拟12.10】降雷皇
    【JZOJ4921】【NOIP2017提高组模拟12.10】幻魔皇
    【罗宾欺诈者】回环符文——回文树(回文自动机)
    【怪物】KMP畸形变种——扩展KMP
    【51NOD1304】字符串的相似度
  • 原文地址:https://www.cnblogs.com/liubaihui/p/14439869.html
Copyright © 2011-2022 走看看