InfluxDB 与 HTTP 协议交互进阶(一)

引言

在当今数字化时代,数据处理的高效性和准确性成为了众多领域关注的焦点。InfluxDB 作为一款开源的时序数据库,凭借其高性能、易扩展等特性,在时间序列数据处理中占据了重要地位。而 HTTP 协议作为互联网应用层的核心协议之一,以其简单、灵活的特点,为 InfluxDB 与外部系统的交互提供了便利的通道。

通过 HTTP 协议与 InfluxDB 进行交互,我们能够轻松地实现数据的写入、查询、管理等操作 ,这在物联网、监控系统、金融数据分析等诸多场景中都有着广泛的应用。例如,在物联网场景下,大量传感器产生的实时数据可以通过 HTTP 协议快速写入 InfluxDB 进行存储和分析;在监控系统中,通过 HTTP 协议从 InfluxDB 获取数据,能够实时展示系统的运行状态,及时发现潜在问题。

然而,仅仅掌握基础的交互方式往往难以满足复杂业务场景的需求。随着数据量的不断增长和业务逻辑的日益复杂,深入探究 InfluxDB 与 HTTP 协议交互的进阶技巧显得尤为重要。本文将带你深入探索这一领域,从优化数据写入效率到复杂查询的构建,再到安全与性能的保障,全方位提升你在这方面的能力,助力你在数据处理的道路上更进一步。

InfluxDB 与 HTTP 协议交互基础回顾

InfluxDB 简介

InfluxDB 是一款由 InfluxData 公司开发的开源时序数据库,采用 Go 语言编写 。它专为处理时间序列数据而设计,在数据的存储、查询和分析方面具有显著优势。

InfluxDB 具备高性能的读写能力,其独特的 TSM(Time-Structured Merge Tree)存储引擎,能够实现高效的数据写入和查询,在处理大规模时间序列数据时表现出色。例如,在物联网场景下,面对海量传感器产生的高频数据,InfluxDB 能够快速地将这些数据写入数据库,并在需要时迅速查询出所需数据。同时,它还支持水平扩展,用户可以通过增加节点轻松应对不断增长的数据量,保障系统的高可用性。

此外,InfluxDB 提供了丰富的查询语言,支持多种强大的查询操作,如聚合、过滤、时间窗口等,方便用户对数据进行深入分析。它还允许对 tag 建立索引,实现快速有效的数据查询,这在需要根据特定标签筛选数据时非常实用。而且,InfluxDB 支持多种数据采集协议,包括 HTTP、UDP 等,还能与其他数据采集组件良好通讯,并且可以与 Grafana、Prometheus 等数据可视化工具和监控系统集成,为用户创建监控仪表盘和分析数据提供便利。

由于这些特性,InfluxDB 在多个领域有着广泛的应用。在物联网领域,它可以存储和分析各类传感器产生的时间序列数据,助力实现设备状态的实时监控和智能控制;在运维监控方面,能够有效地处理服务器、网络设备等产生的监控数据,帮助运维人员及时发现并解决潜在问题,保障系统的稳定运行;在金融领域,可用于存储和分析交易数据、市场行情数据等,为风险评估、交易策略制定等提供数据支持。

HTTP API 基础接口回顾

InfluxDB 提供了 HTTP API,允许用户通过发送 HTTP 请求来与 InfluxDB 进行交互,这使得与外部系统的集成变得轻松便捷。以下是几个常用接口的回顾:

  • Ping 接口:该接口主要用于检查 InfluxDB 的状态或版本信息。使用 GET 或 HEAD 请求方式,URL 为http://<influxdb-host>:8086/ping。例如,当我们想要确认 InfluxDB 服务是否正常运行时,可以向该 URL 发送 GET 请求,如果服务正常,将返回表示服务状态的响应,这有助于我们快速判断数据库服务的可用性,方便在系统集成或日常运维中进行健康检查。
  • Query 接口:用于查询数据、管理数据库、保留策略(Retention Policy,RP)、用户等操作。支持 GET 和 POST 请求方式,URL 为http://<influxdb-host>:8086/query 。其中,参数db指定数据库名,这是必选参数,明确了操作所针对的数据库;q为查询语句,同样是必选参数,且需要使用 URL 编码 。例如,使用curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'",这条命令中,通过 GET 请求向query接口发送查询,指定了数据库为mydb,查询语句是从cpu_load_short测量中筛选出region为us-west的value字段数据。此外,还有其他可选参数,如rp可指定查询的保留策略,u和p分别用于指定用户名和密码进行认证(当 InfluxDB 开启认证时),precision用于指定时间戳的精度。
  • Write 接口:负责向数据库中写入数据,请求方式为 POST,URL 是http://<influxdb-host>:8086/write。参数db指定要写入的数据库名,这是必选的;precision指定时间戳的精度,可选,默认是纳秒。要写入的数据格式可以是行协议(Line Protocol)或 JSON 格式 ,当使用 JSON 格式时,需要设置Content-Type: application/json。例如,通过行协议写入数据,数据格式可能类似cpu_usage,server_id=server001 value=0.75 1620000000000000000,将这样的数据作为 POST 请求的 body 发送到write接口,就能将数据写入到指定数据库中。

