TDengine 简介

什么是 TDengine

TDengine 是由涛思数据(TAOS Data)开发的开源时序数据库,专为物联网(IoT)、工业互联网、IT 运维监控等时序数据场景设计,具备极高的写入性能和压缩比。

传感器 / 设备 / 服务器指标
        ↓
   [时序数据流]
        ↓
   TDengine
   ├── 超高速写入
   ├── 高效压缩存储
   ├── 快速聚合查询
   └── 实时流计算
        ↓
   可视化 / 告警 / 分析

核心概念

数据模型:超级表(STable)

TDengine 最重要的创新概念:

SuperTable(超级表)= 数据结构模板
├── 时间列(timestamp)    ← 必须有,主键
├── 数据列(metrics)      ← 传感器采集值
└── 标签列(tags)         ← 设备静态属性

每个设备 → 对应一张子表(SubTable)

示例:智能电表场景

-- 创建超级表
CREATE STABLE meters (
    ts        TIMESTAMP,    -- 时间戳(主键)
    current   FLOAT,        -- 电流(数据列)
    voltage   INT,          -- 电压(数据列)
    phase     FLOAT         -- 相位(数据列)
) TAGS (
    location  VARCHAR(64),  -- 位置(标签)
    groupId   INT           -- 分组(标签)
);

-- 每个电表自动对应一张子表
CREATE TABLE meter_001 USING meters 
    TAGS ("北京朝阳", 1);
CREATE TABLE meter_002 USING meters 
    TAGS ("上海浦东", 2);
STable: meters
┌──────────────────────────────────────────────┐
│ SubTable: meter_001  Tags: 北京朝阳, Group=1  │
│  ts                current  voltage  phase    │
│  2024-01-01 00:00  12.3     220      0.31    │
│  2024-01-01 00:01  12.5     221      0.32    │
├──────────────────────────────────────────────┤
│ SubTable: meter_002  Tags: 上海浦东, Group=2  │
│  ts                current  voltage  phase    │
│  2024-01-01 00:00  11.8     219      0.30    │
│  2024-01-01 00:01  12.1     220      0.31    │
└──────────────────────────────────────────────┘

架构设计

整体架构

┌──────────────────────────────────────────────────┐
│                  客户端层                         │
│  SQL / REST API / Python / Java / Go / C SDK     │
└─────────────────────┬────────────────────────────┘
                      │
┌─────────────────────▼────────────────────────────┐
│               TDengine 集群                       │
│                                                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐       │
│  │  dnode 1 │  │  dnode 2 │  │  dnode 3 │       │
│  │ ┌──────┐ │  │ ┌──────┐ │  │ ┌──────┐ │       │
│  │ │vnode │ │  │ │vnode │ │  │ │vnode │ │       │
│  │ │vnode │ │  │ │vnode │ │  │ │vnode │ │       │
│  │ └──────┘ │  │ └──────┘ │  │ └──────┘ │       │
│  │  mnode   │  │          │  │          │       │
│  └──────────┘  └──────────┘  └──────────┘       │
│                                                  │
│  ┌─────────────────────────────────────────┐    │
│  │              qnode(查询节点)            │    │
│  └─────────────────────────────────────────┘    │
└──────────────────────────────────────────────────┘

节点类型

职责

dnode

物理节点,包含各种逻辑节点

mnode

管理节点,维护元数据、集群管理

vnode

数据节点,实际存储和处理时序数据

qnode

查询节点,执行复杂查询计算

snode

流计算节点,处理流式任务


核心技术原理

1. 存储引擎设计

一设备一表 + 列式存储:

时间维度分片(按时间段切割文件):

vnode/
├── 2024-01/          ← 月级分区
│   ├── data.tsdb     ← 列式数据文件
│   ├── head.tsdb     ← 数据头信息
│   └── last.tsdb     ← 最新数据缓存
├── 2024-02/
└── ...

列式存储布局:
[ts列][ts列][ts列]...[current列][current列]...[voltage列]...
  ↓
  相同类型数据连续存放 → 压缩率极高

写入流程:

数据写入
  → WAL(预写日志,保证持久性)
  → MemTable(内存缓冲)
  → 达到阈值 → 落盘(TSMFile)
  → 后台 Compaction 合并优化

2. 数据压缩

针对时序数据特点采用专用压缩算法:

$$ \text{压缩比} = \frac{\text{原始数据大小}}{\text{压缩后大小}} \approx 10:1 \sim 20:1 $$

数据类型

压缩算法

Timestamp

Delta-of-Delta 编码

整型

Simple8B / ZigZag

