KaiwuDBKaiwuDB

KWDB 创作者计划 | 体验KWDB及其测试组件kwdb-tsbs

2025-05-30

文章链接:【KWDB 2025 创作者计划】_体验KWDB及其测试组件kwdb-tsbs

作者:听见风的声音


1. KWDB-面向 AIoT 场景的分布式多模数据库产品

1.1 时序数据库-数据洪流中的时间舵手

时序数据库(TSDB)是专为处理按时间顺序生成的海量数据而设计的数据库系统。其核心原理是围绕时间戳构建数据模型,通过优化存储结构(如列式存储、时间分区)和压缩算法(如Delta编码),实现每秒百万级数据点的高效写入与快速查询。例如,国家电网使用TDengine数据库,每日可处理千万级智能电表的10亿条用电数据,存储成本降低90%,同时支持秒级异常用电分析。


时序数据库的发展逐渐从传统数据库扩展走向专用化:早期基于Oracle等关系型数据库的扩展因性能瓶颈逐渐被淘汰;2000年后,RRDTool以环形存储开创时序数据专用存储先河;2013年InfluxDB推出TSM引擎,结合类SQL语法成为物联网主流选择;近年来,云原生TSDB(如AWS Timestream)实现弹性扩缩容,支撑亿级设备接入。


随着物联网的不断推广及发展,时序数据库也面临比较复杂的挑战,主要集中在三个方面:其一,数据量爆炸式增长,如自动驾驶汽车每秒产生1GB数据,对存储与实时处理提出极限要求;其二,多模态数据融合难题,如气象预测需结合时间序列与空间地理数据;其三,查询效率与成本平衡,金融高频交易需纳秒级响应,而传统TSDB可能因索引冗余拖慢速度。


时序数据库的发展也沿着不断克服各种各样的挑战,适应各种差异化的场景的方式演进,未来趋势呈现三大方向:一是边缘智能,在设备端部署轻量级TSDB(如QuestDB Edge),实现数据本地化处理,例如三一重工借此将挖掘机振动数据云端传输量减少80%;二是AI原生融合,例如Azure Data Explorer已集成时序预测函数,某风电企业故障预测准确率从78%提升至95%;三是多模态扩展,比如InfluxDB推出地理空间插件,支持气象、物流等领域时空联合分析,再如浪潮推出的开源的KWDB,融合了关系数据库、时序数据库及预测分析引擎。

1.2 KWDB-国产开源的多模时间数据库

KWDB 是由开放原子开源基金会孵化及运营的开源项目,是一款面向 AIoT 场景的分布式多模数据库产品,支持在同一实例同时建立时序库和关系库并融合处理多模数据,具备千万级设备接入、百万级数据秒级写入、亿级数据秒级读取等时序数据高效处理能力,具有稳定安全、高可用、易运维等特点。
相比传统的数据库,KaiwuDB 提供多模数据管理能力,提供关系数据模型和时序数据模型,助力企业跨部门、跨业务统一管理数据,实现多业务数据融合,支撑多样化的应用服务。KaiwuDB 的产品架构如下图所示:

KWDB 创作者计划 | 体验KWDB及其测试组件kwdb-tsbs(图1)

KaiwuDB 在多模数据库基础上开发了预测分析引擎,用于提供从模型导入、模型训练、模型预测、模型评估到模型更新的全生命周期管理能力。任何具备数据库应用开发背景的应用开发人员都可以轻松地导入、训练、预测、评估、更新模型。
KaiwuDB 预测分析引擎支持社区活跃的主流机器学习框架,包括 scikit-learn、XGBoost、LightGBM 和 TensorFlow。除了原生的框架支持,KaiwuDB 预测分析引擎也具备扩展能力。用户不仅可以部署 KaiwuDB 自带的机器学习运行环境,还可以建立自定义的运行环境,满足不同项目的需要。KaiwuDB的与分析引擎架构图如下:

KWDB 创作者计划 | 体验KWDB及其测试组件kwdb-tsbs(图2)


