当前位置: 首页 > news >正文

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.dtcms.com/a/302559.html

相关文章:

  • 设计模式实战:自定义SpringIOC(理论分析)
  • 无界设计新生态:Penpot开源平台与cpolar的云端协同创新实践
  • 第二十二节 MATLAB转置向量、MATLAB追加向量
  • C++---初始化列表(initializer_list)
  • 基于黑马教程——微服务架构解析(二):雪崩防护+分布式事务
  • 使用 nvm (Node Version Manager) 来管理多个 Node.js 版本,并自由切换
  • OCR 赋能合同抽取:不良资产管理公司的效率加速器
  • 常见的接⼝测试⾯试题
  • 图像识别边缘算法
  • 从矩阵表示到卷积神经网络(CNN)与循环神经网络(RNN)
  • MCP error -32000: Connection closed
  • 基于开源AI智能名片链动2+1模式与S2B2C商城小程序的微商品牌规范化运营研究
  • mxn矩阵学习笔记
  • 使用Python制造扫雷游戏
  • Marc 非线性仿真复杂,企业如何保障许可证公平与高效使用?
  • (AC)储值购物
  • Android中主线程、ActivityThread、ApplicationThread的区别
  • 【氮化镓】GaN同质外延p-i-n二极管中星形与三角形扩展表面缺陷的电子特性
  • Python 实现服务器自动故障处理工具:从监控到自愈的完整方案
  • 日志分析-windows日志分析base--笔记ing
  • lesson26-2:使用Tkinter打造简易画图软件优化版
  • 深入解析MIPI C-PHY (五) MIPI C-PHY 与 A-PHY 的对比分析
  • 重生之我在暑假学习微服务第三天《Docker-上篇》
  • 【Unity笔记】Unity Camera.cullingMask 使用指南:Layer 精准控制、XR 多视图与性能提升
  • ERC20 和 XCM Precompile|详解背后技术逻辑
  • 学习Python中Selenium模块的基本用法(2:下载浏览器驱动)
  • js的学习2
  • JavaScript:数组常用操作方法的总结表格
  • Webhook技术深度解析:从原理到实现全指南
  • Item17:以独立语句将newed对象置入智能指针