在物联网(IoT)、可观测性(Observability)、金融行情、工业监控等场景中,系统每秒产生数百万甚至上亿条带时间戳的数据点。传统关系型数据库(如 MySQL)或 NoSQL(如 MongoDB)在处理这类数据时面临三大瓶颈:
- 写入性能差:高并发写入导致锁竞争、I/O 瓶颈
- 存储成本高:未针对时间序列优化,压缩率低
- 查询效率低:无法高效支持时间窗口聚合、降采样、滑动窗口等操作
时序数据库(Time Series Database, TSDB) 应运而生------它是专为时间序列数据 设计的高性能数据库,核心目标是:高吞吐写入 + 高效时间范围查询 + 低成本存储。
一、什么是时序数据?核心特征是什么?
✅ 定义
时序数据(Time Series Data)是按时间顺序记录的一系列数据点,每个点包含:
- 时间戳(Timestamp):精确到毫秒/微秒
- 指标值(Value):数值(整数/浮点)、状态(布尔)、或结构化数据
- 元数据(Tags/Labels) :用于标识和分类(如
host=web-01,region=us-east)
🌰 示例
cpu_usage{host="web-01", region="us-east"} 0.75 @1705812345000
temperature{sensor="s-101", factory="F2"} 23.4 @1705812346000
stock_price{symbol="AAPL"} 192.34 @1705812347000
🔑 核心特征
| 特征 | 说明 |
|---|---|
| 写多读少 | 95%+ 操作是写入,查询集中在近期数据 |
| 时间有序 | 数据天然按时间排序,极少更新历史点 |
| 高基数(High Cardinality) | Tags 组合爆炸(如 10k 主机 × 100 指标 = 1M 时间序列) |
| 冷热分离 | 近期数据高频访问,历史数据低频但需长期保留 |
二、主流时序数据库对比(2026)
| 数据库 | 开源 | 存储模型 | 写入性能 | 查询语言 | 云原生 | 典型场景 |
|---|---|---|---|---|---|---|
| InfluxDB | ✅ (OSS) | 自研 TSM/TSM2 | ⭐️⭐️⭐️⭐️ | Flux / InfluxQL | ✅ | IoT、DevOps |
| Prometheus | ✅ | 自研 TSDB | ⭐️⭐️⭐️ | PromQL | ✅✅✅ | Kubernetes 监控 |
| TimescaleDB | ✅ | PostgreSQL 扩展 | ⭐️⭐️⭐️ | SQL | ✅ | 金融、分析型 |
| VictoriaMetrics | ✅ | 自研 | ⭐️⭐️⭐️⭐️⭐️ | PromQL | ✅ | 替代 Prometheus |
| TDengine | ✅ | 自研(列式+分片) | ⭐️⭐️⭐️⭐️⭐️ | SQL-like | ✅ | 工业 IoT、车联网 |
| Apache IoTDB | ✅ | 列式 | ⭐️⭐️⭐️⭐️ | SQL | ✅ | 工业设备监控 |
💡 注:本文重点介绍 InfluxDB、Prometheus、VictoriaMetrics、TDengine 四款代表产品。
三、核心架构原理:TSDB 如何实现高性能?
1. 写入优化
- WAL(Write-Ahead Log):先写日志保证 durability
- 内存缓冲(MemTable):批量刷盘减少 I/O
- 无索引写入:避免 B-Tree 更新开销
2. 存储优化
- 列式存储:相同字段连续存储,提升压缩率
- 时间分区(Time Partitioning):按天/周分块,快速淘汰旧数据
- 高效压缩算法:Delta-of-Delta、Gorilla、RLE 等
3. 查询优化
- 倒排索引(Tag Index):快速过滤时间序列
- 预聚合(Downsampling):自动降采样(如 1s → 1m)
- 向量化执行:SIMD 加速数值计算
四、四大主流 TSDB 详解与示例
1. InfluxDB:专为时序而生的数据库
📌 特点
- 数据模型:Measurement(表) + Tags(索引) + Fields(值) + Timestamp
- 存储引擎:TSM(Time-Structured Merge Tree),类似 LSM-Tree
- 查询语言:InfluxQL(类 SQL)、Flux(函数式)
🧪 写入示例(Line Protocol)
# 格式: measurement,tags fields timestamp
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary '
cpu,host=server01,region=us-west usage_idle=95.3,usage_user=4.7 1705812345000000000
cpu,host=server02,region=us-east usage_idle=88.1,usage_user=11.9 1705812346000000000
'
🔍 查询示例(InfluxQL)
-- 查询最近1小时 CPU 使用率 > 90%
SELECT mean("usage_user")
FROM "cpu"
WHERE time > now() - 1h AND "usage_user" > 90
GROUP BY time(1m), "host"
✅ 适用场景
- DevOps 监控(配合 Telegraf)
- IoT 设备数据采集
- 实时仪表盘
2. Prometheus:云原生监控的事实标准
📌 特点
- Pull 模型 :主动从目标拉取
/metrics - 多维数据模型:Metric Name + Labels
- 强大 PromQL:支持聚合、预测、直方图分位数
🧪 数据格式(文本暴露)
# HELP http_requests_total Total HTTP requests
# TYPE http_requests_total counter
http_requests_total{method="POST", status="200"} 12345
http_requests_total{method="GET", status="200"} 67890
🔍 查询示例(PromQL)
# 计算 HTTP 错误率(5xx)
rate(http_requests_total{status=~"5.."}[5m])
/
rate(http_requests_total[5m])
✅ 适用场景
- Kubernetes 集群监控
- 微服务指标采集
- SLO/SLI 计算
⚠️ 注意:Prometheus 不是通用 TSDB,不支持高基数标签、长期存储需扩展(Thanos/VictoriaMetrics)。
3. VictoriaMetrics:高性能 Prometheus 替代品
📌 特点
- 100% PromQL 兼容
- 超高性能:单节点支持 10M+ samples/sec
- 存储高效:比 Prometheus 节省 7x 存储空间
- 支持多种协议:Prometheus Remote Write、Influx Line Protocol、Graphite
🧪 写入示例(Remote Write)
# prometheus.yml
remote_write:
- url: "http://victoriametrics:8428/api/v1/write"
🔍 查询示例(与 Prometheus 相同)
# 查询 P99 延迟
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
✅ 适用场景
- 替代 Prometheus 处理海量指标
- 多集群统一监控
- 成本敏感型长期存储
4. TDengine:国产高性能时序数据库
📌 特点
- 一个设备一张表:自动分片,消除高基数问题
- SQL 支持:兼容 MySQL 协议
- 内置流计算:连续查询(Continuous Query)
- 超强压缩:平均压缩比 1:10+
🧪 写入示例(SQL)
-- 创建超级表(模板)
CREATE STABLE devices (ts TIMESTAMP, temperature FLOAT, humidity INT)
TAGS (device_id BINARY(20), location BINARY(20));
-- 创建子表(具体设备)
CREATE TABLE device_001 USING devices TAGS ('001', 'factory_A');
-- 写入数据
INSERT INTO device_001 VALUES ('2026-01-21 14:00:00', 23.5, 65);
🔍 查询示例(SQL)
-- 查询所有设备过去1小时平均温度
SELECT AVG(temperature)
FROM devices
WHERE ts >= NOW - 1h
INTERVAL(10m);
✅ 适用场景
- 工业物联网(PLC、传感器)
- 车联网(每辆车独立表)
- 电力、能源监控
五、选型建议:如何选择合适的 TSDB?
| 需求 | 推荐方案 |
|---|---|
| Kubernetes 监控 | Prometheus + VictoriaMetrics(长期存储) |
| IoT 设备监控(百万级) | TDengine 或 InfluxDB |
| 需要 SQL 查询能力 | TimescaleDB 或 TDengine |
| 超低成本长期存储 | VictoriaMetrics 或 Mimir |
| 已有 PostgreSQL 生态 | TimescaleDB |
| 国产化要求 | TDengine、Apache IoTDB |
六、最佳实践与避坑指南
✅ 写入优化
- 批量写入:避免单点写入,使用 batch(InfluxDB ≥ 5k points/batch)
- 合理设计 Tags :只将高基数、需过滤的字段设为 Tag
- 避免高基数:不要用 UUID、用户 ID 作为 Tag
✅ 查询优化
- 限制时间范围 :永远加上
WHERE time > ... - 预聚合:对历史数据做 downsampling(如 1s → 1h)
- 使用索引:确保常用过滤字段有索引(InfluxDB 的 Tag、TDengine 的 TAG)
❌ 常见误区
- 用 TSDB 存日志(应使用 Loki/Elasticsearch)
- 在 Prometheus 中存储业务事件(应使用 Kafka + Flink)
- 忽略 retention policy(导致磁盘爆满)
记住:
- 监控场景 → 优先考虑 Prometheus 生态
- IoT/工业场景 → TDengine、InfluxDB 更合适
- 分析型需求 → TimescaleDB 提供 SQL 便利性
- 极致性能/成本 → VictoriaMetrics 是黑马