写点什么

体验 KWDB 及其测试组件 kwdb-tsbs

作者:KaiwuDB
  • 2025-07-11
    重庆
  • 本文字数:8429 字

    阅读完需:约 28 分钟

体验KWDB及其测试组件kwdb-tsbs

作者:听见风的声音


原文链接:https://www.modb.pro/db/1925359962285420544

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 的产品架构如下图所示



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


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/kwdbGithub 容器镜像: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.02.2.0: Pulling from kwdb/kwdb9b857f539cb1: Pull complete24fd278016bd: Pull completee915a1b38e6a: Pull completeDigest: sha256:9dda946922a69557e20be9f1d99c504c467fba6351bb8af0a34fe42711cde73fStatus: Downloaded newer image for kwdb/kwdb:2.2.0docker.io/kwdb/kwdb:2.2.0
复制代码


查看一下拉取的映像


[root@localhost ~]# docker imagesREPOSITORY                                                     TAG       IMAGE ID       CREATED         SIZEkwdb/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 psCONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                                                        NAMESfe968587073f   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.gitCloning 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_datago: 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 timeoutmake: *** [tsbs_generate_data] Error 1
复制代码


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


将此 go proxy 的地址设置为当前环境变量,再次编译


export GO111MODULE=onexport GOPROXY=https://goproxy.cn/makeGO111MODULE=on go get ./cmd/tsbs_generate_datago: downloading github.com/blagojts/viper v1.6.3-0.20200313094124-068f44cf5e69go: downloading github.com/spf13/pflag v1.0.5go: downloading github.com/gocql/gocql v0.0.0-20211222173705-d73e6b1002a7go: downloading github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5go: downloading github.com/kshvakov/clickhouse v1.3.11go: downloading github.com/google/flatbuffers v23.5.26+incompatiblego: downloading github.com/golang/protobuf v1.5.4go: downloading github.com/golang/snappy v0.0.4go: downloading github.com/prometheus/common v0.37.0go: downloading github.com/timescale/promscale v0.0.0-20221221142019-a7a8f7c4de78----------###GO111MODULE=on go build -o bin/tsbs_run_queries_victoriametrics ./cmd/tsbs_run_queries_victoriametricsGO111MODULE=on go install ./cmd/tsbs_run_queries_victoriametricsGO111MODULE=on go get ./cmd/tsbs_run_queries_kwdbGO111MODULE=on go build -o bin/tsbs_run_queries_kwdb ./cmd/tsbs_run_queries_kwdbGO111MODULE=on go install ./cmd/tsbs_run_queries_kwdb
复制代码


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


[root@localhost bin]# lstsbs_generate_data     tsbs_load_influx           tsbs_run_queries_akumuli     tsbs_run_queries_siridbtsbs_generate_queries  tsbs_load_kwdb             tsbs_run_queries_cassandra   tsbs_run_queries_timescaledbtsbs_load              tsbs_load_mongo            tsbs_run_queries_clickhouse  tsbs_run_queries_timestreamtsbs_load_akumuli      tsbs_load_prometheus       tsbs_run_queries_cratedb     tsbs_run_queries_victoriametricstsbs_load_cassandra    tsbs_load_siridb           tsbs_run_queries_influxtsbs_load_clickhouse   tsbs_load_timescaledb      tsbs_run_queries_kwdbtsbs_load_cratedb      tsbs_load_victoriametrics  tsbs_run_queries_mongo
复制代码

4 使用 kwdb-tsbs 进行测试

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

4.1 数据库上的准备工作

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


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


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

4.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.dat1,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')
复制代码

4.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
复制代码

4.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
复制代码


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

4.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/secKWDB 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: 99900all 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/secKWDB 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
复制代码

5 一点感想

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


发布于: 刚刚阅读数: 2
用户头像

KaiwuDB

关注

还未添加个人签名 2021-04-29 加入

KaiwuDB 是浪潮集团控股的数据库企业,公司汇聚了全球顶尖的数据库人才,以多模数据库为核心产品,面向工业物联网、数字能源、交通车联网、智慧产业等各大行业领域,提供领先创新的数据服务软件。

评论

发布
暂无评论
体验KWDB及其测试组件kwdb-tsbs_数据库_KaiwuDB_InfoQ写作社区