1.3 kwdb-tsbs-- KaiwuDB实现的tsbs测试套件

TSBS 是一个开源的性能基准测试平台,旨在为时序数据库系统提供性能评估。它涵盖了 IoT 和 DevOps 两个典型应用场景,能够模拟大规模时序数据生成、写入和查询等操作,从而对时序数据库的性能进行全面评估。
TSBS 的主要特点

  • 便捷性:TSBS 提供了友好的用户界面,使得用户能够轻松设置和执行性能测试。
  • 易用性:TSBS 的使用门槛较低,无需复杂的配置和安装过程,即可快速上手。
  • 扩展灵活性:TSBS 支持自定义测试场景和数据模型,以满足不同用户的需求。
  • 自动汇总结果:TSBS 能够自动汇总测试结果,为用户提供直观的性能数据。

TSBS 因其开放开源的特点,得到了众多数据库厂商的支持,成为专业产品性能基准测试平台的首选。通过使用 TSBS,数据库厂商可以对自己的产品进行全面的性能评估,从而优化产品性能,满足市场需求。TSBS提供了下面两个测试场景


1)DevOps 场景
该用例分为两种形式:

  • 完整形式:模拟真实 DevOps 监控场景,生成并插入来自 9 个可观测系统(如 CPU、内存、磁盘等)的指标数据。每轮读数周期共产生 100 个指标,涵盖系统全维度状态。
  • 简化形式:聚焦 CPU 监控,每轮读数生成 10 个 CPU 核心指标(如利用率、负载、上下文切换次数等),适用于轻量级测试。

两类形式均会为每台主机生成元数据标签(如主机地理位置、操作系统类型等),标签组合唯一标识一台主机,主机数量通过规模参数(scale flag)动态定义。例如设置 1000 台主机时,将生成 1000 组独立标签及对应监控数据流。

2)物联网(IoT)场景
模拟虚构物流公司的卡车车队数据流,包含:

  • 诊断数据:每辆卡车生成引擎温度、油耗、胎压等实时指标;
  • 环境复杂性:引入乱序数据(如网络延迟导致时序错乱)和批量数据摄入(模拟卡车离线后重新联网的补传场景);
  • 元数据关联:通过卡车编号、车型、所属车队等元数据,将分散的指标与诊断记录动态关联。

生成的查询请求将涵盖两类分析:

  • 实时状态:监控车辆当前位置、故障码等即时信息;
  • 预测分析:基于历史时序数据(如连续 30 天引擎振动频率)预测零部件寿命,实现预防性维护。场景规模由卡车数量参数(scale factor)控制,例如 5000 辆卡车将产生 5000 条独立数据流。

kwdb-tsbs 是一款基于 Timescale Time Series Benchmark Suite (TSBS) 的时序数据库性能基准测试工具,用于生成数据集,然后对 KaiwuDB 数据库的读写性能进行基准测试。kwdb-tsbs 支持时序数据生成、数据写入、查询处理、自动化结果汇总统计等功能。具有一下特性

  • 数据生成:支持自定义设备数量、数据采样时间范围和数据采样间隔。
  • 数据导入:提供针对 KaiwuDB 优化的批量写入工具。
  • 查询场景:提供标准的时序查询模板。
  • 自动化测试:一键执行完整的 KaiwuDB 性能基准测试流程

目前,kwdb-tsbs 只支持 DevOps cpu-only 测试场景,场景只关注 CPU 指标。该测试场景模拟对服务器 CPU 监控生成的时序数据,针对每台设备(CPU)记录其 10 个 CPU 指标。


2. KWDB的部署

