TDengine时序数据库存储引擎原理与LSM树优化实践

尔悦

2026-05-28 /

时序数据库作为处理时间序列数据的专业数据库系统,其存储引擎的设计直接决定了数据写入性能、查询效率和存储成本。TDengine作为一款专为物联网、工业互联网场景设计的时序数据库,其存储引擎针对时序数据的特性进行了深度优化,实现了高吞吐写入、高效查询和极致压缩率。本文将深入剖析TDengine存储引擎的核心原理,包括行列格式编码、vnode存储架构、LSM树实现以及数据压缩技术。

一、存储引擎核心竞争力:专为时序数据量身定制

时序数据具有时间戳递增、数据量大、写入频率高、查询以时间范围为主等显著特征。传统关系型数据库的存储引擎难以高效处理这类数据,而TDengine存储引擎从设计之初就充分考虑了时序数据的这些特性。

TDengine存储引擎的核心优势体现在以下几个方面:

  • 高并发写入优化:针对物联网场景海量设备并发写入的特点,设计了高效的写入路径
  • 时间范围查询优化:利用数据的时间有序性,实现快速的时间范围过滤
  • 极致压缩能力:通过差值编码和专用压缩算法,将存储空间降低至原始数据的10%以内
  • 水平扩展能力:通过vnode机制实现数据的自动分片和负载均衡

二、行列格式编码:灵活应对不同数据特征

TDengine支持两种数据编码格式,以适应不同类型的时序数据:

2.1 Tuple编码:非稀疏数据的高效存储

Tuple编码适用于数据密集、非稀疏的场景,其核心特点是:

  • O(1)时间复杂度访问:通过行号直接定位数据位置
  • 连续存储:数据在磁盘上连续存放,有利于顺序读取
  • 空间效率高:无需额外的索引结构
-- 创建使用Tuple编码的表
CREATE TABLE device_data (
    ts TIMESTAMP,
    temperature FLOAT,
    humidity FLOAT,
    pressure FLOAT
) ENCODE = 'tuple';

在Tuple编码模式下,每一列的数据按行顺序连续存储。当查询某一行数据时,存储引擎可以通过简单的偏移量计算直接定位到数据位置,无需遍历索引。

2.2 Key-Value编码:稀疏数据的灵活方案

对于稀疏数据(即存在大量NULL值的场景),TDengine提供Key-Value编码:

  • offset数组索引:通过偏移量数组记录每行数据的实际位置
  • 灵活的空间分配:只为实际存在的数据分配存储空间
  • 适合异构设备:不同设备上报的字段不一致时尤为有效
-- 创建使用Key-Value编码的表(适合稀疏数据)
CREATE TABLE sparse_device (
    ts TIMESTAMP,
    sensor_a FLOAT,
    sensor_b FLOAT,
    sensor_c FLOAT,
    sensor_d FLOAT
) ENCODE = 'kv';

Key-Value编码通过维护一个offset数组来实现快速查找。虽然访问需要一次额外的索引查找,但对于稀疏数据场景,节省的存储空间远超索引开销。

三、vnode存储架构:三层分离设计

TDengine采用vnode(虚拟节点)作为数据分片和管理的基本单元。每个vnode的存储架构分为三个独立部分:

3.1 WAL(Write Ahead Log)

WAL是TDengine保证数据持久性的核心机制:

  • 顺序写入:所有数据变更首先追加写入WAL
  • 崩溃恢复:系统重启时通过重放WAL恢复数据
  • 异步刷盘:WAL写入成功后即可返回客户端,数据异步写入数据文件
vnode目录结构示例:
/vnode/vnodeX/
├── wal/              # WAL文件目录
│   ├── 000000001.wal
│   ├── 000000002.wal
│   └── ...
├── meta/             # 元数据存储目录
│   └── tdb/          # TDB引擎数据
└── tsdb/             # 时序数据存储目录
    ├── data/         # 数据文件
    ├── head/         # 索引文件
    └── sma/          # 预聚合数据

3.2 元数据存储(TDB引擎)

元数据采用B+Tree结构的TDB引擎存储:

  • 适合读多写少:B+Tree在读取场景下性能优异
  • 范围查询高效:支持表名、标签的范围扫描
  • 事务支持:保证元数据操作的原子性

元数据包括超级表定义、子表信息、标签数据等,这类数据的特点是写入频率低但查询频繁,B+Tree结构正好契合这一访问模式。

3.3 时序数据存储(TSDB引擎)

时序数据采用专门的TSDB引擎,基于LSM树结构实现,这是TDengine存储引擎的核心。

四、时序数据存储:LSM树结构深度解析

TDengine的TSDB引擎采用LSM(Log-Structured Merge)树架构,这是业界处理高并发写入的标准方案。

