InfluxDB2 入门

InfluxDB 介绍

定义

InfluxDB‌ 是一个开源的、高性能的时序型数据库,专门用于收集、存储、处理和可视化时间序列数据。它被设计用于高效地存储和检索时间序列数据,广泛应用于监控系统、传感器数据收集、实时分析等多种应用场景

概念

InfluxDB 中,有以下几个关键概念:【以下解释概念以电脑内存监控举例】

  • Measurement :数据的名称,表示存储的数据类型,类似于关系数据库中的表,每个 measurement 存储特定类型的数据。可以存储像cpu、memery等类型数据。
  • Tag : 键值对,用于存储元数据,支持高效查询。可以存储像memery1、memery2类型数据。
  • Fields : Fields 存储实际的数据值,可以是数字、字符串或布尔值。与 tags 不同,fields 不可索引。如:cpu的温度、cpu的占用率等数据。
  • Timestamp :每个数据点都有一个时间戳,表示记录的具体时间。通常以 Unix 时间戳格式存储,精确到纳秒,例如 1633046400

数据示例

在这里插入图片描述
上述记录为:内存点1在 1727145044242 时的内存使用大小和空闲大小。

Docker 安装 InfluxDB2

下载镜像

  • docker search influxdb 查询可用镜像
    在这里插入图片描述
  • docker pull influxdb:laster 下载最新版镜像
  • docker images 查看镜像
    在这里插入图片描述
  • docker run 运行镜像
docker run -d --name influxdb -p 8086:8086 influxdb

# -d  以守护进程模式运行容器
# --name influxdb  指定influxdb的镜像名称
# -p 8086:8086  指定端口映射
# influxdb   指定以哪一个镜像创建容器
  • docker ps 查询容器是否启动

下图表述influxdb容器正常启动
在这里插入图片描述

  • docker exec 进入容器
docker exec -it influxdb bash

# -i:表示以交互模式运行,让你可以与容器中的进程进行交互。
# -t:分配一个伪终端,允许你进行命令行操作并获得输出。
# influxdb  容器名称,与创建容器时的名称一致

InfluxDB Web UI的使用

InfluxDB2版本中,取消了类似于SQL的语句,使用的是Flux,且使用InfluxDB CLI较为麻烦,不如Web UI

Web UI 基本配置

完成安装后,在浏览器打开 IP:8086 后,进入Web UI配置界面
在这里插入图片描述
在这里插入图片描述

注册完成后,会生成Token,只会展示一次,注意保存下来。

页面介绍

首页
在这里插入图片描述

数据上传页面
在这里插入图片描述

数据查询页面
在这里插入图片描述

基本使用

数据导入
  • CSV导入
  1. 下载官方示例数据文件:https://influx-testdata.s3.amazonaws.com/air-sensor-data-annotated.csv
  2. 导入在这里插入图片描述
  • 脚本写入
    在这里插入图片描述

再写入数据时,不指定时间,会取当前时间

memery,site=memery1 use=23.5,free=66.5
memery,site=memery1 use=23.4,free=66.6
memery,site=memery1 use=23.3,free=66.7
memery,site=memery1 use=23.2,free=66.8
memery,site=memery1 use=23.1,free=66.9
memery,site=memery1 use=23.0,free=67.0
memery,site=memery2 use=23.5,free=66.5
memery,site=memery2 use=23.4,free=66.6
memery,site=memery2 use=23.3,free=66.7
memery,site=memery2 use=23.2,free=66.8
memery,site=memery2 use=23.1,free=66.9
memery,site=memery2 use=23.0,free=67.0
数据查询

该页面在左侧菜单栏第三个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 查询数据时,若没有measurement,尝试修改查询时间
  2. 点击右面的 SCRIPT EDITOR 可以将左下角的查询条件,转为FLUX查询语句,方便后续整合客户端。