KWDB 支持用户根据需求选择二进制安装包、容器和源码安装与试用 KWDB 数据库

  • 二进制安装包:支持单机和集群以及安全和非安全部署模式,更多信息见单节点部署和集群部署。
  • 容器镜像:KWDB 提供了多种容器镜像下载渠道,用户可以根据当前网络环境选择合适的镜像,或者直接在 Release 页面下载对应版本的后缀为 -docker.tar.gz 的压缩包解压并使用
    docker load < KaiwuDB.tar 命令加载 kaiwudb_install/packages 中的镜像。
    官方仓库:kwdb/kwdb
    国内镜像:swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kwdb/kwdb
    Github 容器镜像:ghcr.io/kwdb/kwdb
  • 源码:源码编译目前支持单节点非安全模式部署。

我这里的环境是一个Oracle VM VirtualBOX 虚拟机,安装的是CentOS 7操作系统,配置是4C10G,80G的SSD,CentOS 不在KWDB官方支持的操作系统之内,因此选择容器方式安装,查一下官网文档,KWDB支持容器安装部署的方式有两种,一是使用YAML文件部署,一是直接使用docker 命令部署。直接使用命令部署相对简单直接,所以这里首先使用这种方式。这两种方式的前提条件在官网上是相同的

  • 已获取 KaiwuDB 容器安装包。
  • 待部署节点的硬件、操作系统、软件依赖和端口满足安装部署要求。
  • 安装用户为 root 用户或者拥有 sudo 权限的普通用户。
  • root 用户和配置 sudo 免密的普通用户在执行部署脚本时无需输入密码。
  • 未配置 sudo 免密的普通用户在执行部署脚本时,需要输入密码进行提权。
  • 安装用户为非 root 用户时,需要通过 sudo usermod -aG docker $USER 命令将用户添加到 docker 组。

这里对第二个要求提出质疑,既然是使用容器部署了,对待部署节点的硬件有要求是应该的,为何对操作系统、软件依赖也要求提出要求,这个要求是什么,是否和二进制时要求的相同,个人感觉应该说的清楚一些。因为,我这里的操作系统及软件依赖是不符合KWDB二进制安装的要求的,这个疑虑导致我在部署的过程中一直怀疑这次部署是不是会有问题,部署的第一步是获取KWDB容器安装包(官网的叫法),使用下面命令拉取映像,拉取映像前先检查一下docker映像仓库地址,现在docker官方的影响仓库地址连接很不稳定,稍微大一点的映像就容易超时,还是换成国内的镜像仓库地址较好,运行docker info命令,显示当前使用的镜像仓库

Registry Mirrors:
  https://docker.1ms.run/
  https://docker.xuanyuan.me/


这里使用的轩辕镜像,仓库更换方法可以参考这个镜像的网站。使用下面命令拉取kwdb映像


[root@localhost ~]# docker pull kwdb/kwdb:2.2.0
2.2.0: Pulling from kwdb/kwdb
9b857f539cb1: Pull complete
24fd278016bd: Pull complete
e915a1b38e6a: Pull complete
Digest: sha256:9dda946922a69557e20be9f1d99c504c467fba6351bb8af0a34fe42711cde73f
Status: Downloaded newer image for kwdb/kwdb:2.2.0
docker.io/kwdb/kwdb:2.2.0


查看一下拉取的映像


[root@localhost ~]# docker images
REPOSITORY                                                     TAG       IMAGE ID       CREATED         SIZE
kwdb/kwdb                                                      2.2.0     54712e6a5f83   7 weeks ago     259MB


映像的大小是259MB,我电脑中postgres 17的映像是438MB,MySQL 的映像是516MB,kwdb的代码还是比较精简的。使用下面命令部署KWDB



docker run -d --privileged --name kaiwudb \
  --ulimit memlock=-1 \
  --ulimit nofile=4096 \
  -p $db_port:26257 \
  -p $http_port:8080 \
  -v /var/lib/kaiwudb:/kaiwudb/deploy/kaiwudb-container \
  --ipc shareable \
  -w /kaiwudb/bin \
  54712e6a5f83 \
  ./kwbase start-single-node \
    --insecure \
    --listen-addr=0.0.0.0:26257 \
    --http-addr=0.0.0.0:8080 \
    --store=/kaiwudb/deploy/kaiwudb-container