这些基础接口是与 InfluxDB 进行交互的基石,通过它们,我们能够完成对 InfluxDB 中数据的基本操作,为后续更复杂的业务逻辑和数据处理奠定基础。

InfluxDB 与 HTTP 协议交互进阶操作

复杂数据查询技巧

在实际应用中,我们常常需要进行复杂的数据查询,以满足各种业务需求。下面介绍几种常见的复杂查询技巧:

  • 多条件组合查询:通过WHERE子句组合多个条件进行数据筛选。例如,从temperature测量中筛选出city为Beijing且humidity大于 60 的数据,查询语句如下:
 

SELECT * FROM "temperature" WHERE "city" = 'Beijing' AND "humidity" > 60

在这个查询中,AND连接了两个条件,只有同时满足city为Beijing和humidity大于 60 的数据才会被返回。如果要表示多个条件中的任意一个满足即可,可以使用OR关键字 。比如,查询city为Beijing或者city为Shanghai的数据:

 

SELECT * FROM "temperature" WHERE "city" = 'Beijing' OR "city" = 'Shanghai'

  • 跨时间段查询:使用BETWEEN...AND或者直接比较时间戳来实现跨时间段的数据查询。假设我们要查询2024-01-01T00:00:00Z到2024-01-02T00:00:00Z之间的temperature测量数据,查询语句可以这样写:
 

SELECT * FROM "temperature" WHERE time BETWEEN '2024-01-01T00:00:00Z' AND '2024-01-02T00:00:00Z'

也可以使用比较运算符来实现同样的效果:

 

SELECT * FROM "temperature" WHERE time >= '2024-01-01T00:00:00Z' AND time < '2024-01-02T00:00:00Z'

在实际应用中,还可以结合函数来动态指定时间范围,比如使用now()函数获取当前时间,查询最近 1 小时的数据:

 

SELECT * FROM "temperature" WHERE time >= now() - 1h

  • 使用函数和聚合操作查询:InfluxDB 提供了丰富的函数用于数据处理和聚合。比如,使用SUM函数计算某个字段的总和,AVG函数计算平均值,COUNT函数统计数据点数量等。以计算temperature测量中value字段的平均值为例,查询语句如下:
 

SELECT AVG("value") FROM "temperature"

如果要按照city标签进行分组计算平均值,可以使用GROUP BY子句:

 

SELECT AVG("value") FROM "temperature" GROUP BY "city"

还可以使用FILL函数处理缺失数据,例如将缺失值填充为 0:

 

SELECT AVG("value") FROM "temperature" GROUP BY "city" FILL(0)

此外,还可以嵌套使用函数,实现更复杂的计算。比如,先计算每个city的value总和,再计算所有city总和的平均值:

 

SELECT AVG(subquery.sum_value) FROM (SELECT SUM("value") AS sum_value FROM "temperature" GROUP BY "city") AS subquery

高效数据写入策略

随着数据量的不断增加,优化数据写入策略对于提高 InfluxDB 的性能至关重要。以下是一些高效的数据写入策略:

  • 批量写入:将多个数据点组合成一个批次进行写入,可以显著减少网络传输次数和数据库操作次数,从而提高写入性能。InfluxDB 的 HTTP API 支持批量写入,只需要将多个数据点按照行协议或 JSON 格式组织好,作为一次 POST 请求发送到write接口即可。在使用行协议进行批量写入时,不同的数据点之间用换行符分隔 。例如:
 

cpu_usage,server_id=server001 value=0.75 1620000000000000000

cpu_usage,server_id=server002 value=0.8 1620000001000000000

使用 JSON 格式批量写入时,数据格式如下:

 

