数据库08:时序数据库
从时间序列数据特征、InfluxDB 架构、TDengine 高性能设计到时序数据处理模式,理解时序数据库在监控、物联网和日志场景下的应用。
时序数据库(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 的核心存储引擎,专为时序数据设计:
-
写入流程:
- 先写入 WAL(Write-Ahead Log)
- 再写入内存中的 Cache
- Cache 达到阈值后,写入 TSM 文件
-
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 + 时序数据库