模拟设备上报、消息分发与数据库写入,taosgen 一次搞定

裴亚明

2026-05-15 /

作者 | 裴亚明

在物联网、工业互联网和智能设备快速发展的今天,时序数据库(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 关注的是更复杂的测试过程。具体来说,升级如下:

能力维度taosBenchmarktaosgen
任务模型单一任务,固定流程支持 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 可以用于容量规划、上线前验证、历史数据回放和故障复现。它让性能测试不再只是简单地“写入一批数据”,而是可以更接近真实系统运行方式。

感兴趣的用户可以下载体验: