InfluxDB環境搭建以及在Springboot中的簡單使用

目錄

環境搭建

rpm安裝

端口

配置文件

啓動

查看狀態

查看web頁面

SHELL命令

鏈接shell

創建數據庫

查看數據庫

創建用戶

--管理員用戶

--創建普通用戶並且授權

-- 創建數據庫

-- 查詢所有表

-- 刪除

--寫入

--查詢具體表數據

-- 清空表數據

JAVA API 使用

yml配置influxdb

Bean方式配置

API調用

官方API

代碼詳見:

參考資料



環境搭建

rpm安裝

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.2.4.x86_64.rpm
yum influxdb-1.2.4.x86_64.rpm

此處安裝的是1.2.4,需要注意的是,高版本的不支持web訪問。

其他版本的安裝可以參考官網,講解的很詳細

https://docs.influxdata.com/influxdb/v1.7/introduction/installation/

端口

  • port 8083:管理頁面端口,訪問localhost:8083可以進入你本機的influxdb管理頁面;
  • port 8086:http連接influxdb client端口,一般使用該端口往本機的influxdb讀寫數據。

配置文件

/etc/influxdb/influxdb.conf 採用最簡單的配置,修改一下2處,分別是設置web訪問和http訪問的端口、密碼

[admin]
  # Determines whether the admin service is enabled.
   enabled = true
  #WEB頁面的端口
  # The default bind address used by the admin service.
   bind-address = ":8083"
[http]
  # Determines whether HTTP endpoint is enabled.
  # enabled = true

  # The bind address used by the HTTP service.
  bind-address = ":8086"

  #開啓密碼
  # Determines whether HTTP authentication is enabled.
  auth-enabled = true

啓動

systemctl start influxdb

查看狀態

