时序数据库-influxdb
# 时序数据库-influxdb
# 1. Influxdb1.x 快速入门
# 1. InfluxDB1.x Docker安装
docker安装InfluxDB1.x (influxdb1.8.4)
# 1. 安装
docker run -d --name influxdb -p 8087:8086 influxdb:1.8.4
注意:这里端口使用8087。(端口8086安装2.x版本已使用)
# 2. 查看
docker ps -a
# 3. 进入容器
docker exec -it 容器名称/容器ID bin/bash
-- 如:容器名称
docker exec -it influxdb /bin/bash
2
3
4
# 4. 直接输入influx启动
# 启动influxdb
influx
# 退出
exit
2
3
4
5
# 5. 修改账户信息
【需进入influxdb中操作】
# 显示用户
SHOW USERS
# 创建用户
CREATE USER "username" WITH PASSWORD 'password'
# 赋予用户管理员权限
GRANT ALL PRIVILEGES TO username
# 创建管理员权限的用户
CREATE USER <username> WITH PASSWORD '<password>' WITH ALL PRIVILEGES
# 修改用户密码
SET PASSWORD FOR username = 'password'
# 撤消权限
REVOKE ALL ON mydb FROM username
# 查看权限
SHOW GRANTS FOR username
# 删除用户
DROP USER "username"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 6. 在配置文件启用认证
默认情况下,influxdb的配置文件是禁用认证策略的,所以需要修改设置一下。 编辑配置文件vim /etc/influxdb/influxdb.conf,把 [http] 下的 auth-enabled 选项设置为 true
# 进入influxdb容器
docker exec -it influxdb /bin/bash
# 编辑数据
vim /etc/influxdb/influxdb.conf
2
3
4
5
未完待续。。。。。。。。
# 2. Influxdb2.x 快速入门
# 1. influxdb2.x介绍
https://www.jianshu.com/p/268fca65f10e
本文使用的是influxdb 2.2版本。
# 1. 介绍
InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
2021年6月份,发布influxdb2.x,与前面版本结构有所差异
- 1.x 版本使用 influxQL 查询语言,2.x 和 1.8+(beta) 使用 flux 查询语法;相比V1 移除了database 和 RP,增加了bucket。
- V2具有以下几个概念: timestamp、field key、field value、field set、tag key、tag value、tag set、measurement、series、point、bucket、bucket schema、organization
- 新增的概念:
- bucket:所有 InfluxDB 数据都存储在一个存储桶中。一个桶结合了数据库的概念和存储周期(时间每个数据点仍然存在持续时间)。一个桶属于一个组织
- bucket schema:具有明确的schema-type的存储桶需要为每个度量指定显式架构。测量包含标签、字段和时间戳。显式模式限制了可以写入该度量的数据的形状。
- organization:InfluxDB组织是一组用户的工作区。所有仪表板、任务、存储桶和用户都属于一个组织。
# 2. InfluxDB有三大特性:
- Time Series (时间序列):你可以使用与时间有关的相关函数(如最大,最小,求和等)
- Metrics(度量):你可以实时对大量数据进行计算
- Eevents(事件):它支持任意的事件数据
# 3. 特点
- 为时间序列数据专门编写的自定义高性能数据存储。 TSM引擎具有高性能的写入和数据压缩
- Golang编写,没有其它的依赖
- 提供简单、高性能的写入、查询 http api,Native HTTP API, 内置http支持,使用http读写
- 插件支持其它数据写入协议,例如 graphite、collectd、OpenTSDB
- 支持类sql查询语句
- tags可以索引序列化,提供快速有效的查询
- Retention policies自动处理过期数据
- Continuous queries自动聚合,提高查询效率
- schemaless(无结构),可以是任意数量的列
- Scalable可拓展
- min, max, sum, count, mean,median 一系列函数,方便统计
- Built-in Explorer 自带管理工具
# 4. 核心概念
示例数据(解释某些概念用)
_time | _measurement | location | scientist | _field | _value |
---|---|---|---|---|---|
2019-08-18T00:00:00Z | census | klamath | anderson | bees | 23 |
2019-08-18T00:00:00Z | census | portland | mullen | ants | 30 |
Organization organization 是一组用户的工作空间,一个组下用户可以创建多个bucket
bucket 所有的 influxdb数据都存储在bucket中,bucket结合了数据库和保存期限(每条数据会被保留的时间)的概念,类似于RDMS的database的概念。bucket属于一个organization
Measurement measurement是所有 tags fields 和时间的容器和RDMS的table的概念类似,是一个数据集的容器
Fields 数据属性包括field key 和 field value 分别存储在 _field和 _value当中, 并且一个measurement中必须包含至少一个filed
Field key field key 是一个代表属性名称的字段,在示例数据中bees和ants就是field key
Field value field value 是对应 field key 的值,在示例数据中在2019-08-18T00:00:00Z该时间点 bees的值为23,而ants的值为30
Field set field set 表示在同一时间内 所有fields的集合
Tags 和Fields类似,Tags也有 key value。但与Fields不同的是,field key存储在_field列中 而tag key则是本省就是列
tag key 和 tag value 即tag 的 key 和 value 在Line Protocl中有更为直观的体现
timestamp 所有存储在influxdb中的数据都有一个_time列用来记录时间,在磁盘中以纳秒之间戳存储,但客户端查询时返回的是格式化的更易读的 RFC3339 UTC时间格式
- 对于Fields 和 Tags 简单来说他们都是一组键值对的集合。在存储形式上,field 的key 被存储在一个名为_field的列中,而tag 的key则是以列头的形式存在的,该列的内容即为tag value。可以从示例数据中直观的看出其区别。
- 另外值得注意的是,field 和 tag 都可以用来存储数据,但tag只能存储字符串类型数据,而filed既可以存储字符串类型又可以存储数值类型数据。
- 那么我是否可以在tag中存储字符串形式的数据呢? 当然可以但其不可以参与flux查询中的mean() max() 等聚合函数的计算。所以field 和 tag 还是有着本质上的区别的。
# 2. 安装
# 1. 官网:
https://www.influxdata.com/
# 2. 文档2.3
:
https://docs.influxdata.com/influxdb/v2.3/
# 3. 下载地址:
地址: https://www.influxdata.com/get-influxdb/
下载页
点击release-notes, 进入: https://docs.influxdata.com/influxdb/v2.3/install/?t=Linux
此处有官方文档的详细安装说明(包含mac、linux、windows)。下面有自己安装过程的记录。
- 安装服务端
influxdb2-2.2.0.x86_64.rpm
参考:https://blog.csdn.net/l_15156024189/article/details/124726892
- 下载安装包
清华镜像: Index of /influxdata/yum/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror (opens new window)
本文选择: influxdb2-2.2.0.x86_64.rpm
# 1. centos
# 官网
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.2.0-amd64.rpm
# 清华源
wget https://mirrors.tuna.tsinghua.edu.cn/influxdata/yum/el7-x86_64/influxdb2-2.2.0.x86_64.rpm
2
3
4
5
注意:wget下载https出现:
--no-check-certificate
使用 wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/influxdata/yum/el7-x86_64/influxdb2-2.2.0.x86_64.rpm
sudo yum localinstall -y influxdb2-2.2.0.x86_64.rpm
# 2. ubuntu
# Ubuntu/Debian
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.2.0.x86_64.deb
sudo dpkg -i influxdb2-2.2.0.x86_64.deb
2
3
# 3. docker
InfluxDB 2.x 初始化凭证 自动 InfluxDB 升级过程引导InfluxDB 2.x 所需的初始管理员用户、 组织和 存储桶。在 Docker 容器中设置以下环境变量 以提供设置凭据:
- DOCKER_INFLUXDB_INIT_USERNAME:为管理员用户设置的用户名(必需)。
- DOCKER_INFLUXDB_INIT_PASSWORD:为管理员用户设置的密码(必需)。
- DOCKER_INFLUXDB_INIT_ORG:为初始组织设置的名称(必需)。
- DOCKER_INFLUXDB_INIT_BUCKET:为初始存储桶设置的名称(必需)。
- DOCKER_INFLUXDB_INIT_RETENTION:初始存储桶保留期的持续时间。如果未设置,初始存储桶将永久保留数据。
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN:与管理员用户关联的 API 令牌。如果没有设置,InfluxDB 会自动生成一个令牌。
# 拉取镜像
doker pull influxdb:2.3
# 安装
docker run -d -p 8086:8086 \
-v influxdb:/var/lib/influxdb \
-v influxdb2:/var/lib/influxdb2 \
-e DOCKER_INFLUXDB_INIT_MODE=upgrade \
-e DOCKER_INFLUXDB_INIT_USERNAME=my-user \
-e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \
-e DOCKER_INFLUXDB_INIT_ORG=my-org \
-e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \
influxdb:2.3
2
3
4
5
6
7
8
9
10
11
12
13
- 配置
# 配置文件目录:
# 进入目录
cd /etc/influxdb/
2
# 默认配置如下
cat config.toml
# 3. 启动 InfluxDB
执行如下命令开机启动:
# 开机自启:
systemctl enable influxdb
# 启动:
systemctl start influxdb
# 重启:
systemctl restart influxdb
# 停止
systemctl stop influxdb
# 查看状态
systemctl status influxdb
2
3
4
5
6
7
8
9
10
11
12
13
14
启动方式
# 第一种
systemctl start influxdb
# 第二种
service influxdb start
# 第三种
influxdb run
2
3
4
5
6
7
8
# 4. 验证
# 1. 访问
访问:ip:8086 http://localhost:8086 http://192.168.47.129:8086
# 2. 初始化用户设置
初始化时用户名:influxdb,密码:influxdb
从上到下为:账号(zhouhong)、密码(66668888)、确认密码(66668888)、组织(my_influxdb)、Buucket(Tom);完了之后点击 Quick Start
# 3. 首页
# 4. 关于about
# 5. token令牌
# 6. 初始化创建的Bucket
# 7. 设置Bucket的保存策略
# 5. 安装Windows CLI
文档地址:https://docs.influxdata.com/influxdb/v2.3/install/?t=Windows
influxdb2-client-2.3.0-windows-amd64
# 1. 下载地址
地址: https://docs.influxdata.com/influxdb/v2.3/tools/influx-cli/
# 2. 解压
- 解压后的目录
- 文件内容
# 3. 授予对influxCLI 的网络访问权限。
- influx首次使用CLI 时, Windows Defender显示以下消息:
Windows Defender 防火墙已阻止此应用程序的某些功能。
要授予influxCLI 所需的访问权限,请执行以下操作:
1. 选择专用网络,例如我的家庭或工作网络。
2. 单击允许访问。
2
3
4
- 为了后面执行influx命令不需要每次都连接和验证token,可以执行如下命令创建一个配置:
influx config create --config-name influxdb2.conf \
--host-url http://192.168.47.129:8086 \
--org chggx \
--token ExGUyaInMuPVpp6vZa9RuuyGBhcywlOzT_fYkYdwiLT5FSJdENA1-PQ-EKWp2RFdZNl8r6yDQcLR8KH0Hw8KuQ== \
--active
2
3
4
5
- --host-url: 服务端地址:http://192.168.47.129:8086
- --org
# 3. influxdb2.2与springboot集成
参考: https://www.cnblogs.com/Tom-shushu/p/15830776.html https://blog.csdn.net/Calm_D/article/details/120646931[另外一种写法]
# 1. 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb-client-java</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<version>2.20</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 2. yml配置文件
influx:
influxUrl: 'http://192.168.47.129:8086'
bucket: 'chggx'
org: 'chggx'
token: 'ExGUyaInMuPVpp6vZa9RuuyGBhcywlOzT_fYkYdwiLT5FSJdENA1-PQ-EKWp2RFdZNl8r6yDQcLR8KH0Hw8KuQ=='
2
3
4
5
# 3. Influx实例化类
@Setter
@Getter
public class InfluxBean{
/**
* 数据库url地址
*/
private String influxUrl;
/**
* 桶(表)
*/
private String bucket;
/**
* 组织
*/
private String org;
/**
* token
*/
private String token;
/**
* 数据库连接
*/
private InfluxDBClient client;
/**
* 构造方法
*/
public InfluxBean(String influxUrl, String bucket, String org, String token) {
this.influxUrl = influxUrl;
this.bucket = bucket;
this.org = org;
this.token = token;
this.client = getClient();
}
/**
* 获取连接
*/
private InfluxDBClient getClient() {
if (client == null) {
client = InfluxDBClientFactory.create(influxUrl, token.toCharArray());
}
return client;
}
/**
* 写入数据(以秒为时间单位)
*/
public void write(Object object){
try (WriteApi writeApi = client.getWriteApi()) {
writeApi.writeMeasurement(bucket, org, WritePrecision.NS, object);
}
}
/**
* 读取数据
*/
public List<FluxTable> queryTable(String fluxQuery){
return client.getQueryApi().query(fluxQuery, org);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 4、Influx配置类: 启动Spring工程时实例化InfluxBean
# 1. 配置类
@Data
@Configuration
@ConfigurationProperties(prefix = "influx")
public class InfluxConfig {
/**
* url地址
*/
private String influxUrl;
/**
* 桶(表)
*/
private String bucket;
/**
* 组织
*/
private String org;
/**
* token
*/
private String token;
/**
* 初始化bean
*/
@Bean(name = "influx")
public InfluxBean InfluxBean() {
return new InfluxBean(influxUrl, bucket, org, token);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 2. 配置类(写法二)
@Configuration
public class InfluxConfig {
/**
* url地址
*/
@Value("${spring.influx.url}")
private String influxUrl;
/**
* 桶(表)
*/
@Value("${spring.influx.bucket}")
private String bucket;
/**
* 组织
*/
@Value("${spring.influx.org}")
private String org;
/**
* token
*/
@Value("${spring.influx.token}")
private String token;
/**
* 初始化bean
*/
@Bean(name = "influx")
public InfluxBean InfluxBean() {
return new InfluxBean(influxUrl, bucket, org, token);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 5. 数据库桶(表)实体类
@Measurement(name = "influxEntity")
@Getter
@Setter
public class InfluxEntity{
/**
* 值
*/
@Column
Integer value;
/**
* 标签字段
*/
@Column(tag = true)
String tag;
/**
* 时间
*/
@Column(timestamp = true)
Instant time;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 6. 实现类
package com.chggx.influxdb2x.servie.impl;
import com.chggx.influxdb2x.config.InfluxBean;
import com.chggx.influxdb2x.model.param.InsertParams;
import com.chggx.influxdb2x.model.restlt.InfluxResult;
import com.chggx.influxdb2x.servie.InfluxService;
import com.influxdb.query.FluxTable;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class InfluxServiceImpl implements InfluxService {
@Resource
private InfluxBean influxBean;
@Override
public void insert(InsertParams insertParams) {
insertParams.setTime(Instant.now());
influxBean.write(insertParams);
}
@Override
public List<InfluxResult> queue(){
// 下面两个 private 方法 赋值给 list 查询对应的数据
List<FluxTable> list = queryInfluxAll();
List<InfluxResult> results = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).getRecords().size(); j++) {
InfluxResult influxResult = new InfluxResult();
influxResult.setCurrent(list.get(i).getRecords().get(j).getValues().get("current").toString());
influxResult.setEnergyUsed(list.get(i).getRecords().get(j).getValues().get("energyUsed").toString());
influxResult.setPower(list.get(i).getRecords().get(j).getValues().get("power").toString());
influxResult.setVoltage(list.get(i).getRecords().get(j).getValues().get("voltage").toString());
influxResult.setTime(list.get(i).getRecords().get(j).getValues().get("_time").toString());
System.err.println(list.get(i).getRecords().get(j).getValues().toString());
results.add(influxResult);
}
}
return results;
}
/**
* 查询一小时内的InsertParams所有数据
* @return
*/
private List<FluxTable> queryInfluxAll(){
String query = " from(bucket: \"chggx\")" +
" |> range(start: -60m, stop: now())" +
" |> filter(fn: (r) => r[\"_measurement\"] == \"influx_test\")" +
" |> pivot( rowKey:[\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\" )";
return influxBean.queryTable(query);
}
/**
* 根据某一个字段的值过滤(查询 用电量 energyUsed 为 322 的那条记录)
* @return
*/
public List<FluxTable> queryFilterByEnergyUsed(){
String query = " from(bucket: \"chggx\")" +
" |> range(start: -60m, stop: now())" +
" |> filter(fn: (r) => r[\"_measurement\"] == \"influx_test\")" +
" |> filter(fn: (r) => r[\"energyUsed\"] == \"322\")" +
" |> pivot( rowKey:[\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\" )";
return influxBean.queryTable(query);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 7. 接口
@RestController
public class InfluxDbController {
@Autowired
private InfluxService influxService;
/**
* 时许数据库插入测试
* @return
*/
@PostMapping("/inlfuxdb/insert")
public ResponseData insert(@RequestBody InsertParams insertParams) {
influxService.insert(insertParams);
return new SuccessResponseData();
}
@PostMapping("/inlfuxdb/queue")
public ResponseData queue(@RequestBody InsertParams insertParams) {
return new SuccessResponseData(influxService.queue());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 8. 使用 aplfox 测试
# 1. 新增
# 2. 查询
# 4. Influxdb文档
2.3 官网:https://docs.influxdata.com/influxdb/v2.3/