时序数据库基础:TSDB核心概念与关系型数据库对比

大家好,我是你们的运维架构师。今天咱们聊聊时序数据库的基础。

说实话,我刚开始接触时序数据库时,也犯过迷糊。那时候公司日志量暴涨,MySQL 扛不住了,我才被迫去研究 TSDB。结果发现,这东西跟关系型数据库完全是两码事。

好,咱们直接进入正题。

一、TSDB 三大核心概念

时序数据库,说白了就是为时间序列数据量身定做的存储引擎。它有三个最核心的概念:时间线数据点保留策略

1. 时间线(Time Series / Metric)

什么是时间线?我习惯这么理解:一个唯一标识的指标,随时间变化产生的数据流

举个例子,你监控一台服务器的 CPU 使用率。这台服务器的 IP 是 10.0.0.1,指标名是 cpu_usage。那么 cpu_usage{host="10.0.0.1"} 就是一条时间线。

每条时间线由两部分组成:

  • Metric(指标名):比如 cpu_usagememory_used
  • Tags/Labels(标签):比如 hostregionservice

标签的作用是区分不同的数据源。你想想看,如果只有指标名,那所有服务器的 CPU 数据就混在一起了,根本没法查。

关键点:时间线的数量决定了 TSDB 的规模。我见过一个客户,他们的时间线数量从 10 万涨到 100 万,查询性能直接掉了 80%。所以,设计标签时要克制,别滥用。

2. 数据点(Data Point)

数据点就是时间线上的一次采样。它包含三个要素:

  • 时间戳:精确到毫秒或纳秒
  • :可以是浮点数、整数、字符串等
  • 标签:继承自所属的时间线

比如:

{
  "metric": "cpu_usage",
  "timestamp": 1710000000000,
  "value": 78.5,
  "tags": {
    "host": "10.0.0.1",
    "region": "cn-beijing"
  }
}

嗯,这里要注意:时间戳必须是单调递增的。我在项目中遇到过,有人把时间戳写错了顺序,结果查询时数据乱成一锅粥。后来我们加了校验,才解决这个问题。

3. 保留策略(Retention Policy)

保留策略决定了数据存多久、怎么存。说白了就是:旧数据要不要删?要不要降采样?

常见的保留策略有三种:

策略类型 说明 典型配置
原始数据保留 全量保存原始数据 7 天
降采样保留 聚合后保存(如 1 分钟 -> 1 小时) 30 天
全量删除 超过期限直接删除 90 天

我的经验:保留策略不是越久越好。我曾经帮一个客户优化,他们保留了 3 年的原始数据,结果磁盘爆了,查询也慢。后来我们改成:原始数据 7 天,降采样 1 年,全量删除 3 年。性能提升了 5 倍。

二、TSDB 与关系型数据库的对比

很多人问我:为什么不用 MySQL 存时序数据?

我直接说结论:能存,但不好用。咱们来对比一下。

1. 数据模型

维度 关系型数据库 时序数据库
核心实体 表、行、列 时间线、数据点
主键 自增 ID 或业务主键 时间戳 + 标签组合
索引方式 B+ 树 倒排索引 + LSM-Tree
写入模式 随机写入 顺序写入

你想想看,MySQL 的 B+ 树索引,写入一条数据就要更新索引。如果每秒写入 10 万条时序数据,MySQL 的索引更新会直接把磁盘 IO 打满。而 TSDB 用 LSM-Tree,写入是顺序的,性能高得多。

2. 查询能力

关系型数据库擅长的是:点查询关联查询

时序数据库擅长的是:范围查询聚合查询

举个例子:

  • MySQL 擅长:查某个用户最近 10 条订单
  • TSDB 擅长:查所有服务器过去 1 小时的 CPU 平均值

为什么会这样?因为 TSDB 的存储结构是按时间分片的。数据按时间顺序排列,范围查询时只需要扫描连续的数据块,不需要全表扫描。

避坑指南:我曾经用 MySQL 存过监控数据,写了个 SQL 查过去 24 小时的平均值。结果跑了 30 秒才出结果。换成 InfluxDB 后,同样的查询 0.5 秒就搞定了。这就是设计理念的差距。

3. 存储效率

时序数据有个特点:重复率高。比如标签 host="10.0.0.1",在 100 万条数据里可能重复了 100 万次。

关系型数据库会原样存储这些字符串,浪费空间。而 TSDB 会做编码压缩:

  • 字典编码:把重复的字符串映射成整数
  • 差值编码:时间戳只存差值,不存绝对值
  • 浮点压缩:用 Gorilla 算法压缩浮点数

我实测过,同样的数据量,MySQL 占用 100GB,TSDB 只需要 10GB 左右。压缩比能达到 10:1 甚至更高。

4. 写入性能

这是 TSDB 的绝对优势。关系型数据库为了支持事务,写入时要做很多额外工作:

  • 写 WAL 日志
  • 更新 B+ 树索引
  • 维护 MVCC 版本链

而 TSDB 的写入流程简单得多:

  1. 数据先写入内存中的 MemTable
  2. MemTable 满了后,刷到磁盘上的 SSTable
  3. 后台异步合并 SSTable

说白了,TSDB 牺牲了事务能力,换来了极致的写入性能。我见过单机 TSDB 每秒写入 50 万数据点,而 MySQL 到 1 万就开始报警了。

三、核心逻辑图

下面这张图,是我自己画的 TSDB 核心逻辑。你看一眼就能明白整体架构。

TSDB 核心逻辑架构 数据源 写入层 (MemTable) 存储层 (SSTable) 查询层 核心概念:时间线 (Metric + Tags) → 数据点 (Timestamp + Value) → 保留策略 时间线 cpu_usage{host="A"} memory_used{host="B"} 数据点 时间戳: 1710000000 值: 78.5 保留策略 原始数据: 7天 降采样: 30天 对比关系型数据库:写入快 10x、存储省 10x、范围查询快 100x

四、总结

好了,咱们把核心内容捋一遍:

  • 时间线:唯一标识的指标流,由 Metric + Tags 组成
  • 数据点:时间线上的单次采样,包含时间戳和值
  • 保留策略:控制数据生命周期,包括原始保留、降采样、删除
  • 与关系型数据库对比:TSDB 在写入、存储、范围查询上全面碾压,但牺牲了事务和关联查询能力

我个人习惯,选型时先看时间线数量。如果少于 10 万条,用 MySQL 也能凑合。但如果超过 50 万条,或者写入量超过每秒 1 万点,那就必须上 TSDB 了。

嗯,今天就聊到这儿。下一节咱们会深入讲讲常见的 TSDB 产品选型对比,到时候我会分享一些踩坑经历。


专注资料整理