作者 | 裴亞明
在物聯(lián)網(wǎng)、工業(yè)互聯(lián)網(wǎng)和智能設備快速發(fā)展的今天,時序數(shù)據(jù)庫(Time Series Database)已成為處理海量傳感器數(shù)據(jù)的核心基礎設施。而對這些系統(tǒng)的性能評估、容量規(guī)劃和穩(wěn)定性驗證,則離不開高效、靈活的壓力測試工具。
過去,我們主要使用 taosBenchmark 來做 TDengine 的基礎寫入性能測試。它在很多場景下已經(jīng)足夠好用,尤其適合快速驗證數(shù)據(jù)庫寫入能力。不過,隨著實際業(yè)務越來越復雜,我們也遇到了一些新的需求。
比如,數(shù)據(jù)不一定只寫入數(shù)據(jù)庫,也可能同時進入 MQTT、Kafka 等消息中間件;數(shù)據(jù)生成方式也不能總是簡單隨機,而是希望更接近真實設備的變化規(guī)律;有些測試還需要按照歷史數(shù)據(jù)的時間間隔進行回放,而不是一味追求最大吞吐——隨著這類需求增多,傳統(tǒng) benchmark 工具在配置靈活性、擴展能力以及真實復雜流程模擬方面的不足也逐漸顯現(xiàn)出來。
基于這些考慮,我們推出了 taosgen。它是一款面向時序數(shù)據(jù)場景的新一代性能基準與數(shù)據(jù)模擬工具,具備強大功能且高度可擴展,希望在“壓測”之外,也能承擔更多數(shù)據(jù)生成、鏈路驗證和歷史數(shù)據(jù)回放的工作。
什么是 taosgen?
簡單來說,taosgen 是一個可以生成時序數(shù)據(jù),并把這些數(shù)據(jù)寫入不同目標系統(tǒng)的工具。目前它支持:
- 高并發(fā)數(shù)據(jù)生成與寫入 TDengine;
- 向 MQTT Broker 發(fā)布模擬設備消息;
- 向 Kafka Topic 生產(chǎn)結構化數(shù)據(jù)流;
- 基于 DAG 的作業(yè)編排,構建復雜測試流程;
- 使用 Lua 表達式動態(tài)生成逼真數(shù)據(jù);
- 實時“播放”歷史數(shù)據(jù),還原真實時間線。
也就是說,taosgen 不只是一個寫入壓測工具,更是一個面向未來的、支持多目標、可編程的數(shù)據(jù)流模擬引擎,可以用來模擬設備上報、數(shù)據(jù)庫寫入、消息隊列接入等多個環(huán)節(jié)。目前 taosgen 已支持 Windows、Linux 和 macOS,可直接下載使用。
為什么選擇 taosgen?相比 taosBenchmark 的五大升級
taosBenchmark 更適合完成標準化的數(shù)據(jù)庫寫入測試,而 taosgen 關注的是更復雜的測試過程。具體來說,升級如下:
| 能力維度 | taosBenchmark | taosgen |
| 任務模型 | 單一任務,固定流程 | 支持 DAG 作業(yè)編排,可定義依賴關系 |
| 目標協(xié)議 | 僅 TDengine | 支持 TDengine / MQTT / Kafka 多協(xié)議輸出 |
| 數(shù)據(jù)生成 | 多表共用,固定模式 | 支持 Lua 表達式、多表獨立的即時生成 |
| 時間控制 | 固定頻率 | 支持多種控制策略,可基于真實時間戳“回放”,模擬實時數(shù)據(jù)流 |
| 連接管理 | 每次操作新建連接 | 內置連接池,復用連接提升效率 |
除此之外,taosgen 還具備以下亮點特性:
1. 靈活的作業(yè)編排(Job Orchestration)
taosgen 以“作業(yè)(Job)”為基本執(zhí)行單元,每個作業(yè)由多個“步驟(Step)”組成,并可通過 needs 字段聲明前置依賴,形成有向無環(huán)圖(DAG),實現(xiàn)如“先建庫 → 再建表 → 最后寫入”的標準流程,也可并行執(zhí)行多個獨立任務。
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. 多樣化的數(shù)據(jù)生成方式
taosgen 支持兩種主要數(shù)據(jù)源:
- 即時生成(Generator Mode):無需預生成大文件,直接通過配置規(guī)則動態(tài)生成數(shù)據(jù)。
- CSV 文件導入(CSV Mode):復用現(xiàn)有 CSV 元數(shù)據(jù)或歷史數(shù)據(jù)進行回放。
更強大的是,你可以在列級別使用 Lua 表達式來生成非線性、帶噪聲、周期性變化的數(shù)據(jù),例如模擬電壓波動、溫度周期等真實物理現(xiàn)象:
columns:
- name: voltage
type: FLOAT
gen_type: expression
expr: "220 + 10 * math.sin(_i / 30) + 5 * math.random()" # 模擬電網(wǎng)波動
3. 真實時間“播放”能力
在很多壓測場景中,大家首先關注的是吞吐量,也就是系統(tǒng)能以多快的速度寫入數(shù)據(jù)。但在歷史數(shù)據(jù)回放、流處理鏈路驗證、告警規(guī)則測試等場景里,數(shù)據(jù)進入系統(tǒng)的時間節(jié)奏同樣重要。taosgen 支持 time_interval 策略,可以根據(jù)數(shù)據(jù)時間戳之間的間隔控制發(fā)送速度,從而實現(xiàn)“慢放”、“快進”或“按原始速率播放”等不同情況。
steps:
- uses: tdengine/insert
with:
time_interval:
enabled: true
interval_strategy: literal # 按數(shù)據(jù)時間戳精確發(fā)送
4. 多協(xié)議輸出,不止于數(shù)據(jù)庫
在真實系統(tǒng)里,時序數(shù)據(jù)往往不會只進入數(shù)據(jù)庫。很多設備數(shù)據(jù)會先通過 MQTT 接入邊緣網(wǎng)關或 IoT 平臺,也可能通過 Kafka 進入流處理系統(tǒng)(Flink、Spark Streaming),之后再落庫或進入下游分析鏈路。
因此,taosgen 除了支持寫入 TDengine,也支持將同一套數(shù)據(jù)結構發(fā)布到 MQTT Broker 或 Kafka Topic。這意味著你可以用同一套 schema 和數(shù)據(jù)邏輯,同時測試整個數(shù)據(jù)鏈路的不同環(huán)節(jié)。
steps:
- uses: kafka/produce
with:
topic: factory-sensors
value_serializer: json
acks: 1
5. 更安全、更易用的配置體驗
taosgen 使用 YAML 作為配置格式。相比在命令行中堆大量參數(shù),配置文件更適合描述復雜測試場景,也方便團隊共享和版本管理。
另外,taosgen 會自動檢測未知或拼寫錯誤的配置項,避免因為配置寫錯但程序靜默忽略,導致測試結果不符合預期。命令行參數(shù)的優(yōu)先級高于配置文件,也方便在調試時臨時覆蓋部分設置。
這些改動看起來不算“大功能”,但在實際使用中很重要。壓測任務往往需要反復執(zhí)行,如果配置不清楚、錯誤不明顯,后續(xù)排查會浪費不少時間。
快速開始:三步體驗 taosgen 強大功能
第一步:下載安裝
首先需要前往 GitHub Releases 頁面(https://github.com/taosdata/taosgen/releases)下載對應平臺的二進制包。以 Linux 為例:
# 下載并解壓
tar zxvf taosgen-v0.8.6-linux-x64.tar.gz
cd taosgen
# 添加到系統(tǒng)路徑(可選)
sudo ln -sf $(pwd)/taosgen /usr/local/bin/taosgen
# 查看版本
taosgen --version
第二步:準備配置文件(config.yaml)
下面是一個簡單示例:創(chuàng)建數(shù)據(jù)庫、超級表,并向 10000 張子表寫入 10000 條模擬電表數(shù)據(jù)。
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 的數(shù)據(jù)庫,以及包含萬級子表的 meters 超級表,所有數(shù)據(jù)均已按規(guī)則寫入。
應用場景:taosgen 能做什么?
taosgen 的使用場景并不局限于“往數(shù)據(jù)庫里寫數(shù)據(jù)”。在很多項目里,我們更關心的是數(shù)據(jù)從設備側產(chǎn)生之后,如何進入消息中間件、如何被流處理系統(tǒng)消費、最終又如何寫入數(shù)據(jù)庫。taosgen 可以用統(tǒng)一的配置生成和發(fā)送這些數(shù)據(jù),因此既能做基礎壓測,也能用來搭建接近真實業(yè)務的數(shù)據(jù)鏈路。下面這些場景,是它目前比較適合發(fā)揮作用的地方。
| 場景 | 說明 |
| ?? TDengine 性能壓測 | 模擬百萬級設備高頻上報,測試集群吞吐、延遲、資源占用 |
| ?? 數(shù)據(jù)遷移與初始化 | 將 CSV 格式的設備元數(shù)據(jù)和歷史數(shù)據(jù)批量導入 TDengine |
| ?? MQTT 接入層壓力測試 | 模擬萬臺設備并發(fā)連接并發(fā)布消息,驗證 Broker 穩(wěn)定性 |
| ?? Kafka 數(shù)據(jù)管道驗證 | 構建高并發(fā)數(shù)據(jù)源,測試 Flink/Spark 流處理 pipeline |
| ??? 歷史數(shù)據(jù)回放分析 | “重播”特定時間段的數(shù)據(jù)流,用于復現(xiàn)問題或訓練模型 |
| ?? 系統(tǒng)演示與 PoC 構建 | 快速搭建逼真的 IoT 數(shù)據(jù)環(huán)境,用于產(chǎn)品展示或客戶驗證 |
結語:邁向更真實的性能測試時代
taosgen 的推出,并不是為了替代所有已有工具。taosBenchmark 仍然適合做標準化、直接的 TDengine 寫入性能測試。而 taosgen 關注的是另一類問題:當測試場景變得更復雜,數(shù)據(jù)流不再只進入數(shù)據(jù)庫,數(shù)據(jù)本身也需要更接近真實業(yè)務時,我們需要一個更靈活的工具來描述和執(zhí)行這些流程。
對于數(shù)據(jù)庫管理員、系統(tǒng)架構師和 IoT 平臺開發(fā)者來說,taosgen 可以用于容量規(guī)劃、上線前驗證、歷史數(shù)據(jù)回放和故障復現(xiàn)。它讓性能測試不再只是簡單地“寫入一批數(shù)據(jù)”,而是可以更接近真實系統(tǒng)運行方式。
感興趣的用戶可以下載體驗:



互聯(lián)網(wǎng).png)



-1.png)












伙伴.png)



