ITPub博客

首页 > 数据库 > 数据库开发技术 > 时序数据库 InfluxDB

时序数据库 InfluxDB

原创 数据库开发技术 作者:DevXTalk 时间:2024-07-09 15:11:04 0 删除 编辑

时序数据库 InfluxDB

为什么是InfluxDB?

当选择一个时间序列数据库(TSDB)用于存储和分析时间序列数据时,确实有几个关键因素需要考虑,包括存储和查询性能、存储空间效率以及可扩展性。InfluxDB 在这些方面表现突出,使其成为许多组织的首选解决方案,尤其是在物联网(IoT)、应用性能监控(APM)、网络监控和日志分析等领域。 从时间序列数据库相关的趋势数据来看,它已经超越了以前常用的RRDTool和Graphite,以压倒性的速度增长。

简介

InfluxDB 作为一款专为时间序列数据设计的开源数据库,使用 Go 语言构建,尤其擅长处理和分析源自监控系统、物联网设备等来源的时序数据。其内建的高级功能,诸如计算标准差、随机抽样、追踪数据变化比率等,极大地简化了数据分析和实时监控任务。

开源与商业版本

InfluxDB 提供了两个主要版本:一个免费的开源版本,适用于小型到中型部署,以及一个增强的商业版本,即 InfluxDB Enterprise,该版本支持集群部署,提供更高的可用性和数据冗余,适合大规模生产环境。

存储要求

InfluxDB 最佳运行在固态硬盘(SSD)上,这是因为其设计充分利用了 SSD 的高速读写能力,以实现最佳性能。若使用机械硬盘或网络存储,由于 I/O 性能限制,InfluxDB 的效能可能会显著降低。

API 支持与安全性

InfluxDB 支持 RESTful API 接口,允许外部应用和服务以标准方式与其交互。此外,InfluxDB 支持 HTTPS 协议,确保数据传输的安全性。对于非局域网环境中的远程访问,使用 HTTPS 加密通信是推荐的做法,以防止数据在传输过程中被截获或篡改。

综合评价

InfluxDB 的设计初衷是为了解决高频率、高并发的时间序列数据存储和查询问题,其高效的存储引擎和丰富的查询语言使其成为监控数据管理和分析的理想选择。无论是用于实时监控还是历史数据分析,InfluxDB 都能提供稳定且高性能的解决方案。

使用场景

InfluxDB 作为一种专为时间序列数据设计的数据库,它在监控场景中扮演着核心角色,特别是在运维(DevOps)和物联网(IoT)领域。这类数据库被优化用于存储和实时处理带有时间戳的数据点,这使得它们非常适合记录和分析随时间变化的指标。

监控场景示例

想象一下,你正在开发一个系统来监控服务器的 CPU 使用率。你可以编写一个脚本或服务,每 10 秒钟采集一次 CPU 使用情况,并将这些数据点存储到 InfluxDB 中。随后,你可以编写一个查询,比如使用 InfluxDB 的查询语言 InfluxQL 或者更新的 Flux,来定期(比如每 10 秒)计算过去 30 秒内 CPU 使用率的平均值。 接下来,基于这个查询的结果,你可以设置警报规则。例如,如果平均 CPU 使用率超过了预定义的阈值(比如 80%),系统就会立即触发警报,通知相关人员采取行动。

IoT 应用

在物联网领域,InfluxDB 同样展现了其价值。例如,对于工业设备的监控,你可以持续监测一台机器的轴承振动频率,以预测潜在的机械故障。同样地,对于农业自动化,InfluxDB 可以用来收集和分析土壤湿度、温度和其他环境变量,帮助农民做出更精准的灌溉和种植决策。

实时分析与决策

无论是在运维还是 IoT 场景下,InfluxDB 的强大之处在于它能够实时处理数据流,使得用户能够即时响应变化,进行实时分析,并根据当前状况做出决策。这种即时性对于预防问题、优化运营和提升效率至关重要。

为什么不用关系型数据库

写入性能

