时序数据库全景指南:从场景选型到内核拆解

发布于:2025-08-29 ⋅ 阅读:(18) ⋅ 点赞:(0)

1. 什么是时序数据

时序数据(Time-Series Data) 是在时间上连续产生、且带有时间戳的观测值序列,典型特征:

维度 描述
高并发写 百万点/秒,追加为主
写多读少 90 % 查询是降采样或聚合
时效性 越新越热,旧数据价值递减
多维标签 每条点带大量 tag(设备、区域、指标名)

示例:
cpu.usage{host=web01,region=bj} 2025-08-27 14:00:00 42.3


2. 时序数据库 vs 通用数据库

对比项 时序数据库 MySQL/PostgreSQL
存储模型 列式 + 时间分区 B+Tree 行存
写入方式 LSM 追加 随机写 + WAL
索引 倒排 + 时间线 B+Tree 复合索引
聚合算子 预计算、降采样 实时 GROUP BY
压缩比 5–15× 1–2×
单节点吞吐 200–500 万点/秒 1–5 万点/秒

3. 适用场景与真实案例

行业 场景 规模示例
物联网 工业传感器、车联网 某车企 2000 万车机 × 100 指标/秒
金融 股票 Tick、风控日志 某券商 2 亿条/日
DevOps K8s 监控、APM 某电商 50 万 Pod 指标/10 s
能源 光伏逆变器、电网 PMU 国家电网 60 TB/年
智慧城市 环境监测、灯杆数据 深圳 30 万设备/5 s

4. 产品地图

4.1 开源

名称 语言 特点
InfluxDB Go TSM 引擎,Flux 查询,集群版闭源
TimescaleDB C/PostgreSQL 扩展形式,SQL 完全兼容
VictoriaMetrics Go 单二进制、PromQL、S3 冷存
OpenTSDB Java 基于 HBase,PB 级
IoTDB Java 面向工业场景,树形元数据
TDengine C 超级表,边云同步

4.2 商业 & 云托管

  • AWS TimestreamAzure Data ExplorerGoogle Cloud Bigtable + MDS
  • InfluxDB CloudTimescale CloudKdb+(高频交易)

5. 核心功能清单

功能 说明 示例
高吞吐写入 HTTP/Line Protocol InfluxDB curl -XPOST /write
多维标签 任意键值对索引 cpu,host=web01,region=bj
降采样 自动 Rollup CREATE CONTINUOUS QUERY
数据保留策略 TTL + 分层 7 d 原始 / 1 y 5 min 均值
SQL & PromQL 多语言查询 SELECT mean(value) FROM cpu GROUP BY time(1m)
插值 & 外推 线性、前值填充 FILL(previous)
订阅 & 告警 Webhook、Kafka kapacitor / vmalert
数据压缩 Gorilla、Delta-of-Delta 1.2 byte/point
水平扩展 Sharding、Replication VictoriaMetrics VMCluster

6. 技术原理六层拆解

6.1 数据模型

┌---------┬-----------┬----------┐
│ timestamp  │  value(float/int) │  tags(map[string]string) │
└---------┴-----------┴----------┘
  • Series Key = measurement + tag set(字典序)
  • Point = Series Key + timestamp + value

6.2 写入路径

Client → Line Protocol → HTTP → WAL → MemTable → Immutable → SSTable(TSM/Chunk)
  • WAL 顺序写,刷盘前宕机可重放
  • MemTable 按 Series+Time 排序,刷盘后生成只读块

6.3 存储格式(以 InfluxDB TSM 为例)

┌-------┬--------┬--------┐
│ Header │ Index Block │ Data Block │
└-------┴--------┴--------┘
  • Index Block:Series → Offset 映射,二分查找
  • Data Block:列式存储,timestamp & value 分开压缩
    • 时间戳:Delta-Delta + RLE
    • float:XOR (Gorilla)
    • string:Snappy

6.4 倒排索引

  • Tag → SeriesID List(类似 ES)
  • 支持 AND / OR / NOT 组合
  • 内存结构:Roaring Bitmap 压缩
  • 持久化:TSI 文件,重启 mmap 恢复

6.5 查询执行

1. Parse → Logical Plan
2. 根据 time range 过滤 Chunk
3. 根据 tag 过滤 Series
4. 并行扫描 → 预聚合
5. Merge → 排序 → 返回
  • 预聚合(Continuous Aggregate)
    CREATE MATERIALIZED VIEW ... WITH (timescaledb.continuous)
    每 1 min 自动更新 1 min 均值,查询直接命中物化表。

6.6 压缩与降采样

  • Gorilla:1.37 byte/point(官方论文)
  • ZSTD:适合字符串 tag
  • 降级策略
    原始 1 s → 5 min 均值 → 1 h 均值 → 1 d 均值 → 归档 S3 → Glacier

7. 性能调优与最佳实践

维度 建议
模式设计 控制 tag 值基数 < 100 k,避免高基数 tag
数据保留 使用 RP + 分区表,历史数据 detach 到对象存储
写入 批量 5k–10k 点 / req,开启 gzip 压缩
查询 使用预聚合、避免 SELECT * 原始数据
资源 内存 ≥ 倒排索引大小,SSD 存放热数据
监控 Prometheus + Grafana:
  • influxdb_disk_bytes
  • vms_memory_usage
  • query_duration_seconds |

案例:某直播公司

  • 800 万 Series、200 万点/秒
  • 单机 InfluxDB → 改为 VictoriaMetrics Cluster(3 存储 + 2 插入 + 2 查询)
  • QPS ↑ 5×,磁盘 ↓ 60 %,P99 查询延迟从 2 s → 120 ms。

8. 未来趋势与总结

  1. Serverless + 对象存储:冷热分层到极致(Snowflake 模式)
  2. AI4DB:自适应压缩、索引推荐
  3. 流批一体:Flink + 时序库 → 实时降采样、异常检测
  4. 边缘协同:TDengine / IoTDB 边云同步,断网缓存
  5. 统一协议:OpenTelemetry、Arrow Flight SQL 成为事实标准

一句话总结

时序数据库用“顺序写、列式存、倒排索引、压缩算法、预聚合”五板斧,把“时间”这一维度变成了最大的性能红利;在 IoT、监控、金融等高并发场景,它是让“数据产生价值”的加速器,而不是简单的“又一个数据库”。


网站公告

今日签到

点亮在社区的每一天
去签到