数据库08:时序数据库

从时间序列数据特征、InfluxDB 架构、TDengine 高性能设计到时序数据处理模式,理解时序数据库在监控、物联网和日志场景下的应用。

字数 1113 阅读时长 ≈ 4 分钟 2026-7-14 2026-7-14
数据库08:时序数据库

时序数据库(Time Series Database,TSDB)专门用于存储和处理时间序列数据,如监控指标、物联网传感器数据、日志等。传统关系型数据库在处理这类数据时效率很低,而时序数据库针对时间序列数据的特点做了深度优化。

这篇文章围绕四个核心点:时间序列数据特征、InfluxDB 架构、TDengine 高性能设计、时序数据处理模式,理解时序数据库的设计思路和适用场景。

时间序列数据:为什么需要专用数据库

时间序列数据有独特的特征,传统数据库无法高效处理。

数据特征

特征说明对数据库的要求
高写入每秒百万级写入高吞吐量写入
时序性数据按时间顺序产生时间索引优化
只读性写入后很少更新优化读性能
聚合查询按时间窗口聚合高效聚合计算
生命周期数据有过期时间TTL 自动清理
标签维度多维度标签高效标签查询

传统数据库的问题

  • 写入性能低:B+Tree 索引不适合高频写入
  • 存储效率低:不支持时序压缩
  • 查询效率低:聚合查询需要扫描大量数据
  • TTL 支持差:需要手动清理过期数据

InfluxDB:时序数据库的标杆

InfluxDB 是最流行的开源时序数据库之一,它的设计思路是”为时序数据而生”。

数据模型

InfluxDB 使用独特的数据模型,包含四个概念:

measurement(测量):数据的类别,类似表名
tag(标签):索引字段,用于过滤和分组
field(字段):实际数据值
timestamp(时间戳):数据产生的时间

示例

measurement: cpu_usage
tags: host=server01, region=us-east
fields: value=85.2, usage=0.85
timestamp: 2024-01-01T12:00:00Z

数据写入

InfluxDB 使用 Line Protocol 格式写入数据:

cpu_usage,host=server01,region=us-east value=85.2,usage=0.85 1704067200000000000

查询语言:InfluxQL

-- 查询最近 1 小时的 CPU 使用率
SELECT MEAN(value) FROM cpu_usage 
WHERE host = 'server01' 
AND time >= now() - 1h 
GROUP BY time(5m);

-- 多个主机对比
SELECT MEAN(value) FROM cpu_usage 
WHERE region = 'us-east' 
AND time >= now() - 1h 
GROUP BY host, time(5m);

存储引擎:TSM(Time Structured Merge Tree)

TSM 是 InfluxDB 的核心存储引擎,专为时序数据设计:

  1. 写入流程

    • 先写入 WAL(Write-Ahead Log)
    • 再写入内存中的 Cache
    • Cache 达到阈值后,写入 TSM 文件
  2. TSM 文件结构

    • 时间窗口内的数据按时间排序
    • 支持多种压缩算法(LZ4、Snappy)
    • 按时间范围划分文件,支持 TTL

集群架构

InfluxDB Enterprise 版本支持集群部署:

Meta Node(元数据节点)
  ├── Data Node(数据节点)
  ├── Data Node(数据节点)
  └── Query Node(查询节点)

TDengine:国产高性能时序数据库

TDengine 是国内开源的时序数据库,主打高性能和低资源消耗。

核心特点

特点说明
高性能写入性能是 InfluxDB 的 10 倍以上
低存储压缩率高达 10-20 倍
分布式原生分布式,支持水平扩展
SQL 兼容支持标准 SQL,学习成本低
实时计算内置流计算引擎

数据模型

TDengine 使用关系型数据模型,更符合传统数据库习惯:

CREATE TABLE cpu_usage (
    ts TIMESTAMP,
    host NCHAR(64),
    region NCHAR(32),
    value DOUBLE,
    usage DOUBLE
) TAGS (host, region);

超级表(Super Table)

TDengine 的超级表是一大特色,用于管理同类设备的数据:

-- 创建超级表
CREATE STABLE cpu_usage_stable (
    ts TIMESTAMP,
    value DOUBLE,
    usage DOUBLE
) TAGS (host NCHAR(64), region NCHAR(32));

-- 创建子表(每个设备一个表)
CREATE TABLE cpu_usage_server01 USING cpu_usage_stable 
TAGS ('server01', 'us-east');

-- 查询所有设备
SELECT AVG(value) FROM cpu_usage_stable 
WHERE region = 'us-east' 
AND ts >= NOW - 1h 
GROUP BY host, INTERVAL(5m);

存储引擎

TDengine 的存储引擎针对时序数据做了深度优化:

  • 列式存储:同类数据压缩效果好
  • 时间分区:按时间范围划分数据文件
  • 智能压缩:根据数据类型选择最优压缩算法
  • 预聚合:支持自动预聚合,加速查询

时序数据处理模式

时序数据有几种常见的处理模式,需要根据业务场景选择合适的方案。

模式一:写入后立即查询

场景:实时监控、实时告警

方案

  • 直接写入时序数据库
  • 查询最新数据,触发告警

示例

SELECT LAST(value) FROM cpu_usage WHERE host = 'server01';

模式二:写入后批量处理

场景:数据分析、报表生成

方案

  • 写入时序数据库
  • 定期批量查询,生成报表

示例

SELECT MEAN(value), MAX(value), MIN(value) 
FROM cpu_usage 
WHERE host = 'server01' 
AND ts >= '2024-01-01' 
AND ts < '2024-01-02' 
GROUP BY INTERVAL(1h);

模式三:流式处理

场景:实时计算、异常检测

方案

  • 写入消息队列(Kafka)
  • 流计算引擎(Flink)处理
  • 结果写入时序数据库

示例(Flink SQL):

INSERT INTO cpu_anomaly 
SELECT host, ts, value 
FROM cpu_stream 
WHERE value > 90;

模式四:冷热分离

场景:大量历史数据,查询频率低

方案

  • 热数据:存储在高性能存储(SSD)
  • 冷数据:存储在低成本存储(HDD、对象存储)
  • 查询时自动路由

项目判断清单

  • 需要存储监控指标 → 时序数据库
  • 需要存储物联网传感器数据 → 时序数据库
  • 需要存储日志数据 → 时序数据库或 ClickHouse
  • 需要高性能写入(百万级/秒)→ TDengine
  • 需要 SQL 兼容性 → TDengine
  • 需要生态成熟度 → InfluxDB
  • 需要分布式部署 → InfluxDB Enterprise 或 TDengine
  • 需要实时流计算 → TDengine 或 Flink + 时序数据库