关系型数据库确实支持时间戳字段,并能够执行基于时间戳的复杂查询。然而,在涉及大量时间序列数据的高频写入场景中,关系型数据库的写入性能可能会受到限制。这是因为关系型数据库,尤其是那些使用 B+ 树作为主数据结构的数据库,为了维护数据的排序和索引一致性,在插入新数据时可能需要进行页面分裂(page split)。页面分裂涉及到对磁盘的随机读写操作,这在高写入负载下会导致性能瓶颈。 相比之下,时序数据库,如 InfluxDB、TimescaleDB 等,通常基于 LSM Tree(Log-Structured Merge Tree)的变体进行设计。LSM Tree 将数据写入操作转化为顺序写,这大大提高了写入效率。在 LSM Tree 中,数据首先被写入内存中的一个结构(如 Memtable),当达到一定大小后,该结构会被刷新到磁盘上的一个 SSTable 文件中。多个 SSTable 文件可以合并,以减少磁盘上的文件数量并优化查询性能。这种设计减少了磁盘的随机访问,转而利用顺序写入的优势,从而显著提高了写入速度。

写入性能对比:

  • 关系型数据库:在高写入频率下,由于 B+ 树的页分裂和随机磁盘访问,写入性能可能会下降。
  • 时序数据库:通过 LSM Tree 的顺序写入机制,可以达到每秒数十万点的写入速率,这在监控和 IoT 数据收集等场景中非常关键。

数据价值

时序数据库在指标监控场景中发挥着核心作用,这类场景下的数据具有显著的“冷热”差异特性。在监控环境中,用户通常最关心的是最近一段时间内的数据,例如,你可能只关注过去 10 分钟内某台设备的运行状态,而对于超过 10 分钟前的数据,其查询频率会显著降低,甚至几乎不再被访问。因此,这些较早的数据被视为“冷数据”,而近期内的数据则被称为“热数据”。

对于冷数据,时序数据库会采用压缩存储策略,将其从内存中移出并存放到磁盘上,这样既能节省宝贵的内存资源,又能减少不必要的存储成本。磁盘存储通常采用更高效的数据压缩算法,进一步节省空间。 相反,热数据由于频繁被查询,时序数据库会倾向于将其保留在内存中,以提供最快的访问速度。内存中的数据无需经过磁盘 I/O 操作,因此查询响应时间极短,这对于实时监控和分析至关重要。

大多数时序数据库都内置了这样的冷热数据管理机制。它们会根据数据的访问频率和时间属性自动调整数据的存储位置,将热数据保留在内存或高速存储介质(如 SSD)中,而将冷数据转移到较低成本的存储设备(如 HDD)或进行压缩存储。

时序数据库还支持数据生命周期管理,允许管理员设置数据保留策略。这意味着系统可以自动删除超出指定时间范围的数据,避免无限期地占用存储空间。这种策略对于长期运行的监控系统尤为重要,它有助于控制存储成本并保持系统的高效运行。

时间不可倒流,数据只写不改

时序数据本质上是记录了实体在各个时间点的状态快照,这种数据类型在很多场景中极为常见,比如观察计算机的 CPU 使用率。当你通过任务管理器发现 CPU 占用率异常高,进而采取措施(如结束某个进程)来降低负载时,这一系列操作影响的是当前及未来的时间点。然而,对于过去的时间点,比如 10 秒前的 CPU 使用情况,一旦被记录下来,就不会因为后续的操作而发生改变。这就是时序数据的一个关键特征——它们是对过去某一时刻状态的真实反映,不随后续事件而更改。

基于时序数据的这一特性,时序数据库的设计通常侧重于高效处理大量插入操作,而更新需求相对较少。这是因为时序数据的记录通常代表了不可逆的历史事实,一旦被写入数据库,就不需要也不应该被修改。相反,新的数据点会不断追加到数据库中,形成连续的时间序列。

时序数据库的架构往往反映了数据的不可变性原则。这意味着一旦数据点被记录,它就成为历史的一部分,不应被更改或删除,除非是通过明确的数据保留策略自动清理过期数据。这种设计确保了数据的完整性和历史准确性,对于依赖于准确历史记录的分析和监控系统至关重要。

存储

InfluxDB 作为一款专为时间序列数据设计的数据库,其数据模型与关系型数据库如 MySQL 有明显的区别,特别是围绕时间戳构建的核心概念。在 InfluxDB 中,数据点总是与一个特定的时间戳相关联,这使得它能够有效地存储和查询随时间变化的指标,如系统负载、服务响应时间等。

数据模型

InfluxDB 中的数据模型包括以下几个关键组件:

  • Measurement: 类似于 MySQL 中的表,它表示数据点所属的测量单位或类别。例如,你可以有一个名为 "cpu_load" 的 measurement 来存储 CPU 负载数据。
  • Timestamp: 时间戳是数据点的关键组成部分,它标识了数据点发生的具体时间。在 InfluxDB 中,时间戳是每个数据点的隐含主键,用于区分不同的数据记录。
  • Fields: 字段是数据点的实际数值,它们是以键值对的形式存储的。字段可以是任何数据类型,包括整数、浮点数、字符串等。与 MySQL 中的列类似,但它们不需要预先定义。
  • Tags: 标签也是键值对,但它们用于标识数据点的元数据,如服务器名称、地理位置等。与字段不同,标签提供了索引功能,使得按标签查询数据更加高效。

