2. InfluxDB 核心概念:Measurement、Tag、Field、Timestamp、Retention Policy
在深入部署与调优之前,必须透彻理解 InfluxDB 的数据模型。与关系型数据库的行-列模型不同,InfluxDB 采用“时间序列数据模型”,其核心由 Measurement、Tag、Field、Timestamp 和 Retention Policy 五个要素构成。理解这些概念是正确设计 Schema 和优化写入性能的前提。
2.1 数据模型全景图
下图展示了 InfluxDB 中一个数据点的完整结构,以及它如何被组织到 Measurement 和 Retention Policy 中。
2.2 核心概念详解
2.2.1 Measurement
Measurement 相当于关系数据库中的“表”,是时间序列数据的逻辑容器。它描述了一类被测量的实体,例如“设备温度”、“风机转速”、“洁净室压差”。Measurement 本身不存储数据,而是作为 Tag、Field 和 Timestamp 的命名空间。
sensor_temperature、chiller_power。避免使用特殊字符和空格。
2.2.2 Tag
Tag 是索引元数据,以 Key-Value 形式存在。InfluxDB 会自动为 Tag 建立倒排索引,因此基于 Tag 的查询(如 WHERE host='server01')速度极快。Tag 的数据类型只能是字符串。
| 特性 | 说明 | 示例 |
|---|---|---|
| 索引 | 自动建立倒排索引,查询高效 | WHERE location='cleanroom_a' |
| 数据类型 | 仅支持字符串 | host="server01" |
| 基数 | Tag Value 的取值数量(Cardinality) | 1000 台服务器 → 基数 1000 |
| 存储 | Tag 本身不占用大量磁盘,但高基数会消耗内存 | 避免将 UUID、时间戳设为 Tag |
2.2.3 Field
Field 是实际数值的载体,也是 InfluxDB 存储和压缩的主要对象。Field 支持多种数据类型:浮点数、整数、字符串、布尔值。一个数据点必须至少包含一个 Field,否则该点无效。
| 数据类型 | 写入示例 | 说明 |
|---|---|---|
| Float | temperature=23.5 |
默认类型,带小数 |
| Integer | count=100i |
末尾加 i 标识 |
| String | status="running" |
用双引号包裹 |
| Boolean | alarm=true |
t/true/f/false |
WHERE temperature > 30)会触发全表扫描,应尽量避免。正确的做法是:将需要过滤的维度放入 Tag,将需要聚合计算的数值放入 Field。
2.2.4 Timestamp
Timestamp 是数据点的时间坐标,InfluxDB 以此为核心进行排序、聚合和下采样。时间戳精度最高为纳秒(ns),但通常使用秒、毫秒或微秒。如果写入时不指定时间戳,InfluxDB 会自动使用服务器当前时间。
-- 写入时指定时间戳(纳秒精度)
INSERT sensor_temperature,host=server01 value=23.5 1742027400000000000
-- 使用服务器当前时间(不推荐用于批量写入)
INSERT sensor_temperature,host=server01 value=23.5
- 尽量由数据采集端生成时间戳,避免依赖服务器时间。
- 批量写入时,确保时间戳单调递增或接近单调递增,这有助于 InfluxDB 的 TSM 引擎高效压缩。
- 时间戳乱序(Out-of-Order)会显著降低写入性能,应尽量避免。
2.2.5 Retention Policy (RP)
Retention Policy 定义了数据在 InfluxDB 中的保留时长和副本数。每个数据库可以有多个 RP,但只有一个默认 RP。数据超过保留时长后,InfluxDB 会自动删除过期 Shard。
| RP 属性 | 说明 | 示例 |
|---|---|---|
DURATION |
数据保留时长 | 7d、30d、INF |
REPLICATION |
副本数(仅集群版有效) | 1(单机版固定为 1) |
SHARD DURATION |
每个 Shard 覆盖的时间范围 | 默认由 DURATION 自动计算 |
DEFAULT |
是否为默认 RP | true / false |
-- 创建 Retention Policy
CREATE RETENTION POLICY "one_year" ON "factory_db" DURATION 365d REPLICATION 1 DEFAULT
-- 查看已有 RP
SHOW RETENTION POLICIES ON "factory_db"
-- 修改 RP
ALTER RETENTION POLICY "one_year" ON "factory_db" DURATION 180d
2.3 概念对比:InfluxDB vs 关系型数据库
| 关系型数据库 | InfluxDB | 差异说明 |
|---|---|---|
| Database | Database | 概念一致,逻辑隔离 |
| Table | Measurement | Measurement 无固定 Schema,Field 可动态增加 |
| Indexed Column | Tag | Tag 自动建索引,用于 WHERE 过滤 |
| Non-indexed Column | Field | Field 不建索引,用于存储数值 |
| Primary Key | Timestamp + Tag Set | 组合主键,唯一标识一个数据点 |
| TTL / 数据清理 | Retention Policy | 自动按时间删除过期 Shard |
2.4 Schema 设计示例:厂务传感器数据
以下是一个典型的厂务环境监控 Schema 设计,展示了如何合理分配 Tag 和 Field。
-- Measurement: 洁净室环境数据
-- Tag: location (低基数,约 50 个洁净室)
-- Tag: sensor_type (低基数,温度/湿度/压差)
-- Tag: floor (低基数,楼层)
-- Field: temperature (Float)
-- Field: humidity (Float)
-- Field: pressure (Float)
-- Field: particle_count (Integer)
-- Timestamp: 采集时间
-- 写入示例
INSERT cleanroom_env,location=CR-A01,sensor_type=temperature,floor=2 value=23.5 1742027400000000000
INSERT cleanroom_env,location=CR-A01,sensor_type=humidity,floor=2 value=45.2 1742027400000000000
INSERT cleanroom_env,location=CR-B02,sensor_type=pressure,floor=3 value=12.8 1742027401000000000
- 不要将时间戳、设备序列号、UUID 等高频唯一值设为 Tag。
- 不要在一个 Measurement 中混合不同采集频率的数据(如 1 秒级和 1 小时级)。
- 不要将 Tag 和 Field 的角色互换——Tag 用于过滤,Field 用于计算。
2.5 数据写入格式(Line Protocol)
InfluxDB 使用 Line Protocol 作为数据写入的文本格式,结构紧凑、解析高效。其语法如下:
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>...]] <field_key>=<field_value>[,<field_key>=<field_value>...] [<timestamp>]
# 示例
sensor_temperature,host=server01,location=cleanroom_a value=23.5,humidity=45.2 1742027400000000000
| 组成部分 | 是否必需 | 说明 |
|---|---|---|
| Measurement | 是 | 数据表名 |
| Tag Set | 否 | 逗号分隔的 Key=Value,无引号 |
| Field Set | 是 | 逗号分隔的 Key=Value,至少一个 |
| Timestamp | 否 | Unix 时间戳,精度由 API 参数指定 |
2.6 本章小结
掌握 Measurement、Tag、Field、Timestamp 和 Retention Policy 是使用 InfluxDB 的基石。Tag 用于快速过滤,Field 用于存储数值,Timestamp 决定时间线,RP 管理数据生命周期。合理的 Schema 设计能同时提升查询效率和写入性能,避免高基数陷阱和时间戳乱序问题。