作者 | 裴亚明
在物联网、工业互联网和智能设备快速发展的今天,时序数据库(Time Series Database)已成为处理海量传感器数据的核心基础设施。而对这些系统的性能评估、容量规划和稳定性验证,则离不开高效、灵活的压力测试工具。
过去,我们主要使用 taosBenchmark 来做 TDengine 的基础写入性能测试。它在很多场景下已经足够好用,尤其适合快速验证数据库写入能力。不过,随着实际业务越来越复杂,我们也遇到了一些新的需求。
比如,数据不一定只写入数据库,也可能同时进入 MQTT、Kafka 等消息中间件;数据生成方式也不能总是简单随机,而是希望更接近真实设备的变化规律;有些测试还需要按照历史数据的时间间隔进行回放,而不是一味追求最大吞吐——随着这类需求增多,传统 benchmark 工具在配置灵活性、扩展能力以及真实复杂流程模拟方面的不足也逐渐显现出来。
基于这些考虑,我们推出了 taosgen。它是一款面向时序数据场景的新一代性能基准与数据模拟工具,具备强大功能且高度可扩展,希望在“压测”之外,也能承担更多数据生成、链路验证和历史数据回放的工作。
什么是 taosgen?
简单来说,taosgen 是一个可以生成时序数据,并把这些数据写入不同目标系统的工具。目前它支持:
- 高并发数据生成与写入 TDengine;
- 向 MQTT Broker 发布模拟设备消息;
- 向 Kafka Topic 生产结构化数据流;
- 基于 DAG 的作业编排,构建复杂测试流程;
- 使用 Lua 表达式动态生成逼真数据;
- 实时“播放”历史数据,还原真实时间线。
也就是说,taosgen 不只是一个写入压测工具,更是一个面向未来的、支持多目标、可编程的数据流模拟引擎,可以用来模拟设备上报、数据库写入、消息队列接入等多个环节。目前 taosgen 已支持 Windows、Linux 和 macOS,可直接下载使用。
为什么选择 taosgen?相比 taosBenchmark 的五大升级
taosBenchmark 更适合完成标准化的数据库写入测试,而 taosgen 关注的是更复杂的测试过程。具体来说,升级如下:
| 能力维度 | taosBenchmark | taosgen |
| 任务模型 | 单一任务,固定流程 | 支持 DAG 作业编排,可定义依赖关系 |
| 目标协议 | 仅 TDengine | 支持 TDengine / MQTT / Kafka 多协议输出 |
| 数据生成 | 多表共用,固定模式 | 支持 Lua 表达式、多表独立的即时生成 |
| 时间控制 | 固定频率 | 支持多种控制策略,可基于真实时间戳“回放”,模拟实时数据流 |
| 连接管理 | 每次操作新建连接 | 内置连接池,复用连接提升效率 |
除此之外,taosgen 还具备以下亮点特性:
1. 灵活的作业编排(Job Orchestration)
taosgen 以“作业(Job)”为基本执行单元,每个作业由多个“步骤(Step)”组成,并可通过 needs 字段声明前置依赖,形成有向无环图(DAG),实现如“先建库 → 再建表 → 最后写入”的标准流程,也可并行执行多个独立任务。
tdengine:
dsn: taos+ws://root:taosdata@127.0.0.1:6041/tsbench
drop_if_exists: true
props: precision 'ms' vgroups 4
schema:
name: meters
tbname:
prefix: d
count: 100
from: 0
jobs:
create_db:
name: Create Database
steps:
- uses: tdengine/create-database
create_stable:
name: Create Super Table
needs: [create_db] # 依赖 create_db 完成
steps:
- uses: tdengine/create-super-table
create_ctable:
name: Create Child Table
needs: [create_stable] # 依赖 create_stable 完成
steps:
- uses: tdengine/create-child-table
insert_data:
name: Insert Data
needs: [create_ctable] # 依赖 create_ctable 完成
steps:
- uses: tdengine/insert
2. 多样化的数据生成方式
taosgen 支持两种主要数据源:
- 即时生成(Generator Mode):无需预生成大文件,直接通过配置规则动态生成数据。
- CSV 文件导入(CSV Mode):复用现有 CSV 元数据或历史数据进行回放。
更强大的是,你可以在列级别使用 Lua 表达式来生成非线性、带噪声、周期性变化的数据,例如模拟电压波动、温度周期等真实物理现象:
columns:
- name: voltage
type: FLOAT
gen_type: expression
expr: "220 + 10 * math.sin(_i / 30) + 5 * math.random()" # 模拟电网波动
3. 真实时间“播放”能力
在很多压测场景中,大家首先关注的是吞吐量,也就是系统能以多快的速度写入数据。但在历史数据回放、流处理链路验证、告警规则测试等场景里,数据进入系统的时间节奏同样重要。taosgen 支持 time_interval 策略,可以根据数据时间戳之间的间隔控制发送速度,从而实现“慢放”、“快进”或“按原始速率播放”等不同情况。
steps:
- uses: tdengine/insert
with:
time_interval:
enabled: true
interval_strategy: literal # 按数据时间戳精确发送
4. 多协议输出,不止于数据库
在真实系统里,时序数据往往不会只进入数据库。很多设备数据会先通过 MQTT 接入边缘网关或 IoT 平台,也可能通过 Kafka 进入流处理系统(Flink、Spark Streaming),之后再落库或进入下游分析链路。
因此,taosgen 除了支持写入 TDengine,也支持将同一套数据结构发布到 MQTT Broker 或 Kafka Topic。这意味着你可以用同一套 schema 和数据逻辑,同时测试整个数据链路的不同环节。
steps:
- uses: kafka/produce
with:
topic: factory-sensors
value_serializer: json
acks: 1
5. 更安全、更易用的配置体验
taosgen 使用 YAML 作为配置格式。相比在命令行中堆大量参数,配置文件更适合描述复杂测试场景,也方便团队共享和版本管理。
另外,taosgen 会自动检测未知或拼写错误的配置项,避免因为配置写错但程序静默忽略,导致测试结果不符合预期。命令行参数的优先级高于配置文件,也方便在调试时临时覆盖部分设置。
这些改动看起来不算“大功能”,但在实际使用中很重要。压测任务往往需要反复执行,如果配置不清楚、错误不明显,后续排查会浪费不少时间。
快速开始:三步体验 taosgen 强大功能
第一步:下载安装
首先需要前往 GitHub Releases 页面(https://github.com/taosdata/taosgen/releases)下载对应平台的二进制包。以 Linux 为例:
# 下载并解压
tar zxvf taosgen-v0.8.6-linux-x64.tar.gz
cd taosgen
# 添加到系统路径(可选)
sudo ln -sf $(pwd)/taosgen /usr/local/bin/taosgen
# 查看版本
taosgen --version
第二步:准备配置文件(config.yaml)
下面是一个简单示例:创建数据库、超级表,并向 10000 张子表写入 10000 条模拟电表数据。
tdengine:
dsn: taos+ws://root:taosdata@127.0.0.1:6041/tsbench
drop_if_exists: true
schema:
name: meters
tbname:
prefix: d
count: 10000
from: 0
columns:
- name: ts
type: timestamp
start: now
precision : ms
step: 1
- name: current
type: float
min: 5
max: 20
- name: voltage
type: int
min: 200
max: 240
- name: phase
type: float
expr: _i * math.pi % 180
tags:
- name: groupid
type: int
min: 1
max: 10
- name: location
type: binary(24)
values:
- New York
- Los Angeles
- Chicago
- Houston
- Phoenix
- Philadelphia
- San Antonio
- San Diego
- Dallas
- Austin
generation:
rows_per_table: 10000
rows_per_batch: 10000
jobs:
# TDengine insert job
insert-data:
steps:
- uses: tdengine/create-super-table
- uses: tdengine/create-child-table
- uses: tdengine/insert
第三步:运行测试
taosgen -c config.yaml
运行完成后,你将在 TDengine 中看到名为 tsbench 的数据库,以及包含万级子表的 meters 超级表,所有数据均已按规则写入。
应用场景:taosgen 能做什么?
taosgen 的使用场景并不局限于“往数据库里写数据”。在很多项目里,我们更关心的是数据从设备侧产生之后,如何进入消息中间件、如何被流处理系统消费、最终又如何写入数据库。taosgen 可以用统一的配置生成和发送这些数据,因此既能做基础压测,也能用来搭建接近真实业务的数据链路。下面这些场景,是它目前比较适合发挥作用的地方。
| 场景 | 说明 |
| 🧪 TDengine 性能压测 | 模拟百万级设备高频上报,测试集群吞吐、延迟、资源占用 |
| 🔄 数据迁移与初始化 | 将 CSV 格式的设备元数据和历史数据批量导入 TDengine |
| 📡 MQTT 接入层压力测试 | 模拟万台设备并发连接并发布消息,验证 Broker 稳定性 |
| 📦 Kafka 数据管道验证 | 构建高并发数据源,测试 Flink/Spark 流处理 pipeline |
| 🕰️ 历史数据回放分析 | “重播”特定时间段的数据流,用于复现问题或训练模型 |
| 🎮 系统演示与 PoC 构建 | 快速搭建逼真的 IoT 数据环境,用于产品展示或客户验证 |
结语:迈向更真实的性能测试时代
taosgen 的推出,并不是为了替代所有已有工具。taosBenchmark 仍然适合做标准化、直接的 TDengine 写入性能测试。而 taosgen 关注的是另一类问题:当测试场景变得更复杂,数据流不再只进入数据库,数据本身也需要更接近真实业务时,我们需要一个更灵活的工具来描述和执行这些流程。
对于数据库管理员、系统架构师和 IoT 平台开发者来说,taosgen 可以用于容量规划、上线前验证、历史数据回放和故障复现。它让性能测试不再只是简单地“写入一批数据”,而是可以更接近真实系统运行方式。
感兴趣的用户可以下载体验:
























