目錄
環境搭建
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/