[

{

"measurement": "cpu_usage",

"tags": {

"server_id": "server001"

},

"fields": {

"value": 0.75

},

"time": "2021-05-03T12:00:00Z"

},

{

"measurement": "cpu_usage",

"tags": {

"server_id": "server002"

},

"fields": {

"value": 0.8

},

"time": "2021-05-03T12:00:01Z"

}

]

在实际应用中,可以根据数据生成的频率和网络状况,合理调整批量写入的数据点数量。一般来说,批量大小在几百到几千个数据点之间比较合适,太大可能导致单次写入失败时需要重新写入的数据量过多,太小则无法充分发挥批量写入的优势。

  • 优化数据格式
    • 行协议和 JSON 格式选择:行协议是 InfluxDB 默认的数据写入格式,它简洁高效,占用空间小,适合在网络带宽有限或对性能要求极高的场景下使用 。JSON 格式则更易于阅读和编写,适合在开发调试阶段或与其他系统交互时使用。例如,在物联网设备数据采集场景中,由于设备资源有限,且需要频繁发送大量数据,使用行协议可以有效减少数据传输量和设备功耗;而在数据可视化工具与 InfluxDB 交互时,使用 JSON 格式可以更方便地处理和展示数据。
    • 优化行协议:在使用行协议写入数据时,应尽量避免不必要的空格和换行符,以减少数据传输量。同时,合理选择时间戳的精度,避免使用过高的精度导致数据量不必要的增加。例如,如果数据的时间精度只需要精确到秒,那么时间戳可以使用秒级别的时间戳,而不是默认的纳秒级别。
    • 优化 JSON 格式:对于 JSON 格式的数据,去除冗余字段,只保留必要的字段,可以减少数据大小。例如,如果某些标签字段在整个数据集中都是固定值,可以考虑在写入时不包含这些字段,而是在查询时根据需要进行补充。
  • 设置合理时间戳精度:时间戳精度直接影响数据的存储大小和查询性能。如果数据的时间精度要求不高,使用较低的时间戳精度(如秒、分钟)可以减少数据存储量,提高写入和查询效率。例如,对于一些监控数据,每 5 分钟采集一次,时间戳精度设置为分钟即可满足需求。在写入数据时,可以通过precision参数指定时间戳精度 。例如,使用秒级精度写入数据:
 

curl -XPOST 'http://localhost:8086/write?db=mydb&precision=s' --data-binary 'cpu_usage,server_id=server001 value=0.75 1620000000'

安全交互与认证机制

在与 InfluxDB 进行交互时,确保数据的安全性至关重要。InfluxDB 提供了多种安全认证机制,以下是常见的 Token 授权和登录授权方式:

  • Token 授权
    • 获取 Token:在 InfluxDB 2.0 及以上版本中,可以通过 InfluxDB 的 Web 界面或 API 创建和管理 Token。在 Web 界面中,登录后进入 “Data” -> “Tokens” 页面,可以创建新的 Token,并为其分配相应的权限,如读取特定桶(bucket)的数据、写入数据等。通过 API 创建 Token 的示例如下:
 

curl --request POST http://localhost:8086/api/v2/tokens \

--header 'Authorization: Token YOUR_API_TOKEN' \

--header 'Content-Type: application/json' \

--data-raw '{

"description": "My new token",

"orgID": "your_org_id",

"permissions": [

{

"action": "read",

"resource": {

"type": "buckets",

"id": "your_bucket_id"

}

}

]

}'

这里的YOUR_API_TOKEN是具有创建 Token 权限的管理员 Token,your_org_id和your_bucket_id分别是组织 ID 和桶 ID,通过设置permissions字段来指定新 Token 的权限。

  • 设置请求头携带 Token:在发送 HTTP 请求时,将 Token 添加到请求头的Authorization字段中,格式为Bearer <token>。例如,使用curl命令查询数据:
 

curl -G 'http://localhost:8086/query?pretty=true' \

--header 'Authorization: Bearer your_token' \

--data-urlencode "db=mydb" \

--data-urlencode "q=SELECT * FROM \"measurement\""

这样,InfluxDB 会根据 Token 来验证请求的合法性,并根据 Token 所拥有的权限来处理请求。

  • 登录授权
    • 原理:InfluxDB 支持用户名和密码的登录授权方式。在启用认证后,用户需要提供正确的用户名和密码才能访问 InfluxDB 的 API。用户名和密码存储在 InfluxDB 的用户表中,通过与用户表中的记录进行比对来验证用户身份。
    • 流程:首先,需要在 InfluxDB 中创建用户并设置密码。例如,使用 InfluxDB 的命令行工具创建一个具有所有权限的管理员用户:
 

CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES

然后,在配置文件中启用认证功能,一般是将influxdb.conf中的auth-enabled设置为true 。重启 InfluxDB 服务使配置生效。在发送 HTTP 请求时,可以通过以下几种方式提供用户名和密码:

  • 在 URL 中提供认证参数,例如:
 

curl -G 'http://localhost:8086/query?u=admin&p=password&pretty=true' \

--data-urlencode "db=mydb" \

--data-urlencode "q=SELECT * FROM \"measurement\""

  • 在请求体中提供认证参数,例如:
 

curl -G 'http://localhost:8086/query' \

--data-urlencode "u=admin" \

--data-urlencode "p=password" \

--data-urlencode "db=mydb" \

--data-urlencode "q=SELECT * FROM \"measurement\""

  • 使用命令行工具时,也可以通过环境变量提供用户名和密码,例如:
 

export INFLUX_USERNAME=admin

export INFLUX_PASSWORD=password

influx

通过这些安全交互与认证机制,可以有效地保护 InfluxDB 中的数据,防止未经授权的访问和操作。

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

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

相关文章

NAS远程访问新解法:OMV与cpolar的技术协同价值

文章目录前言1. OMV安装Cpolar2. 配置FTP公网地址3. OMV FTP 配置4. OMV FTP远程连接前言 当家庭存储需求突破本地边界时&#xff0c;传统NAS方案往往陷入"连接困境"&#xff1a;复杂的端口转发配置、高昂的公网IP成本、以及始终存在的安全顾虑…开源解决方案OMV虽然…

vue 渲染 | 不同类型的元素渲染的方式(vue组件/htmlelement/纯 html)

省流总结&#xff1a;&#xff08;具体实现见下方&#xff09; vue 组件 ——》<component :is组件名> htmlelement 元素 ——》 ref 、★ v-for ref 或是 ★ vue 的 nextTick 纯 html 结构——》v-html 另外&#xff0c;当数据异步加载时&#xff0c;vue3中如何渲…

Charles中文版深度解析,轻松调试API与优化网络请求

在现代软件开发过程中&#xff0c;调试API、捕获HTTP/HTTPS流量以及优化网络性能是开发者不可避免的挑战。特别是在处理复杂的网络请求和验证API接口的数据传输准确性时&#xff0c;开发者需要一款强大且易于使用的工具。Charles抓包工具凭借其功能强大、界面简洁、易于操作的特…

【CF】Codeforces Round 1039 (Div. 2) E1 (二分答案求中位数)

E1. Submedians (Easy Version)题目&#xff1a;思路&#xff1a;经典不过加了点东西对于求中位数&#xff0c;我们必然要想到二分答案&#xff0c;具体的&#xff0c;对于所有大于等于 x 的数我们令其奉献为 1&#xff0c;小于的为 -1&#xff0c;如果存在某段区间的奉献和大于…

ESP32-S3学习笔记<8>:LEDC的应用

ESP32-S3学习笔记&#xff1c;8&#xff1e;&#xff1a;LEDC的应用1. 头文件包含2. LEDC的配置2.1 配置定时器2.1.1 speed_mode/设置速度模式2.1.2 duty_resolution/设置占空比分辨率2.1.3 timer_num/选择定时器2.1.4 freq_hz/设定PWM频率2.1.5 clk_cfg/选择LEDC的外设时钟源2…

网络安全第14集

前言&#xff1a;小迪安全14集&#xff0c;这集重点内容&#xff1a;0、什么是js渗透测试&#xff1f;在javascript中也存在变量和函数&#xff0c;存在可控变量和函数就有可能存在在漏洞&#xff0c;js开发的web应用和php、java开发的区别是&#xff0c;js能看得到的源代码&am…

代码随想录算法训练营第三十三天

