InfluxDB 是一个时序数据库(TSDB),它的结构层次与传统的关系型数据库有所不同。它的层次结构主要包括以下几个关键组件:Database(数据库)、Retention Policy(保留策略)、Measurement(测量)、Tag(标签)、Field(字段)、Point(数据点) 和 Shard(分片)。这些组件共同构成了 InfluxDB 存储和管理时序数据的架构。
InfluxDB 的结构层次
Measurement(测量)
- Measurement 是数据的分类或名称,类似于 SQL 中的“表”。它是存储时间序列数据的核心容器。
- 一个数据库可以包含多个 measurement,每个 measurement 存储不同种类的时间序列数据(例如:
temperature
、humidity
、cpu_usage
等)。 - Example:
temperature
、cpu_usage
、disk_space
等。
Database(数据库)
- Database 是 InfluxDB 中存储数据的最顶层容器。每个数据库可以包含多个 measurement。你可以在多个数据库之间进行数据隔离。
- 在 InfluxDB 中,数据库本身不提供任何分区,它只是一个存储数据的逻辑容器。
- Example:
sensor_data
、monitoring_data
等。
Retention Policy(保留策略)
- Retention Policy 是数据存储的有效期限和副本数的设置。Retention Policy 决定了数据点的生命周期(数据保存多长时间)和复制策略。
- 每个数据库至少有一个保留策略,默认是
autogen
,它通常会设置一个自动删除过期数据的时间(例如:1天、1月等)。 - 你可以为每个数据库创建多个保留策略,并且可以指定默认保留策略。数据写入时如果没有明确指定保留策略,将使用默认策略。
- DURATION:指定数据点的有效期限。如果是
INF
,表示数据会永久存储。 - REPLICATION:指定数据副本数,通常在高可用部署中使用。
- Example:
autogen
(默认策略),permanent
(永久策略)等。
Shard(分片)
- Shard 是存储数据的物理分片。数据会根据时间戳分布到不同的分片中。每个分片包含一段时间范围内的数据。
- 当你创建一个数据库并写入数据时,InfluxDB 会根据保留策略的
shard group duration
将数据分配到不同的分片。 - Shard 是通过 时间范围 来划分的,这意味着较老的数据可能会被存储在更早的分片中,而较新的数据会被存储在当前分片中。
- Example: 数据在每隔一段时间(比如 1 天、1 月)会被写入新的 shard。
Point(数据点)
- Point 是 InfluxDB 存储的最小数据单元,表示一个单独的时间序列数据。一个 Point 包含以下元素:
- Measurement:数据的名称。
- Tags:用于描述数据的元数据(键值对),用于索引。
- Fields:实际的数值数据(如温度、湿度、压力等)。
- Timestamp:数据点的时间戳,表示数据记录的时间。
- Example:
{measurement="temperature", tags={location="room1", sensor="sensor1"}, fields={value=25.5}, timestamp=1622045600000000000}
。
- Point 是 InfluxDB 存储的最小数据单元,表示一个单独的时间序列数据。一个 Point 包含以下元素:
Field(字段)
- Field 是实际的数值数据,表示测量值。字段存储的是可以进行计算的数据,例如温度、湿度、压力等。
- 字段的值可以是:
- 数字:浮动数值、整数。
- 字符串:例如日志信息、事件描述。
- 布尔值:True 或 False。
- 字段不支持索引,因此查询时速度不如标签快,但字段可以支持更多的数据类型。
Tag(标签)
- Tag 是键值对,用于对数据进行分类和标识。标签是 索引字段,使得基于标签的查询非常高效。标签可以用来按特定条件过滤数据。
- 标签通常用于表示数据的维度或属性(如:传感器的 ID、设备的地点、网络接口等)。
- Example:
location="room1"
,sensor="sensor1"
。
InfluxDB 数据结构图示
+---------------------+ +------------------------+
| Database | | Retention |
| (sensor_data) +-------->+ (autogen) |
+---------------------+ +------------------------+
| |
| v
| +----------------+
| | Shard Group |
| | (time range) |
| +----------------+
| |
v v
+-------------------+ +-------------------+
| Measurement | | Point |
| (temperature) | | (value=25.5) |
+-------------------+ +-------------------+
| |
v v
+-------------------+ +-------------------+
| Tags | | Fields |
| (location=room1) | | (value=25.5) |
+-------------------+ +-------------------+
总结:
InfluxDB 的数据存储结构是分层的,通过数据库、保留策略、测量、标签、字段和数据点来组织数据。这样设计的好处是:
- 高效的查询:通过标签索引,InfluxDB 可以快速定位数据。
- 高效的存储:通过分片和保留策略,InfluxDB 可以根据数据时间范围进行优化存储和管理。
- 灵活的查询:通过 Measurement、Tag 和 Field,可以灵活地查询、过滤和聚合数据。
客户端查看工具: - https://github.com/JorgeMaker/InfluxDBWorkBench?tab=readme-ov-file