时序数据库
时序数据库
本节介绍 IoT 架构中的时序数据库——InfluxDB。学习完成后,您将能够:
- 理解时序数据库在 IoT 中的核心作用
- 掌握 InfluxDB 的基本概念和架构
- 向客户解释 InfluxDB 与其他数据库的区别
- 了解 InfluxDB 部署和基本配置方法
Why Time-Series Database?
Section titled “Why Time-Series Database?”IoT 数据特性
Section titled “IoT 数据特性”IoT 设备产生的数据具有鲜明的时序特征:
传感器数据示例:时间戳 | 温度 | 湿度 | 设备ID---------------------------+------+------+--------2026-05-18T10:00:00Z | 25.3 | 68.2 | SENSOR-012026-05-18T10:01:00Z | 25.5 | 67.9 | SENSOR-012026-05-18T10:02:00Z | 25.4 | 68.0 | SENSOR-01为什么不用传统数据库?
Section titled “为什么不用传统数据库?”| 对比维度 | 传统关系数据库 (MySQL) | 时序数据库 (InfluxDB) |
|---|---|---|
| 写入性能 | 普通 | 极优(批量写入、压缩) |
| 查询效率 | 需要索引 | 按时间自动优化 |
| 数据压缩 | 一般 | 高压缩比 (10:1) |
| 保留策略 | 手动管理 | 自动过期删除 |
| 聚合查询 | 复杂 SQL | 内置时序聚合函数 |
| 存储成本 | 高 | 低(压缩+保留策略) |
InfluxDB Key Concepts
Section titled “InfluxDB Key Concepts”┌─────────────────────────────────────────────┐│ InfluxDB │├─────────────────────────────────────────────┤│ Organization (组织) ││ └── Bucket (桶 - 类似数据库) ││ └── Measurement (测量 - 类似表) ││ ├── Tags (标签 - 索引字段) ││ │ ├── device_id="SENSOR-01" ││ │ └── location="factory-a" ││ └── Fields (字段 - 数据值) ││ ├── temperature=25.3 ││ └── humidity=68.2 ││ Timestamp (时间戳 - 自动/手动指定) │└─────────────────────────────────────────────┘核心术语说明
Section titled “核心术语说明”| 术语 | 说明 | 类比关系数据库 |
|---|---|---|
| Organization | 组织/项目隔离 | 独立实例 |
| Bucket | 数据存储桶 | Database |
| Measurement | 测量类型 | Table |
| Tag | 标签(索引字段) | 带索引的列 |
| Field | 数据字段 | 普通列 |
| Timestamp | 时间戳(纳秒精度) | 主键索引 |
| Flux | 查询语言 | SQL |
InfluxDB vs Other Databases
Section titled “InfluxDB vs Other Databases”| 特性 | InfluxDB | MySQL/MariaDB | MongoDB |
|---|---|---|---|
| 数据模型 | 时序数据 | 关系型 | 文档型 |
| 写入优化 | ⭐⭐⭐ | ⭐ | ⭐⭐ |
| 时序查询 | ⭐⭐⭐ 内置函数 | ⭐ 需要手动实现 | ⭐⭐ 聚合管道 |
| 数据压缩 | ⭐⭐⭐ 高 | ⭐⭐ 普通 | ⭐⭐ 普通 |
| 保留策略 | ⭐⭐⭐ 自动 | ❌ 手动 | ❌ 手动 |
| 学习成本 | ⭐⭐ 中 | ⭐⭐⭐ 低 | ⭐⭐ 中 |
| 适用场景 | IoT 监控数据 | 业务系统 | 非结构化数据 |
Deployment
Section titled “Deployment”Docker Deployment
Section titled “Docker Deployment”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-tokenInitial Setup
Section titled “Initial Setup”# 通过 CLI 初始化docker exec influxdb influx setup \ --username admin \ --password YourPassword2024! \ --org iot-demo \ --bucket nodered \ --force
# 创建 API Tokendocker exec influxdb influx auth create \ --org iot-demo \ --all-access
# 验证安装curl http://localhost:8086/health# 预期输出: {"status":"pass","version":"2.x"}Data Operations
Section titled “Data Operations”Writing Data
Section titled “Writing Data”# 通过 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"Querying Data
Section titled “Querying Data”# 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)Integration with Node-RED
Section titled “Integration with Node-RED”// 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 (监控)Data Retention Policy
Section titled “Data Retention Policy”# 设置 30 天自动过期docker exec influxdb influx bucket update \ --name nodered \ --retention 30d
# 不同数据使用不同的保留期# 原始数据: 7天# 聚合数据: 90天# 统计数据: 365天Performance Considerations
Section titled “Performance Considerations”| 配置 | 写入性能 | 存储量估算 |
|---|---|---|
| 100 设备/分钟 | ~500,000 点/秒 | ~5GB/年 |
| 1000 设备/分钟 | ~5,000,000 点/秒 | ~50GB/年 |
| 10000 设备/分钟 | ~50,000,000 点/秒 | ~500GB/年 |
优化建议:
- 合理设置保留策略
- 使用批量写入而非单条写入
- 适当降低采样精度(小时级 vs 秒级)
- 使用 downsampling 降采样
Common Customer Questions
Section titled “Common Customer Questions”Q1: 为什么要用 InfluxDB 而不是 MySQL?
Section titled “Q1: 为什么要用 InfluxDB 而不是 MySQL?”A: InfluxDB 专为时序数据优化:写入速度快 10-100 倍、存储压缩比高 10 倍、内置时序聚合函数、支持自动数据过期。IoT 传感器的数据天然就是时序数据。
Q2: 历史数据如何保存?
Section titled “Q2: 历史数据如何保存?”A: 可以配置保留策略:高频数据短期保存,聚合数据长期保存。也支持将数据导出到对象存储(如 AWS S3)实现冷热分层。
Q3: 数据量大会不会影响查询速度?
Section titled “Q3: 数据量大会不会影响查询速度?”A: InfluxDB 对时序查询做了大量优化,使用时间索引和分片技术。配合合理的保留策略和降采样,数十 TB 级别的数据也能快速查询。
✅ 推荐做法:
- 合理设计 Tag 和 Field(Tag 用于过滤,Field 用于数值)
- 避免 Tag 包含过多唯一值(高基数问题)
- 设置合理的保留策略
- 使用批量写入提高性能
- 配置数据备份策略
❌ 避免做法:
- 将无序的数据存入 InfluxDB
- Tag 中使用时间戳等高频变化值
- 忽略数据备份
- 保留所有原始数据不做聚合
Summary
Section titled “Summary”- InfluxDB 是 IoT 时序数据的首选存储方案
- 高写入性能、高压缩比、自动过期管理
- 与 Node-RED 和 Grafana 天然集成
- 支持从边缘到云端的多种部署方式
- 开源版免费使用,企业版提供高可用支持