对比 MySQL

与 MySQL 的关系型数据模型相比,InfluxDB 的设计更加灵活,无需预先定义数据结构。这意味着你可以在运行时动态添加 measurements、tags 和 fields,无需创建表或定义列。

  • 无模式设计: InfluxDB 采用无模式设计,意味着无需预先定义数据结构。数据点的结构可以根据写入的数据动态确定,空值不会被存储,这与 MySQL 中需要显式定义表结构和不允许空值(除非定义为 NULL)形成对比。
  • 数据类型约束: 对于 fields,InfluxDB 要求数据类型的一致性。如果一个 field 的数据类型在首次写入后发生变化,InfluxDB 将会抛出错误。而 tags 默认将所有的值视为字符串,因此不会遇到类型不一致的问题。

理论和原理

InfluxDB 行协议

Telegraf 是 InfluxData 公司推出的一款开源数据采集代理,它被设计用于收集各种来源的系统和应用指标,然后将这些数据发送到 InfluxDB 或其他时间序列数据库。Telegraf 支持多种插件,可以采集来自操作系统、网络设备、数据库、应用程序等多种数据源的指标,这些数据被格式化成 InfluxDB 可以理解的行协议,以便于存储和查询。

InfluxDB 的行协议是一种简单的文本格式,用于将数据点发送到 InfluxDB。一条数据记录由以下四个部分组成:

  1. Measurement (测量名称): 这是数据点所属的测量单位或类别,类似于 SQL 数据库中的表名。例如,cpu_usage 可以作为一个 measurement 名称,用于存储所有与 CPU 使用率相关的数据。
  2. Tag Set (标签集): 标签集是一组键值对,用于标记数据点的元数据,如主机名、区域或服务实例。标签提供了额外的维度信息,可以用于过滤和聚合数据。例如,host="server1",region="us-west"。
  3. Field Set (字段集): 字段集包含了实际的数值数据,也是键值对形式,但这里的值通常是数字或字符串。例如,value=23.5 表示 CPU 使用率为 23.5%。
  4. Timestamp (时间戳): 时间戳用于标识数据点发生的确切时间。如果在数据点中未指定时间戳,InfluxDB 会使用数据接收时的时间。

安装部署

拉取镜像

docker pull influxdb

启动influxdb容器

docker run -d -p 8086:8086 --name influxdb influxdb

通过地址:http://127.0.0.1:8086 访问


谁在招人

后端开发实习生

招聘单位:粤港澳大湾区数字经济研究院(福田)

部门:AI金融与深度学习中心

待遇:实习薪酬面议,其他补贴异地房补2K/月,餐补85/天,线下实习至少3个月

投递官网:https://idea.zhiye.com/intern/detail?jobAdId=9d46656e-3b6d-475e-90ba-01b6da821046

其他【量化/大模型类】【全职及实习】岗位见官网

【职位描述】

参与公司AI产品后端的优化、开发和维护工作

参与公司PDF数据库的开发和维护工作

【职位要求】

1)精通Python、SQL、Elasticsearch或MongoDB

2)后端基础扎实,了解docker相关概念,有API设计能力,有良好的数据结构和算法基础

3)踏实肯干,自律上进,对编程和人工智能行业有热情和执着

4)良好的理解和沟通能力,能独立解决问题,也具备团队意识。对项目中存在的不能自己解决的技术难点,及时向团队反馈及解决

5)本科以上学历,具备较强学习能力,对新领域前沿技术敏感


欢迎加入 DevXTalk 的程序员、架构师、IT从业者交流群,在这里你可以和大佬们一起交流分享技术,行业经验,职位内推,摸鱼聊天。总之期待你的加入... 添加我的wx,备注:“进群”拉你进群(群二维码有效时间太短维持不了几天)

有招聘需求的也可以加我微信把招聘岗位发给我,我会贴在文章末尾,毕竟我的读者个个都是人才。

有需要推广自己的开源作品的也可以联系我,可以在公众号内帮助推广。


看完本文有收获?转发给更多的朋友吧

DevXTalk 不止于技术


原文作者:DevXTalk;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-03-23

  • 博文量
    178
  • 访问量
    82573