
概述
TDengine 是一款专为时序数据场景设计的开源、高性能、云原生时序数据库。与通用数据库相比,其写入和查询性能快 10 倍以上,存储空间仅为通用数据库的 1/10。本文将深入剖析 TDengine 的整体架构,揭示其卓越性能背后的技术奥秘。
一、分布式架构设计
1.1 核心逻辑单元
TDengine 采用分层的分布式架构,主要包含以下逻辑单元:
应用层 (Application)
↓
驱动层 (taosc)
↓
集群层 (Cluster)
├── 管理节点 (mnode) - 元数据管理
├── 数据节点 (dnode) - 数据存储和计算
│ ├── 虚拟节点 (vnode) - 数据分片单元
│ ├── 计算节点 (qnode) - 查询计算
│ └── 流计算节点 (snode) - 流式处理
└── 物理节点 (pnode) - 物理服务器
为什么这样设计?
- 职责分离: mnode 负责元数据管理,vnode 负责数据存储,qnode/snode 负责计算,实现了存储与计算分离
- 水平扩展: 通过增加 dnode 即可线性扩展集群能力
- 高可用性: 支持多副本机制(基于 Raft 协议),保证数据可靠性
1.2 虚拟节点组 (VGroup)
TDengine 引入 vgroup 概念,将多个 vnode 组成一个虚拟节点组:
- 一个 vgroup 包含 N 个 vnode (N 为副本数)
- 采用 Raft 一致性协议保证数据一致性
- Leader vnode 处理写入,Follower vnode 同步数据
性能优势:
- 数据分片降低单节点压力
- 副本机制保证高可用而不牺牲性能
- 流水线复制算法提升写入吞吐量
二、创新存储引擎
2.1 "一表一采集点"模型
TDengine 采用独特的数据模型:一个数据采集点对应一张表
CREATE STABLE meters (
ts TIMESTAMP,
current FLOAT,
voltage INT
) TAGS (location BINARY(64), groupId INT);
-- 每个电表是一个子表
CREATE TABLE d1001 USING meters TAGS ('Beijing', 1);
CREATE TABLE d1002 USING meters TAGS ('Shanghai', 2);
为什么这么快?
- 顺序写入: 单表数据时间连续,写入是简单的追加操作,充分利用磁盘顺序 I/O
- 批量读取: 查询单表时可一次读取多条记录,减少磁盘寻道时间
- 标签分离: 标签数据与时序数据分离存储,避免重复存储,查询时先过滤标签再读数据
2.2 列式存储 + 多级压缩
列式存储结构:
表 meters:
时间列: [t1, t2, t3, ..., tn]
电流列: [c1, c2, c3, ..., cn]
电压列: [v1, v2, v3, ..., vn]
压缩策略:
-
一级压缩 (编码): 针对数据类型特征进行编码
- 整数型: Delta-delta 编码 + Simple8B 编码
- 浮点型: Delta-delta 编码
- 时间戳: Delta 编码 (时序数据时间间隔规律)
- 字符串: 字典压缩
-
二级压缩 (通用压缩): 在一级压缩基础上使用 LZ4/ZSTD/ZLIB 等算法
-
有损压缩 (可选): 对浮点数采用 TSZ 预测模型算法
压缩效果:
- 稳定时序数据压缩率可达 10:1 甚至更高
- 显著降低存储成本和 I/O 开销
2.3 时间驱动的缓存管理
TDengine 采用写驱动缓存而非传统的读驱动缓存:
[内存 Buffer (3块)]
↓ 1/3 满时触发落盘
[WAL 日志]
↓
[持久化存储]
优势:
- 最新数据优先缓存,符合物联网查询最新数据的特点
- 写入性能优化,顺序追加到内存
- 可当作实时数据缓存使用,无需额外部署 Redis
2.4 LSM 存储结构
写入流程:
数据 → MemTable (内存)
↓ (写满触发)
WAL (预写日志)
↓
STT 文件 (小文件)
↓ (后台合并)
Data 文件 (大文件)
- 使用 Red-Black Tree + SkipList 索引加速查询
- 后台合并优化存储空间和查询性能
- 避免 B+Tree 在海量数据下性能衰减
2.5 按时间分区
/var/lib/taos/vnode2/
├── v2f1.data (2024-01-01 ~ 2024-01-10)
├── v2f1.head
├── v2f2.data (2024-01-11 ~ 2024-01-20)
├── v2f2.head
└── ...
性能优势:
- 查询时快速定位时间段对应的数据文件,无需索引
- 过期数据自动删除,管理简单
- 支持多级存储,热数据 SSD,冷数据 HDD
三、智能查询优化
3.1 预计算机制
数据文件块头部存储统计信息:
struct DataBlockHeader {
TSKEY minTime; // 最小时间戳
TSKEY maxTime; // 最大时间戳
double minValue; // 最小值
double maxValue; // 最大值
double sum; // 总和
int count; // 记录数
};
查询加速:
-- 这类查询可直接使用预计算值,无需扫描数据块
SELECT MAX(voltage), MIN(voltage), AVG(current)
FROM meters
WHERE ts > '2024-01-01' AND ts < '2024-01-10';
3.2 存算分离架构
客户端请求
↓
taosc (缓存元数据)
↓
mnode (获取路由信息)
↓
qnode (执行计算) ← 从 vnode 读取数据
↓
返回结果
- qnode 专门处理计算任务,vnode 专注存储
- 多个 qnode 并行处理,充分利用 CPU 资源
- taosc 缓存元数据,减少 mnode 访问压力
3.3 超级表标签过滤
-- 先过滤标签,只查找符合条件的子表
SELECT AVG(current) FROM meters
WHERE location = 'Beijing' AND groupId = 1
GROUP BY tbname;
执行流程:
- 在 vnode 的元数据中查找标签匹配的表 (毫秒级)
- 只读取这些表的数据块
- 大幅减少扫描数据量
四、高效数据写入
4.1 写入流程
应用
↓ INSERT 请求
taosc (定位 leader vnode)
↓
Leader vnode
├→ 写 WAL 日志 (持久化)
├→ 写内存 SkipList (快速)
└→ 转发给 Follower vnodes (异步)
↓
达成半数一致 → 返回成功
性能保障:
- WAL 顺序写入,速度快
- 内存写入后立即返回,延迟低
- 流水线复制允许多个写入请求并行处理
4.2 批量写入优化
TDengine 支持高效批量写入:
// 源码示例: tsdbWrite.c
int tsdbInsertData(STsdb *pTsdb, int64_t version,
SSubmitReq2 *pMsg, SSubmitRsp2 *pRsp) {
// 批量扫描和转换
tsdbScanAndConvertSubmitMsg(pTsdb, pMsg);
// 批量插入
for (int32_t i = 0; i < arrSize; ++i) {
tsdbInsertTableData(pTsdb, version,
taosArrayGet(pMsg->aSubmitTbData, i),
&affectedrows);
}
}
- 一次提交多张表的多条记录
- 减少网络往返和系统调用
- 测试可达 300 万写入点/秒
五、轻量级客户端驱动
5.1 taosc 智能缓存
taosc 缓存内容:
├── vgroup 路由信息 (表 → vnode 映射)
├── 表 schema 信息
└── leader vnode 位置
优势:
- 首次访问后缓存,后续请求直达 vnode
- mnode 不成为瓶颈
- 自动重定向和故障恢复
5.2 请求流程优化
第一次查询:
App → taosc → mnode (获取元数据) → vnode (查询数据)
后续查询:
App → taosc (命中缓存) → vnode (查询数据)
- 减少 mnode 访问 90%+
- 查询延迟降低
六、企业级特性
6.1 多级存储
Level 0 (SSD): 最近 7 天数据
↓ 自动迁移
Level 1 (HDD): 8-90 天数据
↓ 自动迁移
Level 2 (归档): 90 天以上数据
- 自动冷热数据分离
- 降低存储成本 50%+
- 对应用透明
6.2 内置功能
- 缓存: last/last_row LRU 缓存
- 流计算: 内置流式处理引擎
- 消息队列: 数据订阅功能
- AI 智能体: TDgpt 时序数据分析
简化架构:
传统方案:
数据库 + Kafka + Redis + Spark + HBase
TDengine 方案:
TDengine (一体化平台)
七、性能数据对比
| 指标 | TDengine | 传统数据库 |
|---|---|---|
| 写入性能 | 10x+ | 1x |
| 查询性能 | 10x+ | 1x |
| 存储压缩率 | 10:1 | 无压缩 |
| 支持表数量 | 亿级 | 万级 |
| 高基数处理 | 优秀 | 困难 |
八、总结:为什么 TDengine 如此快速高效?
核心设计理念
-
专为时序数据优化
- 充分利用时间顺序特性
- 针对数据特征的压缩算法
- 写多读少的访问模式优化
-
创新存储引擎
- 列式存储 + 多级压缩
- LSM 结构 + 时间分区
- 写驱动缓存管理
-
分布式架构优势
- 存算分离
- 数据分片并行
- 智能路由和缓存
-
全栈优化
- 从驱动到存储引擎端到端优化
- 减少数据拷贝和序列化开销
- 充分利用硬件特性
适用场景
- 物联网: 海量传感器数据采集
- 工业互联网: 设备监控和预测性维护
- 车联网: 车辆实时数据分析
- IT 运维: 系统监控和日志分析
- 金融: 高频交易数据存储
TDengine 通过深度定制化的时序数据处理方案,在保证高可用和高可靠的前提下,实现了卓越的性能表现,真正做到了简单、高效、强大。
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

3391

被折叠的 条评论
为什么被折叠?