SpringBoot 集成 InfluxDB2

  • 创建 SpringBoot 项目,引入Maven依赖
	<dependency>
	  <groupId>com.influxdb</groupId>
	  <artifactId>influxdb-client-java</artifactId>
	  <version>6.6.0</version>
	</dependency>
  • 数据插入
    void testAddInfluxDB() {
        // token 可以是创建是生成的token,也能够使用web ui重新生成token
        String token = "Yp9PiF5dpJIKL5f1c7zhx-1Ju7-4B4aXYTPbPRJNUzUFKwObuG69nI5Xsrp6wrFanrKkDSNBTyMTqx0BKVz9wA==";
        // bucket名称
        String bucket = "test";
        // 组织名称
        String org = "admin";

        // 创建链接
        InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8086", token.toCharArray());
        WriteApiBlocking writeApi = client.getWriteApiBlocking();

        /**
         * 数据写入
         * 1. 按照数据格式,直接拼接字符串写入
         * 2. 使用Point对象写入
         * 3. 使用注解方式写入
         */
        // 方式一
        String data = "memery,site=memery1 use=23.0,free=67.0";
        writeApi.writeRecord(bucket, org, WritePrecision.NS, data);

        // 方式二
        Point point = Point
                .measurement("memery")
                .addTag("site", "memery2")
                .addField("use", 23.43)
                .addField("free", 45.43)
                .time(Instant.now(), WritePrecision.NS);
        writeApi.writePoint(bucket, org, point);

        // 方式三 创建对象,使用注解写入
        // 官方有示例

        client.close();
    }
  • 数据查询
   void testQueryInfluxDB() {
        // token 可以是创建是生成的token,也能够使用web ui重新生成token
        String token = "Yp9PiF5dpJIKL5f1c7zhx-1Ju7-4B4aXYTPbPRJNUzUFKwObuG69nI5Xsrp6wrFanrKkDSNBTyMTqx0BKVz9wA==";
        // 组织名称
        String org = "admin";

        // 创建链接
        InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8086", token.toCharArray());

        // 查询语句,根据Web UI生成的查询条件,转为Flux语句,稍加修改可以直接使用
        String query = "from(bucket: \"test\")\n" +
                // 查询时间段,需要修改为需要查询的时间段
                "  |> range(start: -3h)\n" +
                "  |> filter(fn: (r) => r[\"_measurement\"] == \"memery\")\n" +
                "  |> filter(fn: (r) => r[\"site\"] == \"memery1\")\n" +
                "  |> filter(fn: (r) => r[\"_field\"] == \"free\")\n" +
                /**
                 * every: 1h: 表示时间窗口的长度为 1 小时。数据将被分成每小时一个窗口。
                 * fn: mean: 指定了聚合函数。在这里,mean 表示计算每个时间窗口内的平均值。
                 * createEmpty: 控制是否在没有数据的时间窗口内创建空结果。
                 */
                // 该字段需要根据需要修改
                "  |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)\n" +
                "  |> yield(name: \"mean\")";

        List<FluxTable> tables = client.getQueryApi().query(query, org);

        for (FluxTable table : tables) {
            for (FluxRecord record : table.getRecords()) {
                System.out.println(record);
            }
        }

        client.close();
    }

上述示例在 Web UI 中均有介绍。

从 Web UI 中复制的FLUX语句需要修改的地方

  • range() :用于根据时间过滤数据,定义查询数据的时间范围
	# 语法
	range(start: <start_time>, stop: <end_time>)
	
	# start: 查询的开始时间,可以是绝对时间(例如 2023-01-01T00:00:00Z)或相对时间(例如 -1h 表示过去一小时)。
	# stop: 查询的结束时间,格式与 start 相同。如果省略,则默认到当前时间。
	
	
	示例1:
	查询过去一小时数据
	range(start: -1h)
	# s: 秒(seconds)
	# m: 分钟(minutes)
	# h: 小时(hours)
	# d: 天(days)
	# w: 周(weeks)
	# mo: 月(months)
	# y: 年(years)
	
	示例2:
	查询指定时间的数据
	range(start: 2024-01-01T00:00:00Z, stop: 2024-01-31T23:59:59Z)
  • aggregateWindow() :指定的时间窗口内对数据进行汇总操作,比如计算平均值、总和、最大值等。
	# 语法
	aggregateWindow(every: <duration>, fn: <function>, createEmpty: <boolean>)
	
	# every: 指定窗口的时间间隔(例如 1m 表示每分钟)。
	# fn: 聚合函数,如 mean、sum、max、min 等。
	# createEmpty: 可选参数,布尔值,决定是否在没有数据的时间窗口中创建空结果,默认为 false。
	
	示例1:
	计算每小时的平均值:
	aggregateWindow(every: 1h, fn: mean)
	
	示例2:
	计算每5分钟的总和,并在没有数据的窗口中创建空结果:
	aggregateWindow(every: 5m, fn: sum, createEmpty: true)
	
	示例3:
	计算每10分钟的最大值:
	aggregateWindow(every: 10m, fn: max)

方便数据拼接的查询函数

  • pivot() : 主要用于将行数据转换为列数据。通过使用 pivot,用户可以将某个字段的值转化为列标题
	# 语法
	pivot(rowKey: [<column>], columnKey: [<column>], valueColumn: <column>)
	
	# rowKey: 指定用作行索引的列,可以是一个或多个列的组合。
	# columnKey: 指定用作列标题的列,通常是需要转换为列名的字段。
	# valueColumn: 指定包含要填充到新表格中的值的列。
Logo

尧米是由西云算力与CSDN联合运营的AI算力和模型开源社区品牌,为基于DaModel智算平台的AI应用企业和泛AI开发者提供技术交流与成果转化平台。

更多推荐