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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM