时序数据库:Influxdb详解

文章目录

  • 一、简介
    • 1、简介
    • 2、官网
  • 二、部署
    • 1、安装
    • 2、配置
      • (1)用户初始化
  • 三、入门(Web UI)
    • 1、加载数据
      • (1)上传数据文件
      • (2)代码接入模板
    • 2、管理存储桶
      • (1)创建桶
      • (2)修改桶
    • 3、演示:测试录入数据
    • 4、Telegraf集成
    • 5、管理抓取任务
    • 6、管理 API Token
    • 7、使用Data Explorer
      • (1)查询构造器
      • (2)FLUX 脚本编辑器
      • (3)数据预览区
      • (4)数据导出为CSV
    • 8、使用Notebook
  • 四、Flux语法
  • 五、HTTP API
  • 六、Java操作Influxdb
    • 1、导包
    • 2、POJO
    • 3、同步写入
    • 4、异步写入
    • 5、查询

一、简介

1、简介

关系型数据库也是支持时间戳的,也能够基于时间戳进行查询。但是,从我们的使用场景出发,需要注意数据库的写入性能。通常,关系型数据库会采用 B+树数据结构,在数据写入时,有可能会触发叶裂变,从而产生了对磁盘的随机读写,降低写入速度。

当前市面上的时序数据库通常都是采用 LSM Tree 的变种,顺序写磁盘来增强数据的写入能力。通常时序数据库都会保证在单点每秒数十万的写入能力

时序数据库一般用于指标监控场景。这个场景的数据有一个非常明显的特点就是冷热差别明显。通常,指标监控只会使用近期一段时间的数据。

2、官网

官网:https://www.influxdata.com/

二、部署

1、安装

wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.4.0-linux-amd64.tar.gz
# 解压
tar -zxvf influxdb2-2.4.0-linux-amd64.tar.gz# 启动
./influxd

2、配置

(1)用户初始化

1、访问http://192.168.56.10:8086/
在这里插入图片描述
2、点击GET STARTED后,需要填写用户名、密码、组织和初始化的数据库(Bucket)
admin/admin123
在这里插入图片描述
下一步之后,点击CONFIGURE LATER

在这里插入图片描述

3、进入到初始化页面
在这里插入图片描述

三、入门(Web UI)

1、加载数据

(1)上传数据文件

在这里插入图片描述
在 Web UI 上,你可以用文件的方式上传数据,前提是文件中的数据符合 InfluxDB 支持的类型,包括 CSV、带 Flux 注释的 CSV 和 InfluxDB 行协议。
在这里插入图片描述
点开一个文件上传的页面,会有对应的示例:
在这里插入图片描述

(2)代码接入模板

在这里插入图片描述
在这里提供了一些代码相关的Demo,非常方便:

在这里插入图片描述

2、管理存储桶

可以将 InfluxDB 中的 bucket 理解为普通关系型数据库中的 database。

在这里插入图片描述

(1)创建桶

创建桶,可以选择自动删除超过多长时间的数据。
在这里插入图片描述

(2)修改桶

可以直接修改桶的数据过期时间。
修改桶的名称是敏感行为,谨慎操作!
在这里插入图片描述

3、演示:测试录入数据

在这里插入图片描述
在这里插入图片描述

4、Telegraf集成

Telegraf 是 InfluxDB 生态中的一个数据采集组件,它可以将各种时序数据自动采集到InfluxDB。现在,Telegraf 不仅仅是 InfluxDB 的数据采集组件了,很多时序数据库都支持与 Telegraf 进行协作,不少类似的时序数据收集组件选择在 Telegraf 的基础上二次开发。

这里先略过了。
在这里插入图片描述

5、管理抓取任务

抓取任务就是你给定一个 URL,InfluxDB 每隔一段时间去访问这个链接,把访问到的数据入库。

目标 URL 暴露出来的数据格式必须得是 Prometheus 数据格式

在这里插入图片描述
在这里插入图片描述
此处略了。

6、管理 API Token

token用于API的使用。
在这里插入图片描述

7、使用Data Explorer

在这里插入图片描述

(1)查询构造器

在这里插入图片描述

(2)FLUX 脚本编辑器

可以手动将查询构造器切换为 FLUX 脚本编辑器
在这里插入图片描述

(3)数据预览区

数据预览区可以将你的数据展示出来。下图是一个效果图。
在这里插入图片描述
在这里插入图片描述

(4)数据导出为CSV

在这里插入图片描述

8、使用Notebook

在这里插入图片描述
在这里插入图片描述

四、Flux语法

暂略。

五、HTTP API

使用API时,需要在Header头携带Authorization,value值为Token空格 + 你的token
在这里插入图片描述

# 查询目前所有的 Token 信息,包括他们拥有什么权限
http://192.168.56.10:8086/api/v2/authorizations

官方文档:https://docs.influxdata.com/influxdb/v2/api/

六、Java操作Influxdb

客户端参考:https://github.com/influxdata/influxdb-client-java

1、导包

<dependency><groupId>com.influxdb</groupId><artifactId>influxdb-client-java</artifactId><version>6.5.0</version>
</dependency>

2、POJO


import com.influxdb.annotations.Column;
import com.influxdb.annotations.Measurement;import java.time.Instant;/*** @description: 这是一个POJO类,对应将POJO类写入InfluxDB*/
@Measurement(name="temperature")
public class DemoPOJO {/** 注意类上的@Measurement注解,我们既可以使用Measurement注解来指定一个POJO类的测量名称* 但是使用@Measurement注解会将测量名称直接写死在代码里* 当测量名称会在运行时发生改变时,我们可以使用@Column(menasurement=true)注解* 这样会将POJO类中被注解的值作为测量名称。* **///@Column(measurement = true)//String measurementName;/** 相当于InfluxDB行协议中的标签集,此处标签的名称将会是location **/@Column(tag = true)String location;/** 相当于InfluxDB行协议中的字段集,此处字段的名称将会是value **/@ColumnDouble value;/** 相当于InfluxDB行协议中的时间戳 **/@Column(timestamp = true)Instant timestamp;/** 全参构造器,方便调用者创建对象 **/public DemoPOJO(String location, Double value, Instant timestamp) {this.location = location;this.value = value;this.timestamp = timestamp;}
}

3、同步写入

import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.WriteApiBlocking;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.internal.AbstractWriteClient;
import com.influxdb.client.internal.MeasurementMapper;
import com.influxdb.client.write.Point;import java.time.Instant;/*** @author: tony* @description: 这里是使用同步方式向InfluxDB写入数据的示例代码**/
public class Write1 {/** token 操作时需要换成自己的 **/private static char[] token = "token....".toCharArray();/** 组织名称 **/private static String org = "cxf";/** InfluxDB服务提供的url **/private static String url = "http://localhost:8086/";/** 存储桶名称 **/private static String bucket = "example_java";public static void main(String[] args) {InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token, org, bucket);WriteApiBlocking writeApiBlocking = influxDBClient.getWriteApiBlocking();// 0. 使用InflxuDB行协议写入
//        writeApiBlocking.writeRecord(WritePrecision.MS,"temperature,location=north value=50");// 1. 使用Point写入
//        Point point = Point.measurement("temperature")
//                .addTag("location", "west")
//                .addField("value", 38.0)
//                .time(Instant.now(),WritePrecision.NS)
//                ;
//        writeApiBlocking.writePoint(point);// 2. 使用POJO类写入DemoPOJO demoPOJO = new DemoPOJO("east", 22.2, Instant.now());writeApiBlocking.writeMeasurement(WritePrecision.MS,demoPOJO);// 3. 调用close方法会关闭并释放一些比如守护线程之类的对象。influxDBClient.close();}
}

4、异步写入

