Skip to content

时序数据库:为什么传统数据库不够用了?

想象一下这个场景:

你负责维护一个监控系统,需要记录全国 10 万台服务器的 CPU、内存、磁盘、网络等指标。每台服务器每秒上报一次数据,那就是 10 万条/秒 的写入速度,24 小时不间断。

一天下来,就是 86.4 亿条数据

用 MySQL 存?行数爆炸,查询慢,存储成本高。

用 MongoDB 存?时序聚合能力弱,存储效率低。

这就是时序数据库(Time Series Database,TSDB) 诞生的背景。


什么是时序数据?

时序数据是按时间顺序记录的数据点

时间戳                         值
─────────────────────────────────────────
2024-03-15 10:00:00           CPU: 45%
2024-03-15 10:00:01           CPU: 47%
2024-03-15 10:00:02           CPU: 46%
...

时序数据的特征

特征说明对传统数据库的影响
数据量大持续写入,永不停止行数爆炸
写入多,读取少主要是采集写入,定期查询写性能差
时间有序时间是主维度B-Tree 不最优
冷热分明最近数据热,历史数据冷无法分层存储
需要聚合经常需要按时间窗口聚合聚合函数弱
保留策略数据过期自动删除无生命周期管理

常见时序数据场景

1. 监控指标

服务器 CPU、内存、磁盘使用率
应用响应时间、QPS、错误率
网络流量、连接数

2. 传感器数据

工业设备温度、压力、振动
智能电表、水表、燃气表
车联网 GPS 轨迹、加速度

3. 金融数据

股票价格、交易量
用户行为日志

4. IoT 物联网

智能家居设备状态
农业大棚温湿度

时序数据库 vs 传统数据库

特性传统数据库时序数据库
写入模型随机读写追加写入为主
数据模式OLTP/OLAP专用于时序
压缩算法无特殊优化专有压缩
聚合能力强大
保留策略手动清理自动过期
查询语言SQL扩展 SQL
存储成本低 5-10 倍

主流时序数据库对比

数据库特点适用场景
InfluxDB最流行,功能完善监控、IoT
Prometheus监控告警为主云原生监控
TimescaleDBPostgreSQL 扩展需要 SQL 兼容性
TDengine国产,高性能物联网、车联网
OpenTSDBHBase 后端大规模数据
KairosDBCassandra 后端大规模数据

时序数据建模基础

时序数据库有独特的建模方式,理解这个是掌握 TSDB 的关键。

核心概念

┌────────────────────────────────────────────────────────┐
│                      Measurement(测量)                  │
│                    类似关系型数据库的「表」                  │
│                                                         │
│  ┌─────────────────────────────────────────────────┐    │
│  │                   Tags(标签)                    │    │
│  │  host=server01, region=us-east, role=web       │    │
│  │  用于过滤和分组,不随时间变化                       │    │
│  └─────────────────────────────────────────────────┘    │
│                                                         │
│  ┌─────────────────────────────────────────────────┐    │
│  │                   Fields(字段)                  │    │
│  │  cpu=45.2, memory=8192, disk=75               │    │
│  │  随时间变化的值                                  │    │
│  └─────────────────────────────────────────────────┘    │
│                                                         │
│  Time: 2024-03-15 10:00:00                             │
└────────────────────────────────────────────────────────┘

数据写入示例

java
// InfluxDB Line Protocol
// measurement,tag1=value1,tag2=value2 field1=value1,field2=value2 timestamp

server_metrics,host=server01,cpu=45.2,memory=8192 1709808000000000000

面试追问方向

  • 时序数据库为什么写入性能比传统数据库好?
  • 如何选择合适的时序数据库?

下一节,我们来对比主流时序数据库的优缺点。

基于 VitePress 构建