[root@axe1 influxdb]# systemctl status influxdb
● influxdb.service - InfluxDB is an open-source, distributed, time series database
   Loaded: loaded (/usr/lib/systemd/system/influxdb.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-10-08 18:54:59 CST; 8min ago
     Docs: https://docs.influxdata.com/influxdb/
 Main PID: 860 (influxd)
   CGroup: /system.slice/influxdb.service
           └─860 /usr/bin/influxd -config /etc/influxdb/influxdb.conf

Oct 08 18:55:00 axe1 influxd[860]: [I] 2019-10-08T10:55:00Z Authentication enabled:true service=httpd
Oct 08 18:55:00 axe1 influxd[860]: [I] 2019-10-08T10:55:00Z Listening on HTTP:[::]:8086 service=httpd
Oct 08 18:55:00 axe1 influxd[860]: [I] 2019-10-08T10:55:00Z Starting retention policy enforcement service with check interval of 30m0s service=retention
Oct 08 18:55:00 axe1 influxd[860]: [I] 2019-10-08T10:55:00Z Listening for signals
Oct 08 18:55:00 axe1 influxd[860]: [I] 2019-10-08T10:55:00Z Storing statistics in database '_internal' retention policy 'monitor', at interval 10s service=monitor
Oct 08 18:55:00 axe1 influxd[860]: [I] 2019-10-08T10:55:00Z Sending usage statistics to usage.influxdata.com
Oct 08 18:55:01 axe1 influxd[860]: [I] 2019-10-08T10:55:01Z beginning level 2 compaction of group 0, 1 TSM files engine=tsm1
Oct 08 18:55:01 axe1 influxd[860]: [I] 2019-10-08T10:55:01Z compacting level 2 group (0) /var/lib/influxdb/data/testdb/autogen/4/000000003-000000002.tsm (#0) engine=tsm1
Oct 08 18:55:01 axe1 influxd[860]: [I] 2019-10-08T10:55:01Z compacted level 2 1 files into 0 files in 2.012775ms engine=tsm1
Oct 08 18:55:20 axe1 influxd[860]: [I] 2019-10-08T10:55:20Z /var/lib/influxdb/data/_internal/monitor/10 database index loaded in 27.72µs service=shard

查看web頁面

 

SHELL命令

鏈接shell

[root@axe1 ~]# influx
Connected to http://localhost:8086 version 1.2.4
InfluxDB shell version: 1.2.4
> auth
username: admin
password:
> show databases
name: databases
name
----
_internal
testdb

>

創建數據庫

create database testdb

查看數據庫

show databases

創建用戶

--管理員用戶

   CREATE USER ... 一定要大寫,否則會不識別

CREATE USER admin WITH PASSWORD 'admin' WITH ALL PRIVILEGES

--創建普通用戶並且授權

CREATE USER test WITH PASSWORD 'test'
GRANT READ ON testdb to test
GRANT WRITE ON testdb to test

使用用戶名密碼登錄
vim /etc/influxdb/influxdb.conf
找到[http] 選項 把auth-enabled設置成true
然後 systemctl restart influxdb 重啓

 

此時執行 influx 登錄shell客戶端
show databases 發現沒有權限,於是exit退出
使用influx -username admin -password 'admin'  進行登錄後 查詢show databases ,正常


-- 創建數據庫

使用自定義 Retention Policy
DURATION爲數據存儲時長,下面的1d即只存1天的數據;
REPLICATION爲數據副本,一般在使用集羣的時候纔會設置爲>1;
SHARD DURATION爲分區間隔,InfluxDB默認對數據分區,下面的30m即對數據每隔30分鐘做一個新的分區;
Name是Retention Policy的名字。

CREATE DATABASE "testdb" WITH DURATION 1d REPLICATION 1 SHARD DURATION 30m NAME "myrp"


-- 可以單獨創建Retention Policy,加在已經創建的DB上

CREATE RETENTION POLICY "Alone RP" ON "testdb" DURATION 60m REPLICATION 2 SHARD DURATION 30m

-- 查詢所有表

testdb數據庫下所有的表(measurements)
 

> use testdb;
Using database testdb
> show measurements;
name: measurements
name
----
flyrecord

-- 刪除

testdb數據庫下的表flyrecord

> use testdb;
Using database testdb
> drop measurement flyrecord;
> select * from flyrecord ;  //查詢不到了
>

--寫入

數據
表名(measurements) flyrecord
索引(tag) cpuid的值是edae-fsdw-1111
內容(field) [lat=123.112343] 和 [lon=31.223412]

insert flyrecord,cpuid=edae-fsdw-1111 lat=123.112343,lon=31.223412

說明:insert 之後的第一個字段flyrecord是表名,表名逗號後面的內容是索引的key和value,這裏使用的是cpuid=edae-fsdw-1111
然後在索引後面 加上一個空格 就可以寫具體的字段內容了,可以是一個 也可以是多個,多個field之前使用逗號隔開。
tag索引也可以是多個,是用逗號隔開

--查詢具體表數據

數據

> select * from flyrecord
name: flyrecord
time                cpuid          lat        lon       power value
----                -----          ---        ---       ----- -----
1569756936608570350 edae-fs41-4444                            1
1569756957909065782 edae-fs41-4444                            2
1569756960934153730 edae-fs41-4444                            3
1569757053634546984 edae-fsdw-1111 123.112343 31.223412
1569757550151189402 edae-fsdw-1111 111.112343 12.001234 100
1569757556933183820 edae-fsdw-1111 111.112343 12.001234 99
1569757559758538579 edae-fsdw-1111 111.112343 12.001234 60
> select * from flyrecord ORDER BY time desc LIMIT 2
name: flyrecord
time                cpuid          lat        lon       power value
----                -----          ---        ---       ----- -----
1569757668226541325 222            111.112343 12.001234 60
1569757559758538579 edae-fsdw-1111 111.112343 12.001234 60

-- 清空表數據

> select * from flyrecord
name: flyrecord
time                cpuid cputype lat lon power
----                ----- ------- --- --- -----
1569768669249942553 111   H       1.1 2.2 99

> delete from flyrecord //清空表數據
> select * from flyrecord
>

 

JAVA API 使用

 

新建Springboot工程,引入influxdb的依賴

        <dependency>
            <groupId>org.influxdb</groupId>
            <artifactId>influxdb-java</artifactId>
            <version>2.7</version>
        </dependency>

同時引入lombok和beanutils和fastjson爲後續使用

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>

yml配置influxdb

application.yml

spring:
  #此處填寫配置後,不需要在JAVA代碼中再次進行配置,可以直接注入InfluxDB
  influx:
    #端口在/etc/influxdb/influxdb.conf的[http]中配置
    #此處需要[http://]否則會報錯【Factory method 'influxDb' threw exception; nested exception is java.lang.IllegalArgumentException: Unable to parse url: 192.168.86.101:8086】
    url: http://192.168.86.101:8086
    user: admin
    password: admin
  application:
    name: influxdb-demo
server:
  port: 18044

Bean方式配置

InfluxDBConfig.java
package com.zzj.influxdbdemo.config;

import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Component
public class InfluxDBConfig {
    @Value("${spring.influx.user}")
    private String userName;

    @Value("${spring.influx.password}")
    private String password;

    @Value("${spring.influx.url}")
    private String url;

    private String database;

    private String retentionPolicy;

    private InfluxDB influxDB;

    public InfluxDBConfig() {
    }


    public InfluxDBConfig(String userName, String password, String url, String database) {
        this.userName = userName;
        this.password = password;
        this.url = url;
        this.database = database;
        build();
    }

    public InfluxDBConfig(String database) {
        this.database = database;
        build();
    }

    private void build(){
        if(influxDB == null){
            influxDB = InfluxDBFactory.connect(this.url,this.userName,this.password);
        }
        influxDB.setDatabase(this.database);
        influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
    }

    public InfluxDB getInfluxDB() {
        return influxDB;
    }
}

API調用

package com.zzj.influxdbdemo.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.util.BeanUtil;
import com.sun.org.apache.xpath.internal.SourceTree;
import com.zzj.influxdbdemo.config.InfluxDBConfig;
import com.zzj.influxdbdemo.entity.TrackPoint;
import org.apache.commons.beanutils.BeanMap;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.influxdb.InfluxDB;
import org.influxdb.dto.Point;
import org.influxdb.dto.Query;
import org.influxdb.dto.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.InvocationTargetException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/influx")
public class InfluxDBController {

    @Value("${spring.influx.user}")
    private String userName;

    @Value("${spring.influx.password}")
    private String password;

    @Value("${spring.influx.url}")
    private String url;


    @Autowired
    private InfluxDB influxDB;

    @GetMapping("/get")
    public String test(){
        String sql = "select * from trackpoint";
        Query query = new Query(sql,"testdb");
        influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
        //毫秒輸出
        QueryResult queryResult = influxDB.query(query, TimeUnit.MILLISECONDS);
        List<QueryResult.Result> resultList =  queryResult.getResults();

        String sss = queryResult.toString();
        //兩種方式都可以
        InfluxDBConfig config = new InfluxDBConfig(userName,password,url,"testdb");
        InfluxDB dbConfig = config.getInfluxDB();
        queryResult = dbConfig.query(query);

        //把查詢出的結果集轉換成對應的實體對象,聚合成list
        List<TrackPoint> trackPoints = new ArrayList<>();
        for(QueryResult.Result result:resultList){
            List<QueryResult.Series> seriesList = result.getSeries();
            for(QueryResult.Series series : seriesList){
                String name = series.getName();
                Map<String, String> tags = series.getTags();
                List<String> columns = series.getColumns();
                String[] keys =  columns.toArray(new String[columns.size()]);
                List<List<Object>> values = series.getValues();
                for(List<Object> value:values){
                    Map beanMap = new HashMap();
                    TrackPoint point = new TrackPoint();
                    for (int i = 0; i < keys.length; i++) {
                        beanMap.put(keys[i],value.get(i));
                    }
                    try {
                        //查詢的時候沒用,寫入point的時候用
                        Point po = Point.measurement("trackpoint").fields(beanMap).build();
                        //time 默認存入的是UTC格式  2019-09-29T22:58:23.58978834,默認轉換成String
                        //{"cpuid":"11","cputype":"H","lat":"10.111222","lon":"78.000111","state":"on","time":"2019-09-29T22:57:06.732701567Z"}
                        BeanUtils.populate(point,beanMap );
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                    System.out.println(point.toString());
                    trackPoints.add(point);
                }
            }
        }

        return trackPoints.toString();
    }
    @GetMapping("/insert")
    public void insert(){
        TrackPoint trackPoint = new TrackPoint();
        trackPoint.setCpuid("666");
        trackPoint.setCputype("F");
        trackPoint.setLat(12.335555f);
        trackPoint.setLon(55.125011f);
        trackPoint.setState("on");
        Map<String,Object> bean = new HashMap();
        try {
            //BeanUtils.describe(trackPoint);//這個只能轉String,String 不符合要求
            //這個轉換也不符合要求,因爲轉換map過程中,字段類型發生變化,在後面寫入influx中,會變成創建新的filed 或者 直接出錯。
            //可以自寫反射
            String jsonString = JSON.toJSONString(trackPoint);
            bean = JSON.parseObject(jsonString);
            Point po = Point.measurement("trackpoint").fields(bean).build();
            //influxDB.setDatabase("testdb").write(po);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //一種
        Point.Builder builder = Point.measurement("trackpoint");
        builder.time(System.currentTimeMillis(),TimeUnit.MICROSECONDS);
        builder.addField("lat",12.441234f);
        builder.addField("lon",56.512399f);
        builder.addField("state","off");
        builder.tag("cpuid","666888");
        builder.tag("cputype","F");
        Point point = builder.build();
        influxDB.setDatabase("testdb").write(point);
    }
}

官方API

調用樣例

https://github.com/influxdata/influxdb-java

 

代碼詳見:

https://github.com/MCJIBA/influxdb-demo

 

參考資料

https://www.jianshu.com/p/4e219bc2f1bf

https://www.cnblogs.com/senlinyang/p/8580877.html

https://www.cnblogs.com/morgana/p/8874673.html

https://jasper-zhang1.gitbooks.io/influxdb/content/Introduction/getting_start.html

https://github.com/influxdata/influxdb-java

https://docs.influxdata.com/influxdb/v1.7/introduction/installation/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章