浮点型

Gorilla XOR 压缩

字符串

LZ4 / ZSTD

原始时间戳序列(差值递增):
1000, 1001, 1002, 1003, 1004 ...
  ↓ Delta 编码
1000, +1, +1, +1, +1 ...
  ↓ 极致压缩
存储空间减少 90%+

3. 时序特化查询优化

普通数据库查询 last 值:
  全表扫描 → O(n)

TDengine last 查询:
  直接读 last.tsdb 缓存 → O(1)

时序专用函数:

-- 降采样(每10分钟平均值)
SELECT AVG(current), MAX(voltage)
FROM meters
WHERE ts BETWEEN '2024-01-01' AND '2024-01-02'
INTERVAL(10m)              -- 时间窗口函数
FILL(LINEAR);              -- 空值线性插值

-- 最新值查询
SELECT LAST(current) FROM meters GROUP BY location;

-- 时间偏移对比(今天 vs 昨天)
SELECT TIMESHIFT(AVG(current), -1d) FROM meters INTERVAL(1h);

4. 流计算(Stream Processing)

TDengine 3.0 内置流计算引擎:

-- 创建流式任务:实时计算每分钟平均电流
CREATE STREAM current_stream
INTO avg_current_1min
AS SELECT 
    _wstart, 
    AVG(current) as avg_current,
    location
FROM meters
PARTITION BY location
INTERVAL(1m)
WATERMARK(5s);          -- 允许5秒乱序
实时数据写入
    ↓
触发流计算(增量计算)
    ↓
结果自动写入目标表
    ↓
无需 Flink/Spark 外部组件

典型部署架构

IoT 场景完整链路

现场设备层
[传感器][PLC][仪表]
    ↓ MQTT / Modbus
边缘层
[边缘节点 TDengine Edge]  ← 本地存储+预处理
    ↓ 同步/上报
云端/数据中心
[TDengine 集群]
    ↓
[Grafana 可视化] [告警系统] [数据分析平台]

与生态组件集成

数据采集:
  Telegraf / collectd / OPC-UA → TDengine

可视化:
  TDengine → Grafana(官方插件)

流处理:
  TDengine → Flink / Spark(作为 Source/Sink)

数据同步:
  TDengine ↔ Kafka(双向)

性能指标

指标

数据

单节点写入速度

数百万点/秒

数据压缩比

1/10 ~ 1/20

查询性能

比通用数据库快 10x+

存储成本

比 MySQL 节省 90%+


TDengine vs 同类产品

特性

TDengine

InfluxDB

TimescaleDB

OpenTSDB

数据模型

超级表

Measurement

超表(PG扩展)

标签KV

写入性能

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

⭐⭐⭐

⭐⭐⭐

压缩比

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

⭐⭐⭐

⭐⭐

SQL 支持

✅ 完整

⚠️ Flux

✅ 完整

内置流计算

集群部署

企业版

开源协议

AGPL v3

MIT(单节点)

Apache 2.0

LGPL


适用场景

✅ 非常适合                    ❌ 不适合
─────────────────────────────────────────
IoT 设备数据采集               复杂关系型数据
工业传感器监控                 OLTP 事务处理
IT 基础设施监控                图数据处理
能源/电力数据管理              文档存储
车联网轨迹数据                 全文检索
金融行情数据                   
气象/环境监测                  

快速上手

# Docker 启动
docker run -d -p 6030:6030 -p 6041:6041 \
  tdengine/tdengine:latest

# 连接客户端
taos

# 创建数据库(保留30天数据)
CREATE DATABASE iot_db KEEP 30;
USE iot_db;

# 建表并写入
CREATE STABLE sensors (ts TIMESTAMP, temp FLOAT, hum FLOAT)
TAGS (device_id VARCHAR(32), location VARCHAR(64));

INSERT INTO sensor_001 USING sensors 
TAGS ('DEV001', '车间A') 
VALUES (NOW, 36.5, 65.2);

# 查询(最近1小时每分钟平均温度)
SELECT AVG(temp) FROM sensors 
WHERE ts > NOW - 1h 
INTERVAL(1m);

总结

TDengine 核心价值

    专为时序设计
         │
    超级表模型 ──── 高效写入(百万点/秒)
         │
    列式存储 ──────── 极致压缩(1/10)
         │
    时序函数 ──────── 快速查询
         │
    内置流计算 ────── 简化架构
         │
    降低成本 + 简化运维

TDengine 通过专注时序场景的极致优化,在 IoT 和监控领域提供了比通用数据库高出数量级的性价比,是时序数据存储领域的重要选择之一。