时序数据库作为处理时间序列数据的专业数据库系统,其存储引擎的设计直接决定了数据写入性能、查询效率和存储成本。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会:
- 合并多个小文件,减少文件句柄开销
- 清理被删除的数据(基于tomb文件)
- 重新压缩数据,提高压缩率
- 更新索引,优化查询性能
五、数据压缩:差值编码与通用压缩结合
时序数据的压缩是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时序数据库的存储引擎通过精心设计的架构,实现了高吞吐写入、高效查询和极致压缩的完美结合。其核心设计亮点包括:
- 灵活的行列编码:Tuple编码适合密集数据,Key-Value编码适合稀疏数据
- 三层存储分离:WAL保证持久性,TDB管理元数据,TSDB处理时序数据
- LSM树优化:红黑树+SkipList的MemTable设计,多层级Compaction策略
- 极致压缩:差值编码结合通用压缩算法,压缩率可达10%以内
对于需要处理海量时序数据的物联网、工业互联网、金融监控等场景,TDengine的存储引擎提供了业界领先的性能表现和存储效率。无论是每秒数百万点的写入吞吐,还是PB级数据的存储管理,TDengine都能提供稳定可靠的技术支撑。
关于TDengine:TDengine是由涛思数据开发的开源时序数据库,专为物联网、工业互联网、车联网等场景设计,具有高性能、高压缩率、易扩展等特点。了解更多信息,请访问TDengine官网。
