import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.WriteApi;
import com.influxdb.client.WriteOptions;
import com.influxdb.client.domain.WritePrecision;/*** @description: 通过异步的方式向InfluxDB写入数据*/
public class AsyncWrite {/** token 操作时需要换成自己的 **/private static char[] token = "token....".toCharArray();/** 组织名称 **/private static String org = "cxf";/** InfluxDB服务提供的url **/private static String url = "http://localhost:8086/";/** 存储桶名称 **/private static String bucket = "example_java";public static void main(String[] args) {// 0.创建InfluxDB的客户端InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token, org, bucket);// 1.异步写入会创建一个守护线程,所以在makWriteApi时可以传递一些配置项,也就是WriteOptions对象WriteOptions options = WriteOptions.builder().batchSize(999).flushInterval(10000).build();// 2.使用makeWriteApi创建的WriteApi writeApi = influxDBClient.makeWriteApi(options);for (int i = 0; i < 999; i++) {writeApi.writeRecord(WritePrecision.MS,"temperature,location=south value=77");}// 3.关闭连接,此方法会触发一次刷写,将缓冲区中剩下的数据向InfluxDB写入一次。influxDBClient.close();}
}

5、查询

import com.influxdb.client.BucketsApi;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.QueryApi;
import com.influxdb.client.domain.File;
import com.influxdb.query.FluxColumn;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;import java.util.List;
import java.util.Map;/*** @description: 这是关于从InfluxDB查询数据的代码*/
public class Query {/** token 操作时需要换成自己的 **/private static char[] token = "token....".toCharArray();/** 组织名称 **/private static String org = "cxf";/** InfluxDB服务提供的url **/private static String url = "http://localhost:8086/";public static void main(String[] args) {// 0.创建InfluxDB客户端对象InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url, token, org);// 1.获取查询API对象QueryApi queryApi = influxDBClient.getQueryApi();// 2.这个flux脚本会查询test_init存储桶中的go_goroutines测量,这个测量下只有一个序列String flux = "from(bucket: \"test_init\")\n" +"  |> range(start: -1h)\n" +"  |> filter(fn: (r) => r[\"_measurement\"] == \"go_goroutines\")\n" +"  |> aggregateWindow(every: 10s, fn: mean, createEmpty: false)\n" +"  |> yield(name: \"mean\")";// 3.这个flux脚本会查询example02存储桶中的cpu测量,指定字段名称为usage_user后,String flux2 = "from(bucket: \"example02\")\n" +"  |> range(start: -1h)\n" +"  |> filter(fn: (r) => r[\"_measurement\"] == \"cpu\")\n" +"  |> filter(fn: (r) => r[\"_field\"] == \"usage_user\")\n" +"  |> aggregateWindow(every: 10s, fn: mean, createEmpty: false)\n" +"  |> yield(name: \"mean\")";// 4.使用query方法将会得到一个List<FluxTable>对象,其中每一个FluxTable都对应着一个序列List<FluxTable> query = queryApi.query(flux);// 5.下面这个for循环会把遍历每个序列,并将这个序列中对应的每一行数据打印出来。for (FluxTable fluxTable : query) {List<FluxRecord> records = fluxTable.getRecords();for (FluxRecord record : records) {Map<String, Object> one = record.getValues();System.out.println(one);}}// 6.下面的queryRaw方法将会得到一个字符串,字符串中是FLUX拓展的CSV格式的数据String data = queryApi.queryRaw(flux2);System.out.println(data);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14092.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 适配 api 35(android 15) 遇到的问题

首先升级 targetSdkVersion 和 compileSdkVersion 到 35&#xff0c;升级后发生的报错 一、 解决方案: 升级 gradle 和 gradle 插件版本 com.android.tools.build:gradle -> 8.3.0-alpha02 gradle-wrapper.properties : distributionUrl -> gradle-8.6-bin.zip htt…

【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题

Linux to go制作流程 0.写在前面 关于教程Why Linux to go&#xff1f;实际效果 1.准备工具2.制作步骤 下载系统镜像硬盘分区准备启动U盘安装系统重启完成驱动安装将系统启动引导程序迁移到移动硬盘上 3.可能出现的问题 3.1.U盘引导系统安装时出现崩溃3.2.不影响硬盘里本身已有…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 **一、**自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突&#xff0c;从而造成phpstudy中的数据库无法启动&#xff0c;这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#…

Class加载流程和运行时区域

目录 jvm是什么.class加载过程干预.class.class文件内容1 加载2-1 连接&#xff1a;验证&#xff08;class字节流的校验&#xff09;2-2 连接&#xff1a;准备&#xff08;分配内存&#xff0c;初始化默认值&#xff09;2-3 连接&#xff1a;解析3 class 初始化什么时候需要对类…

ESP32开发学习记录---》GPIO

she 2025年2月5日&#xff0c;新年后决定开始充电提升自己&#xff0c;故作此记,以前没有使用过IDF开发ESP32因此新年学习一下ESP32。 ESPIDF开发环境配置网上已经有很多的资料了&#xff0c;我就不再赘述&#xff0c;我这里只是对我的学习经历的一些记录。 首先学习一个…

pycharm集成通义灵码应用

在pycharm中安装通义灵码 1、打开files-settings 2、选中plugins-搜索”TONGYI Lingma“&#xff0c;点击安装 3.安装完成后在pycharm的右侧就有通义灵码的标签 4、登录账号 5、查看代码区域代码&#xff0c;每一个方法前面都多了通义灵码的标识&#xff0c;可以直接选择…

Git--使用教程

Git的框架讲解 Git 是一个分布式版本控制系统&#xff0c;其架构设计旨在高效地管理代码版本&#xff0c;支持分布式协作&#xff0c;并确保数据的完整性和安全性。 Git 的核心组件&#xff1a; 工作区&#xff08;Working Directory&#xff09;&#xff1a; 工作区是你在本…

力扣.270. 最接近的二叉搜索树值(中序遍历思想)

文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案&#xff0c;并且要返回最小的那一个&#xff0c;为了解决这个问题&#xff0c;我门则要利用上二叉搜索树中序遍历为有序序列的特性&#xff0c;具体到代码中&a…

7个国内能打开的AI绘画网站!新手福音!

以下是我收集的国内能打开的AI绘画网站。 1、6pen 网址&#xff1a;https://6pen.art/ 2、文心大模型 网址&#xff1a;https://wenxin.baidu.com/moduleApi/ernieVilg 3、Draft 网址&#xff1a;https://draft.art/ai- art/drawing 4、nightcafe 网址&#xff1a;https:/…

Redis数据库篇 -- Pipeline

一. 什么是Pipeline 在传统的请求-响应模式中&#xff0c;客户端与服务器之间的通信流程如下&#xff1a; 客户端发送一个命令到服务器。服务器接收命令并执行。服务器将执行结果返回给客户端。客户端接收结果后&#xff0c;发送下一个命令 在这种传统的模式下&#xff0c;…

Baumer工业相机堡盟相机的相机传感器芯片清洁指南

Baumer工业相机堡盟相机的相机传感器芯片清洁指南 Baumer工业相机1.Baumer工业相机传感器芯片清洁工具和清洁剂2.Baumer工业相机传感器芯片清洁步骤2.1、准备步骤2.2、清洁过程1.定位清洁工具2.清洁传感器3&#xff0e;使用吹风装置 Baumer工业相机传感器芯片清洁的优势设计与结…

【OS】AUTOSAR架构下的Interrupt详解(下篇)

目录 3.代码分析 3.1中断配置代码 3.2 OS如何找到中断处理函数 3.3 Os_InitialEnableInterruptSources实现 3.4 Os_EnableInterruptSource 3.5 DisableAllInterrupts 3.5.1Os_IntSuspendCat1 3.5.2 Os_InterruptDisableAllEnter 3.5.3 Disable二类中断 3.5.4 Disable一…

ASP.NET Core中间件Markdown转换器

目录 需求 文本编码检测 Markdown→HTML 注意 实现 需求 Markdown是一种文本格式&#xff1b;不被浏览器支持&#xff1b;编写一个在服务器端把Markdown转换为HTML的中间件。我们开发的中间件是构建在ASP.NET Core内置的StaticFiles中间件之上&#xff0c;并且在它之前运…

idea 找不到或者无法加载主类

idea项目&#xff0c;之前一直是正常运行的&#xff0c;放假了之后再回来就遇到启动不了的问题。 WebApplication这个类右键运行的时候&#xff0c;也提示找不到主类。 对于这种之前运行没有问题&#xff0c;突然出问题的项目。 我的点是没有改动代码和数据的情况下项目就跑不起…

DeepSeek R1 Distill Llama 70B(免费版)API使用详解

DeepSeek R1 Distill Llama 70B&#xff08;免费版&#xff09;API使用详解 在人工智能领域&#xff0c;随着技术的不断进步&#xff0c;各种新的模型和应用如雨后春笋般涌现。今天&#xff0c;我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…

基于SpringBoot养老院平台系统功能实现六

一、前言介绍&#xff1a; 1.1 项目摘要 随着全球人口老龄化的不断加剧&#xff0c;养老服务需求日益增长。特别是在中国&#xff0c;随着经济的快速发展和人民生活水平的提高&#xff0c;老年人口数量不断增加&#xff0c;对养老服务的质量和效率提出了更高的要求。传统的养…

新能源产业的质量革命:六西格玛培训如何重塑制造竞争力

在新能源行业狂飙突进的今天&#xff0c;企业若想在全球供应链中占据高地&#xff0c;仅靠技术突破已远远不够。制造效率的毫厘之差&#xff0c;可能成为市场话语权的千里之距。某光伏巨头曾因电池片良率低于行业均值1.5%&#xff0c;导致年损失超2.3亿元——这恰恰印证了六西格…

额外题目汇总2-链表

链表 1.24. 两两交换链表中的节点 力扣题目链接(opens new window) 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 思路 使用虚拟头结点会很方便&#xff…

pytest-xdist 进行多进程并发测试!

在软件开发过程中&#xff0c;测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加&#xff0c;测试用例的执行效率变得尤为重要。为了加速测试过程&#xff0c;特别是对于一些可以并行执行的测试用 例&#xff0c;pytest-xdist 提供了一种强大的工具&…

化学-基础知识一

文章目录 1、物质分类2、离子反应3、氧化还原反应4、物质的量5、电子排布式6、元素周期表 化学基础知识&#xff0c;物质分类、离子反应、氧化还原反应、物质的量、电子排布式、元素周期表 1、物质分类 物质广泛分为混合物和纯净物&#xff0c;纯净物是主要研究对象&#xff1b…