2. InfluxDB 核心概念:Measurement、Tag、Field、Timestamp、Retention Policy

在深入部署与调优之前,必须透彻理解 InfluxDB 的数据模型。与关系型数据库的行-列模型不同,InfluxDB 采用“时间序列数据模型”,其核心由 Measurement、Tag、Field、Timestamp 和 Retention Policy 五个要素构成。理解这些概念是正确设计 Schema 和优化写入性能的前提。

核心原则:Tag 用于快速过滤与分组,Field 用于存储实际数值,Timestamp 决定数据点的时间坐标。三者共同构成一个数据点(Point)。

2.1 数据模型全景图

下图展示了 InfluxDB 中一个数据点的完整结构,以及它如何被组织到 Measurement 和 Retention Policy 中。

InfluxDB 数据点结构全景图 Measurement: “sensor_temperature” RP: “autogen” / “1year” Tag Set(索引元数据) Tag Key: “host” Tag Value: “server01” Tag Key: “location” Tag Value: “cleanroom_a” → 自动建立倒排索引,用于 WHERE 过滤 Field Set(实际数值) Field Key: “value” Field Value: 23.5 Field Key: “humidity” Field Value: 45.2 → 必须包含至少一个 Field,否则数据点无效 Timestamp(时间戳) 2025-03-15T08:30:00Z (Unix 纳秒: 1742027400000000000) 完整数据点 (Point) sensor_temperature,host=server01,location=cleanroom_a value=23.5,humidity=45.2 1742027400000000000

2.2 核心概念详解

2.2.1 Measurement

Measurement 相当于关系数据库中的“表”,是时间序列数据的逻辑容器。它描述了一类被测量的实体,例如“设备温度”、“风机转速”、“洁净室压差”。Measurement 本身不存储数据,而是作为 Tag、Field 和 Timestamp 的命名空间。

命名建议:使用蛇形命名法(snake_case),如 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
高基数陷阱:Tag 的基数过高(如超过 1000 万)会导致内存压力剧增,严重影响写入性能。永远不要将高唯一性的值(如设备序列号、请求 ID)设为 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
性能要点:Field 不建立索引。对 Field 的过滤(如 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
Schema 设计红线:
  • 不要将时间戳、设备序列号、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 参数指定
写入性能关键:批量写入时,将多个数据点合并为一次 HTTP POST 请求,每行一个 Point,行末加换行符。建议每批 5000~10000 个点,可大幅提升吞吐量。

2.6 本章小结

掌握 Measurement、Tag、Field、Timestamp 和 Retention Policy 是使用 InfluxDB 的基石。Tag 用于快速过滤,Field 用于存储数值,Timestamp 决定时间线,RP 管理数据生命周期。合理的 Schema 设计能同时提升查询效率和写入性能,避免高基数陷阱和时间戳乱序问题。