MENU
// //

深入了解 Influx:时序数据库的力量

July 27, 2023 • 技术分享

引言

时序数据是按照时间顺序进行记录和存储的数据,广泛应用于物联网、金融、监控和日志分析等领域。例如,传感器数据、股票价格、服务器日志等都是时序数据。

InfluxDB 是一个专为处理时序数据而设计的高性能、分布式的开源时序数据库。它具有快速的写入和查询速度,可扩展的存储和水平扩展能力等特点。

{lamp/}

Influx简介

InfluxDB是一个开源、分布式的时序数据库,专门用于处理时间序列数据。它被设计用于高效地存储、检索和处理与时间相关的数据,例如传感器数据、监控数据、日志数据、度量指标等。InfluxDB采用了特定的数据存储和查询引擎,非常适合用于存储和分析时间序列数据。

Influx特点

  1. 时间序列数据:InfluxDB专注于存储和处理时间序列数据,可以高效地处理大量的时间戳和关联数据。
  2. 高性能:InfluxDB具有优化的存储引擎,支持快速的写入和查询操作。它使用了用于时间序列数据的特定数据结构,以提供高速的数据访问。
  3. 数据模型:InfluxDB使用了一种灵活且直观的数据模型,数据以测量(measurement)、标签(tag)和字段(field)的形式进行组织。这种模型使得存储和查询数据变得简单且高效。
  4. 查询语言:InfluxDB提供了InfluxQL查询语言,它类似于SQL,但专注于时间序列数据的处理和分析。InfluxQL提供了丰富的功能,包括聚合操作、过滤、分组、变换等。
  5. 数据保留策略:InfluxDB允许设定数据的保留策略,根据时间自动删除旧数据。这样可以方便地管理数据的保留时间,避免无限制地增长数据库大小。
  6. 扩展性:InfluxDB具有良好的水平扩展能力,可以支持大规模的数据存储和处理。它支持集群部署,可以通过添加更多的节点来实现数据的分布和负载均衡。

Influx的架构和组件

InfluxDB 是一个分布式的时序数据库,其架构由多个组件组成。数据节点负责存储和处理实际的时序数据,它们可以分布在多个服务器上以提供更好的性能和容错性。元数据节点用于管理与数据相关的元数据,如数据库和测量的信息。持久化存储组件用于将时序数据持久保存在磁盘上,确保数据的持久性和可恢复性。这些组件密切合作,以提供高效且可靠的时序数据存储和查询

Influx中的参数详解

  1. retention.policy(保留策略):用于指定数据在数据库中的保留时间。可以根据需求为不同的测量设置不同的保留策略。例如,可以设置一个策略来保留最近90天的数据,另一个策略来保留过去一年的数据。
  2. shard.duration(分片持续时间):用于指定每个分片(shard)存储数据的时间范围。较小的分片持续时间可以提高查询性能,但会增加存储需求。较大的分片持续时间可以减少存储需求,但可能会影响查询性能。
  3. replication.factor(复制因子):指定数据在集群中的复制因子。复制因子定义了每个数据副本的数量。较高的复制因子可以提供更高的可用性和容错性,但会增加存储需求和写入延迟。
  4. max-values-per-tag(每个标签的最大值数量):用于限制每个标签上的不同值的数量。这可以帮助控制索引的大小,限制查询和存储的开销。可以根据特定的标签设定不同的限制。
  5. max-series-per-database(每个数据库的最大序列数量):用于限制每个数据库中序列的数量。这可以帮助控制数据库的大小和查询的性能。可以根据数据库的大小和性能需求设置适当的限制。
    6.query-log-enabled(查询日志开启):用于启用或禁用查询日志记录。查询日志可以用于跟踪和审计查询操作,帮助进行性能优化和故障排除。

Influx实例讲解

参数解释

Timestamp
 InfluxDB中存储的所有数据都有一个存储时间戳的_time列。在磁盘上,时间戳以纳秒格式存储。InfluxDB格式时间戳以RFC 3339(如:2020-01-01T00:00:00.00Z)格式显示与数据关联的日期和时间。

Measurement
 度量名称,字符串类型,充当标记、字段和时间戳的容器。

Fields
必需,非索引。

  • Field key
    字段键是表示字段名称的字符串。
  • Field value
    字段值表示关联字段的值。值的类型为string, float, integer, uInteger, boolean.
  • Field set
    字段集是与时间戳关联的字段键值对的集合。


Tags
可选,索引。

  • Tag key
    索引键
  • Tag value
    索引值
  • Tag set
    tag key 和 tag value 组成的 set 集合

Series
 Series = Measurement + Tag set + Field key
Point
 Point = Series + Field value + Timestamp
Bucket
 所有的数据都存储在一个Bucket中。Bucket结合了Database和Retention period(每个数据点过期的时间)的概念。Bucket 属于一个organization。
Organization
 一组 dashboard,task, bucket 和 users 属于一个 organization.

name: jxzy_person_monitor
time                 | _field           | _measurement      | _value | in_out_mark | tenant_id
---------------------+------------------+-------------------+--------+-------------+-----------
1627375620000000000  | temperature      | jxzy_person_monitor | 25.5   | 1           | ABC123
1627375640000000000  | humidity         | jxzy_person_monitor | 60.3   | 1           | ABC123
1627375660000000000  | temperature      | jxzy_person_monitor | 24.1   | 1           | XYZ789
1627375680000000000  | humidity         | jxzy_person_monitor | 55.2   | 1           | XYZ789
1627375700000000000  | temperature      | jxzy_person_monitor | 23.7   | 1           | DEF456

1.查询数据:

  • 查询所有数据点:
from(bucket: "jxzy_person_monitor")
  |> range(start: 0)
  • 查询特定字段的数据点:
from(bucket: "jxzy_person_monitor")
  |> range(start: 0)
  |> filter(fn: (r) => r._field == "temperature")
  • 查询指定测量、字段和标签的数据点:
from(bucket: "jxzy_person_monitor")
  |> range(start: 0)
  |> filter(fn: (r) => r._measurement == "jxzy_person_monitor" and r._field == "humidity" and r.tenant_id == "ABC123")
  • 按字段分组并计算平均值:
from(bucket: "jxzy_person_monitor")
  |> range(start: 0)
  |> group(columns: ["in_out_mark"])
  |> mean()
  1. 删除数据:
  • 根据条件删除数据点:

from(bucket: "jxzy_person_monitor")
  |> range(start: 0)
  |> filter(fn: (r) => r._measurement == "jxzy_person_monitor" and r.tenant_id == "XYZ789")
  |> delete()

3.修改数据:

  • 修改特定数据点的值:
from(bucket: "jxzy_person_monitor")
  |> range(start: 0)
  |> filter(fn: (r) => r._measurement == "jxzy_person_monitor" and r.tenant_id == "ABC123" and r._field == "temperature" and r._time == 1627375620000000000)
  |> map(fn: (r) => ({ r with _value: 26.5 }))
  |> to(bucket: "jxzy_person_monitor", org: "<your-org>")

参考文章

InfluxDB 2.0

Last Modified: September 11, 2023