跳转到内容

时序数据库

时序数据库

本节介绍 IoT 架构中的时序数据库——InfluxDB。学习完成后,您将能够:

  • 理解时序数据库在 IoT 中的核心作用
  • 掌握 InfluxDB 的基本概念和架构
  • 向客户解释 InfluxDB 与其他数据库的区别
  • 了解 InfluxDB 部署和基本配置方法

IoT 设备产生的数据具有鲜明的时序特征:

传感器数据示例:
时间戳 | 温度 | 湿度 | 设备ID
---------------------------+------+------+--------
2026-05-18T10:00:00Z | 25.3 | 68.2 | SENSOR-01
2026-05-18T10:01:00Z | 25.5 | 67.9 | SENSOR-01
2026-05-18T10:02:00Z | 25.4 | 68.0 | SENSOR-01
对比维度传统关系数据库 (MySQL)时序数据库 (InfluxDB)
写入性能普通极优(批量写入、压缩)
查询效率需要索引按时间自动优化
数据压缩一般高压缩比 (10:1)
保留策略手动管理自动过期删除
聚合查询复杂 SQL内置时序聚合函数
存储成本低(压缩+保留策略)
┌─────────────────────────────────────────────┐
│ InfluxDB │
├─────────────────────────────────────────────┤
│ Organization (组织) │
│ └── Bucket (桶 - 类似数据库) │
│ └── Measurement (测量 - 类似表) │
│ ├── Tags (标签 - 索引字段) │
│ │ ├── device_id="SENSOR-01" │
│ │ └── location="factory-a" │
│ └── Fields (字段 - 数据值) │
│ ├── temperature=25.3 │
│ └── humidity=68.2 │
│ Timestamp (时间戳 - 自动/手动指定) │
└─────────────────────────────────────────────┘
术语说明类比关系数据库
Organization组织/项目隔离独立实例
Bucket数据存储桶Database
Measurement测量类型Table
Tag标签(索引字段)带索引的列
Field数据字段普通列
Timestamp时间戳(纳秒精度)主键索引
Flux查询语言SQL
特性InfluxDBMySQL/MariaDBMongoDB
数据模型时序数据关系型文档型
写入优化⭐⭐⭐⭐⭐
时序查询⭐⭐⭐ 内置函数⭐ 需要手动实现⭐⭐ 聚合管道
数据压缩⭐⭐⭐ 高⭐⭐ 普通⭐⭐ 普通
保留策略⭐⭐⭐ 自动❌ 手动❌ 手动
学习成本⭐⭐ 中⭐⭐⭐ 低⭐⭐ 中
适用场景IoT 监控数据业务系统非结构化数据
services:
influxdb:
image: influxdb:2
container_name: influxdb
restart: unless-stopped
ports:
- "8086:8086"
volumes:
- ./influxdb/data:/var/lib/influxdb2
- ./influxdb/config:/etc/influxdb2
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=admin
- DOCKER_INFLUXDB_INIT_PASSWORD=YourPassword2024!
- DOCKER_INFLUXDB_INIT_ORG=iot-demo
- DOCKER_INFLUXDB_INIT_BUCKET=nodered
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=your-super-secret-token
Terminal window
# 通过 CLI 初始化
docker exec influxdb influx setup \
--username admin \
--password YourPassword2024! \
--org iot-demo \
--bucket nodered \
--force
# 创建 API Token
docker exec influxdb influx auth create \
--org iot-demo \
--all-access
# 验证安装
curl http://localhost:8086/health
# 预期输出: {"status":"pass","version":"2.x"}
Terminal window
# 通过 HTTP API 写入
curl -X POST http://localhost:8086/api/v2/write?org=iot-demo&bucket=nodered \
-H "Authorization: Token your-token" \
-H "Content-Type: text/plain" \
-d 'sensor_data,device_id=SENSOR-01,location=factory-a temperature=25.3,humidity=68.2'
# 通过 Flux 命令行写入
docker exec influxdb influx write \
--bucket nodered \
--org iot-demo \
--token your-token \
"sensor_data,device_id=SENSOR-01 temperature=25.3,humidity=68.2"
Terminal window
# Flux 查询示例
from(bucket: "nodered")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "sensor_data")
|> filter(fn: (r) => r.device_id == "SENSOR-01")
|> aggregateWindow(every: 5m, fn: mean)
// Node-RED InfluxDB 配置
{
"id": "influxdb-config",
"type": "influxdb",
"name": "InfluxDB",
"host": "influxdb",
"port": "8086",
"protocol": "http",
"org": "iot-demo",
"bucket": "nodered",
"token": "your-token"
}
Node-RED Flow:
MQTT Input → Function(解析) → InfluxDB Output
Debug (监控)
Terminal window
# 设置 30 天自动过期
docker exec influxdb influx bucket update \
--name nodered \
--retention 30d
# 不同数据使用不同的保留期
# 原始数据: 7天
# 聚合数据: 90天
# 统计数据: 365天
配置写入性能存储量估算
100 设备/分钟~500,000 点/秒~5GB/年
1000 设备/分钟~5,000,000 点/秒~50GB/年
10000 设备/分钟~50,000,000 点/秒~500GB/年

优化建议:

  • 合理设置保留策略
  • 使用批量写入而非单条写入
  • 适当降低采样精度(小时级 vs 秒级)
  • 使用 downsampling 降采样

Q1: 为什么要用 InfluxDB 而不是 MySQL?

Section titled “Q1: 为什么要用 InfluxDB 而不是 MySQL?”

A: InfluxDB 专为时序数据优化:写入速度快 10-100 倍、存储压缩比高 10 倍、内置时序聚合函数、支持自动数据过期。IoT 传感器的数据天然就是时序数据。

A: 可以配置保留策略:高频数据短期保存,聚合数据长期保存。也支持将数据导出到对象存储(如 AWS S3)实现冷热分层。

Q3: 数据量大会不会影响查询速度?

Section titled “Q3: 数据量大会不会影响查询速度?”

A: InfluxDB 对时序查询做了大量优化,使用时间索引和分片技术。配合合理的保留策略和降采样,数十 TB 级别的数据也能快速查询。

推荐做法:

  • 合理设计 Tag 和 Field(Tag 用于过滤,Field 用于数值)
  • 避免 Tag 包含过多唯一值(高基数问题)
  • 设置合理的保留策略
  • 使用批量写入提高性能
  • 配置数据备份策略

避免做法:

  • 将无序的数据存入 InfluxDB
  • Tag 中使用时间戳等高频变化值
  • 忽略数据备份
  • 保留所有原始数据不做聚合
  1. InfluxDB 是 IoT 时序数据的首选存储方案
  2. 高写入性能、高压缩比、自动过期管理
  3. 与 Node-RED 和 Grafana 天然集成
  4. 支持从边缘到云端的多种部署方式
  5. 开源版免费使用,企业版提供高可用支持