LeetCode.62 不同路径 题目链接 不同路径 题解 class Solution {public int uniquePaths(int m, int n) {// dp表示到达ij有多少条路径int[][] dp new int[110][110];dp[1][1] 1;for(int i 0;i<m;i){dp[i][0] 1;}for(int j 0;j<n;j){dp[0][j] 1;}for(int i 1;i…

银行回单OCR识别技术原理

银行回单OCR&#xff08;光学字符识别&#xff09;技术通过结合图像处理、模式识别和自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;将纸质或电子版银行回单中的非结构化文本&#xff08;如账号、金额、日期等&#xff09;转化为结构化数据。以下是其核心原理和关键…

Day22-二叉树的迭代遍历

昨天学习了递归遍历&#xff1a;递归就是一次次的把参数压入栈中&#xff0c;然后返回的时候还是上一次递归保存的参数。今天学习迭代遍历。迭代遍历就是用栈去模拟保存二叉树的节点&#xff0c;然后依次去遍历&#xff0c;只不过要注意栈的后入先出的规则。前序遍历&#xff1…

知识蒸馏 - 通过引入温度参数T调整 Softmax 的输出

知识蒸馏 - 通过引入温度参数T调整 Softmax 的输出 flyfish import torch import torch.nn.functional as F import matplotlib.pyplot as plt import numpy as np# 设置中文字体支持 plt.rcParams["font.family"] [AR PL UMing CN] # Linux plt.rcParams[axes.uni…

Java研学-RabbitMQ(三)

一 消息通信协议 1 AMQP AMQP 是一个开放的、跨语言、跨平台的消息协议标准&#xff0c;用于在分布式系统中传递业务消息。它定义了消息队列的二进制协议格式和交互模型&#xff08;如交换机、队列、绑定等&#xff09;&#xff0c;确保不同语言&#xff08;Java、Python、C#等…

http.client 教程-如何使用 Python 标准库发送 HTTP 请求

http.client 教程-如何使用 Python 标准库发送 HTTP 请求以下是 http.client 模块的详细使用教程&#xff0c;帮助你理解如何使用 Python 标准库发送 HTTP 请求&#xff1a;1. http.client 概述http.client 是 Python 内置的 HTTP 客户端库&#xff0c;提供了底层的 HTTP 协议实…

Android-三种持久化方式详解

持久化技术分为3种&#xff0c;文件&#xff0c;sharedPreferences存储&#xff0c;数据库来存储&#xff1b; 目录 文件存储&#xff1a; 利用SharedPreferences中读取数据 SQLite创建数据库 更新 添加 删除 查找&#xff1a; 文件存储&#xff1a; 文件存储是 Andr…

并发安全之锁机制一

锁机制一 锁机制是计算机系统中解决并发冲突的核心工具&#xff0c;其存在和应用场景源于一个根本问题&#xff1a;当多个执行单元&#xff08;线程、进程、分布式节点&#xff09;同时访问或修改同一份共享资源时&#xff0c;如何保证数据的正确性、一致性和系统可靠性&#x…

结合项目阐述 设计模式:单例、工厂、观察者、代理

原文链接&#xff1a;https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工厂模式应用 C17及之后可编译 /*日志落地模块的实现1.抽象落地基类2.派生子类&#xff08;根据不同落地方向进行派生&#xff09;3.使用工厂模式进行创建与表示的分离 */#ifndef _…

uniapp 更新apk有缓存点不动,卸载安装apk没有问题。android

方式一。pages.json&#xff1a;"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML响应式SEO公司网站源码

核心优势 100%纯HTML/CSS开发自动适配手机/平板/PC内置SEO优化结构0.5秒极速加载 包含页面 • 首页&#xff08;关键词布局优化版&#xff09; • 服务项目展示页 • 客户案例库 • 新闻资讯系统 • 联系方式&#xff08;带地图API&#xff09; 技术参数 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080显卡&#xff0c;在 Windows 11 上运行 ollama run deepseek-r1:1.5b 出现 Error: llama runner process has terminated: exit status 2 之前是好用的&#xff0c;后来不知为什么就不好用了。 原因&#xff1a; 检查 Microsoft Visual C Redistributab…

Linux中ssh远程登录原理与配置

SSH连接的五个阶段 1. 版本协商阶段&#xff08;Protocol Version Negotiation&#xff09;目的&#xff1a;协商使用SSH-1或SSH-2协议&#xff08;现代系统默认SSH-2&#xff09;。流程&#xff1a;关键点&#xff1a;若版本不兼容&#xff08;如客户端只支持SSH-1&#xff0c…

Kubernetes --存储入门

一、Volume 的概念对于大多数的项目而言&#xff0c;数据文件的存储是非常常见的需求&#xff0c;比如存储用户上传的头像、文件以及数据库的数据。在 Kubernetes 中&#xff0c;由于应用的部署具有高度的可扩展性和编排能力&#xff08;不像传统架构部署在固定的位置&#xff…