上面命令的-v选项将宿主的/var/lib/kaiwudb映射到容器内,在运行docker命令前需要先创建这个目录

mkdir -p /var/lib/kaiwudb



然后运行docker命令后,容器创建并启动成功


[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                                                        NAMES
fe968587073f   54712e6a5f83   "./kwbase start-sing…"   6 seconds ago   Up 4 seconds   0.0.0.0:32771->8080/tcp, :::32771->8080/tcp, 0.0.0.0:32770->26257/tcp, :::32770->26257/tcp   kaiwudb


3. kwdb-tsbs的安装部署

kwdb-tsbs必须以源码编译的方式安装部署,编译需要go 1.23及以上版本,go的二进制安装包可以从官网下载,linux操作系统可以使用wget命令下载


wget https://golang.google.cn/dl/go1.24.3.linux-amd64.tar.gz


下载后使tar命令解压至相应目录,并创建go执行文件至/usr/bin的软连接

tar -xzvf go1.24.3.linux-amd64.tar -C /usr/local ##解压至/usr/local目录
ln -s /usr/local/go/bin/go /usr/bin/go  ## 在/usr/bin目录下创建至go可执行文件的软连接


上面之所以使用软连接的方式,而不使用设置用户环境变量的方式是这种方式更简单直接,不必为每个用户单独设置。
现在已具备kwdb-tsbs的编译条件,从github克隆kwdb-tsbs仓库,进入仓库目录后进行编译


[root@localhost ~]# git clone https://gitee.com/kwdb/kwdb-tsbs.git
Cloning into 'kwdb-tsbs'...
remote: Enumerating objects: 930, done.
remote: Counting objects: 100% (930/930), done.
remote: Compressing objects: 100% (747/747), done.
remote: Total 930 (delta 148), reused 917 (delta 142), pack-reused 0 (from 0)
Receiving objects: 100% (930/930), 1.29 MiB | 413.00 KiB/s, done.
Resolving deltas: 100% (148/148), done.
[root@localhost ~]#cd kwdb-tsbs
[root@localhost ~]#make


运行make命令编译,在这里报了如下错误


GO111MODULE=on go get ./cmd/tsbs_generate_data
go: github.com/HdrHistogram/hdrhistogram-go@v1.1.2: Get "https://proxy.golang.org/github.com/%21hdr%21histogram/hdrhistogram-go/@v/v1.1.2.mod": dial tcp 142.250.204.49:443: i/o timeout
make: *** [tsbs_generate_data] Error 1

刚看到这个错误以为是github连接不稳定的原因,打开浏览器验证一下这时github的连接是稳定的,百度了一下才发现原来是proxy.golang.org的连接有问题,需要更换一个可用的goproxy代理,网上搜索发现了一个是可用的网址如下goproxy可用地址
将此go proxy的地址设置为当前环境变量,再次编译


export GO111MODULE=on
export GOPROXY=https://goproxy.cn/
make
GO111MODULE=on go get ./cmd/tsbs_generate_data
go: downloading github.com/blagojts/viper v1.6.3-0.20200313094124-068f44cf5e69
go: downloading github.com/spf13/pflag v1.0.5
go: downloading github.com/gocql/gocql v0.0.0-20211222173705-d73e6b1002a7
go: downloading github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5
go: downloading github.com/kshvakov/clickhouse v1.3.11
go: downloading github.com/google/flatbuffers v23.5.26+incompatible
go: downloading github.com/golang/protobuf v1.5.4
go: downloading github.com/golang/snappy v0.0.4
go: downloading github.com/prometheus/common v0.37.0
go: downloading github.com/timescale/promscale v0.0.0-20221221142019-a7a8f7c4de78
----------###
GO111MODULE=on go build -o bin/tsbs_run_queries_victoriametrics ./cmd/tsbs_run_queries_victoriametrics
GO111MODULE=on go install ./cmd/tsbs_run_queries_victoriametrics
GO111MODULE=on go get ./cmd/tsbs_run_queries_kwdb
GO111MODULE=on go build -o bin/tsbs_run_queries_kwdb ./cmd/tsbs_run_queries_kwdb
GO111MODULE=on go install ./cmd/tsbs_run_queries_kwdb

编译成功了,在tsbs仓库路径bin目录下生成了相应的文件


[root@localhost bin]# ls
tsbs_generate_data     tsbs_load_influx           tsbs_run_queries_akumuli     tsbs_run_queries_siridb
tsbs_generate_queries  tsbs_load_kwdb             tsbs_run_queries_cassandra   tsbs_run_queries_timescaledb
tsbs_load              tsbs_load_mongo            tsbs_run_queries_clickhouse  tsbs_run_queries_timestream
tsbs_load_akumuli      tsbs_load_prometheus       tsbs_run_queries_cratedb     tsbs_run_queries_victoriametrics
tsbs_load_cassandra    tsbs_load_siridb           tsbs_run_queries_influx
tsbs_load_clickhouse   tsbs_load_timescaledb      tsbs_run_queries_kwdb
tsbs_load_cratedb      tsbs_load_victoriametrics  tsbs_run_queries_mongo


5. 使用kwdb-tsbs进行测试

使用 kwdb-tsbs 进行基准测试包括 4 个阶段:数据生成、数据导入、查询生成、和查询执行,这四个阶段kwdb-tsbs都提供相应的脚本,在执行这四个脚本之前需要在数据库执行一些准备工作


5.1 数据库上的准备工作

这次kwdb-tsbs测试使用root账户进行,数据上的准备比较简单,登陆kwdb,创建一个数据库即可


root@:26257/defaultdb> create ts database benchmark;
CREATE TS DATABASE
root@:26257/defaultdb> show databases;
  database_name | engine_type
----------------+--------------
  benchmark     | TIME SERIES
  defaultdb     | RELATIONAL
  postgres      | RELATIONAL
  system        | RELATIONAL


benchmark是这次测试使用的数据库,引擎类型是TIME SERIES


5.2 创建测试数据集

./tsbs_generate_data \
  --format="kwdb" \
  --use-case="cpu-only" \
  --seed=123 \
  --scale=100 \
  --timestamp-start="2025-01-01T00:00:00Z" \
  --timestamp-end="2025-01-02T00:00:00Z" \
  --log-interval="10s" \
  --orderquantity=12 > data.dat


上面命令中forma和use-case只能填这个值,scale设置主机的数量,orderquantity设置初始生成设备数量。例如,对于 100 台 设备,首先生成从 host_0 到 host_11 的数据,然后生成从 host_12 到 host_23 的数据。命令运行后,生成的数据如下

[root@localhost bin]# tail -10 data.dat
1,host_98,11,(1451692770000,96,92,95,94,100,80,4,46,55,61,'host_98')
1,host_99,11,(1451692770000,27,48,66,36,94,47,83,97,48,58,'host_99')
1,host_96,11,(1451692780000,52,6,32,75,86,56,87,53,15,12,'host_96')
1,host_97,11,(1451692780000,59,73,72,76,62,25,34,17,43,6,'host_97')
1,host_98,11,(1451692780000,94,92,96,95,100,79,4,47,54,61,'host_98')
1,host_99,11,(1451692780000,25,48,66,35,94,47,84,97,49,59,'host_99')
1,host_96,11,(1451692790000,53,8,32,75,87,56,87,52,15,13,'host_96')
1,host_97,11,(1451692790000,58,72,68,76,61,24,33,19,43,6,'host_97')
1,host_98,11,(1451692790000,95,92,95,95,100,79,3,48,53,60,'host_98')
1,host_99,11,(1451692790000,26,48,66,35,94,46,84,97,47,60,'host_99')


5.3 载入数据

./tsbs_load_kwdb \
  --file=data.dat \
  --user=root \
  --pass= \
  --host=192.168.56.101 \
  --port=26257 \
  --insert-type=prepare \
  --preparesize=1000 \
  --db-name=benchmark \
  --case=cpu-only \
  --workers=12 \
  --partition=false

上面的命令中,user,pass,host,port根据数据库的实际情况填写,我这里是非安全模式的kwdb,root密码为空。insert类型可以选择prepare和insert,insert直接载入数据,prepare先进行编译后再载入,猜测prepare方式应该会快一些,db-name填入之前创建的数据库。tsbs的载入相当快这从命令的执行结果可以看出来


Summary:
loaded 9506000 metrics in 1.903sec with 12 workers (mean rate 4994836.19 metrics/sec)
loaded 864100 rows in 1.903sec with 12 workers (mean rate 454033.03 rows/sec)


1秒钟平均载入454033多行,4994836多个metrics,这个载入效率是相当高的。这个载入脚本会数据库内创建表并载入数据,登陆数据库可以查到以下信息

oot@:26257/benchmark> show tables;
  table_name |    table_type
-------------+--------------------
  cpu        | TIME SERIES TABLE
(1 row)
Time: 2.814158ms
root@:26257/benchmark> select count(*) from cpu;
  count
----------
  864000
(1 row)
Time: 5.988984ms

5.4 生成测试查询语句

./tsbs_generate_queries \
    --format=kwdb \
    --use-case="cpu-only" \
    --seed=123 \
    --scale=100 \
    --query-type=single-groupby-1-8-1 \
    --queries=100000 \
    --timestamp-start="2025-01-01T08:00:00Z" \
    --timestamp-end="2025-01-05T00:00:01Z" \
    --db-name=benchmark > query.dat
KWDB 1 cpu metric(s), random    8 hosts, random 1h0m0s by 1m: 100000 points

这个命令的参数大部分前面都出现过,查询次数是测试总共运行的查询的次数。


5.5 运行测试

./tsbs_run_queries_kwdb \
    --file=query.dat \
    --user=root \
    --pass= \
    --host=192.168.56.101 \
    --port=26257 \
    --workers=1 > query.log

file参数填入刚才创建的查询文件,测试的结果如下

After 99900 queries with 1 workers:
Interval query rate: 211.56 queries/sec Overall query rate: 202.72 queries/sec
KWDB 1 cpu metric(s), random    8 hosts, random 1h0m0s by 1m:
min:     1.67ms, med:     4.59ms, mean:     4.85ms, max:  901.95ms, stddev:     5.11ms, sum: 484.2sec, count: 99900
all queries                                                 :
min:     1.67ms, med:     4.59ms, mean:     4.85ms, max:  901.95ms, stddev:     5.11ms, sum: 484.2sec, count: 99900
After 100000 queries with 1 workers:
Interval query rate: 197.46 queries/sec Overall query rate: 202.72 queries/sec
KWDB 1 cpu metric(s), random    8 hosts, random 1h0m0s by 1m:
min:     1.67ms, med:     4.59ms, mean:     4.85ms, max:  901.95ms, stddev:     5.11ms, sum: 484.7sec, count: 100000
all queries                                                 :
min:     1.67ms, med:     4.59ms, mean:     4.85ms, max:  901.95ms, stddev:     5.11ms, sum: 484.7sec, count: 100000


6. 一点感想

国产数据库这几天的发展确实很快,也有了非常明显的进步。KWDB和测试组件kwdb-tsbs的安装部署相当简单,尤其是kwdb-tsbs组件的数据载入速度给我的印象非常深刻。

体验全新的分布式多模数据库解决方案

企业版 社区版

KaiwuDB 是浪潮控股的数据库企业,面向工业物联网、数字能源、车联网、智慧产业等行业领域,提供稳定安全、高性能、易运维的创新数据软件与服务。

关注官方微信

友情链接:浪潮  

© 上海沄熹科技有限公司 Shanghai Yunxi Technology Co., Ltd.    沪ICP备2023002175号-1    网站服务协议   |   隐私政策
400-624-5688-7
服务与支持
marketing@kaiwudb.org.cn