TDengine 整体架构深度解析:为什么如此快速高效?

在这里插入图片描述

概述

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);

为什么这么快?

  1. 顺序写入: 单表数据时间连续,写入是简单的追加操作,充分利用磁盘顺序 I/O
  2. 批量读取: 查询单表时可一次读取多条记录,减少磁盘寻道时间
  3. 标签分离: 标签数据与时序数据分离存储,避免重复存储,查询时先过滤标签再读数据

2.2 列式存储 + 多级压缩

列式存储结构:

表 meters:
时间列: [t1, t2, t3, ..., tn]
电流列: [c1, c2, c3, ..., cn]
电压列: [v1, v2, v3, ..., vn]

压缩策略:

  1. 一级压缩 (编码): 针对数据类型特征进行编码

    • 整数型: Delta-delta 编码 + Simple8B 编码
    • 浮点型: Delta-delta 编码
    • 时间戳: Delta 编码 (时序数据时间间隔规律)
    • 字符串: 字典压缩
  2. 二级压缩 (通用压缩): 在一级压缩基础上使用 LZ4/ZSTD/ZLIB 等算法

  3. 有损压缩 (可选): 对浮点数采用 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;

执行流程:

  1. 在 vnode 的元数据中查找标签匹配的表 (毫秒级)
  2. 只读取这些表的数据块
  3. 大幅减少扫描数据量

四、高效数据写入

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 如此快速高效?

核心设计理念

  1. 专为时序数据优化

    • 充分利用时间顺序特性
    • 针对数据特征的压缩算法
    • 写多读少的访问模式优化
  2. 创新存储引擎

    • 列式存储 + 多级压缩
    • LSM 结构 + 时间分区
    • 写驱动缓存管理
  3. 分布式架构优势

    • 存算分离
    • 数据分片并行
    • 智能路由和缓存
  4. 全栈优化

    • 从驱动到存储引擎端到端优化
    • 减少数据拷贝和序列化开销
    • 充分利用硬件特性

适用场景

  • 物联网: 海量传感器数据采集
  • 工业互联网: 设备监控和预测性维护
  • 车联网: 车辆实时数据分析
  • IT 运维: 系统监控和日志分析
  • 金融: 高频交易数据存储

TDengine 通过深度定制化的时序数据处理方案,在保证高可用和高可靠的前提下,实现了卓越的性能表现,真正做到了简单、高效、强大


关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TDengine (老段)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值