4.1 MemTable:内存中的有序结构

MemTable是数据写入的第一站,TDengine采用双数据结构实现:

红黑树(Red-Black Tree)

  • 用于维护数据的唯一性和有序性
  • 保证O(log n)的插入和查找复杂度
  • 自动处理同一时间戳的数据去重

SkipList(跳表)

  • 用于高效的范围查询
  • 支持多层级索引,查询复杂度O(log n)
  • 实现简单,并发性能优异
// MemTable结构示意
typedef struct SMemTable {
    SRBTree  rbtree;      // 红黑树:去重和排序
    SSkipList *skiplist;  // 跳表:范围查询
    int64_t  size;        // 当前数据大小
    int64_t  maxSize;     // 刷盘阈值
} SMemTable;

当MemTable达到预设大小阈值时,会被冻结并转换为不可变的IMemTable,随后后台线程将其刷写到磁盘。

4.2 数据文件组:分层存储的实现

TDengine将磁盘数据组织为文件组(File Group),每个文件组包含以下文件:

文件类型扩展名功能说明
Head文件.head存储数据块的索引信息,用于快速定位
Data文件.data存储实际的时序数据,按列压缩存储
SMA文件.sma存储预聚合数据(Simple Moving Average)
Tomb文件.tomb存储删除标记,支持数据软删除
STT文件.stt存储小文件合并的临时数据
文件组结构示例:
v2f1800.head    # 版本2,文件组1800的索引
v2f1800.data    # 版本2,文件组1800的数据
v2f1800.sma     # 版本2,文件组1800的预聚合
v2f1800.tomb    # 版本2,文件组1800的删除标记
v2f1800.stt     # 版本2,文件组1800的临时数据

4.3 Compaction:数据整理与优化

LSM树的核心机制是Compaction(合并),TDengine实现了多层级合并策略:

  • Level 0:MemTable刷盘产生的新文件
  • Level 1-N:随着合并层级增加,文件越来越大
  • Tiered Compaction:按时间分层,旧数据合并为大文件
  • Leveled Compaction:按大小分层,同层文件大小相近

Compaction过程中,TDengine会:

  1. 合并多个小文件,减少文件句柄开销
  2. 清理被删除的数据(基于tomb文件)
  3. 重新压缩数据,提高压缩率
  4. 更新索引,优化查询性能

五、数据压缩:差值编码与通用压缩结合

时序数据的压缩是TDengine存储引擎的一大亮点,通过多级压缩策略实现极致的压缩率。

5.1 差值编码(Delta Encoding)

针对时间戳列,TDengine采用差值编码:

原始时间戳:    1000, 1010, 1020, 1030, 1040, 1050
差值编码后:    1000, 10, 10, 10, 10, 10

由于时序数据的时间戳通常是等间隔或近似等间隔的,差值编码可以将大整数转换为小整数,大幅降低存储空间。

5.2 通用压缩算法

在差值编码基础上,TDengine支持多种通用压缩算法:

  • LZ4:压缩和解压速度快,适合CPU敏感场景
  • ZSTD:压缩率更高,适合存储成本敏感场景
  • XZ:极致压缩率,适合冷数据归档
-- 创建表时指定压缩算法
CREATE TABLE metrics (
    ts TIMESTAMP,
    value DOUBLE
) COMPRESS = 'zstd';

5.3 压缩效果

通过差值编码与通用压缩的结合,TDengine在实际生产环境中通常能达到:

  • 时间戳列:压缩率可达5%以下
  • 数值列:根据数据特征,压缩率10%-30%
  • 整体压缩率:典型场景下可达原始数据的10%以内

六、总结

TDengine时序数据库的存储引擎通过精心设计的架构,实现了高吞吐写入、高效查询和极致压缩的完美结合。其核心设计亮点包括:

  1. 灵活的行列编码:Tuple编码适合密集数据,Key-Value编码适合稀疏数据
  2. 三层存储分离:WAL保证持久性,TDB管理元数据,TSDB处理时序数据
  3. LSM树优化:红黑树+SkipList的MemTable设计,多层级Compaction策略
  4. 极致压缩:差值编码结合通用压缩算法,压缩率可达10%以内

对于需要处理海量时序数据的物联网、工业互联网、金融监控等场景,TDengine的存储引擎提供了业界领先的性能表现和存储效率。无论是每秒数百万点的写入吞吐,还是PB级数据的存储管理,TDengine都能提供稳定可靠的技术支撑。


关于TDengine:TDengine是由涛思数据开发的开源时序数据库,专为物联网、工业互联网、车联网等场景设计,具有高性能、高压缩率、易扩展等特点。了解更多信息,请访问TDengine官网