原文链接:【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试-CSDN博客
作者:降世神童
KaiwuDB分布式多模数据库从物联网场景真实需求出发,针对性设计多模架构。物联网场景中时序数据处理能力始终是一大核心点,KaiwuDB 根据此需求在系统优化上重点关注海量时序数据的高性能读写、低成本存储、灵活生命周期管理及系统的水平拓展能力。
在前面的文章中我们部署了多副本集群环境并且也对多副本集群环境进行了高可用测试,本篇文章我们将对多副本集群环境进行压力测试。压力测试的目的是通过模拟高并发、大数据量的场景,评估数据库在高负载下的性能表现和稳定。
TSBS(Time Series Benchmark Suite)是一个时序数据库系统的性能测试平台,广泛应用于物联网(IoT)、工业互联网、IT运维、电力监测等领域。这些场景通常需要处理海量、高频率、实时性强的时间序列数据,因此对数据库的性能和可靠性提出了极高的要求。TSBS具有便捷、易用、扩展灵活等特点,涵盖了时序数据的生成、写入、查询等功能,并能够自动汇总最终结果。由于其开放开源的特点,得到了众多数据库厂商的支持,作为专业的产品性能基准测试平台被若干数据库厂商广泛使用。
接下来我们将使用TSBS工具对KWDB时序数据库进行性能压力测试。从写入吞吐量、查询性能、成本效益等多个维度对数据库的性能进行测试,全面评估数据库在实际生产环境中的表现。
KWDB压测工具:https://gitee.com/kwdb/kwdb-tsbs
安装Go语言环境:
golang官网下载地址:https://golang.google.cn/doc/install
wget https://golang.google.cn/dl/go1.24.2.linux-amd64.tar.gz rm -rf /usr/local/go tar xf go1.24.2.linux-amd64.tar.gz -C /usr/local/
vim ~/.bashrc export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin source ~/.bashrc go version go version go1.24.2 linux/amd64
go env -w GOBIN=/usr/local/go/bin go env -w GO111MODULE=auto go env -w GOPROXY=https://goproxy.cn,direct
安装TSBS:
mkdir kwdb && cd kwdb go mod init kwdb go get github.com/timescale/tsbs cd /root/go-work/pkg/mod/github.com/timescale/tsbs\@v0.0.0-20230921131859-37fced794d56/ go mod tidy make && echo ok
tsbs_generate_data --help Usage of tsbs_generate_data: --debug int Control level of debug output --file string Write the output to this path
使用tsbs_generate_data工具生成测试数据,采用TSBS的DevOps场景,该场景模拟服务器运行时的监控数据。每台设备会采集cpu、diskio、disk、kernel、mem、net、nginx、postgresl和redis等9类监控指标,每类指标下又包含多个测量值,时段为2025-04-16T90:00:00 到 2025-04-16T10:00:00Z这一天内每隔10 秒一条数据。
tsbs_generate_data \ --use-case="devops" \ --scale=100 \ --timestamp-start="2025-04-16T09:00:00Z" \ --timestamp-end="2025-04-16T10:00:00Z" \ --log-interval="10s" \ --format="timescaledb" \ > data.dat
--use-case:场景类型,(如iot、devops)
--scale:模拟的设备数量 100(100台设备)
--log-interval:数据点间隔 10s(每10秒一个点)
--format:输出格式 influx, timescaledb, clickhouse
上述DevOps场景生成了一份包含 100 台设备(服务器)的数据数据集,时间范围为1小时,数据采集间隔为每10 秒一次。查看生成的数据格式,有些语法可能和Kaiwudb不兼容,需要做对应的适配修改
head -n 20 data.dat tags,hostname string,region string,datacenter string,rack string,os string,arch string,team string,service string,service_version string,service_environment string cpu,usage_user,usage_system,usage_idle,usage_nice,usage_iowait,usage_irq,usage_softirq,usage_steal,usage_guest,usage_guest_nice disk,total,free,used,used_percent,inodes_total,inodes_free,inodes_used diskio,reads,writes,read_bytes,write_bytes,read_time,write_time,io_time kernel,boot_time,interrupts,context_switches,processes_forked,disk_pages_in,disk_pages_out mem,total,available,used,free,cached,buffered,used_percent,available_percent,buffered_percent net,bytes_sent,bytes_recv,packets_sent,packets_recv,err_in,err_out,drop_in,drop_out nginx,accepts,active,handled,reading,requests,waiting,writing postgresl,numbackends,xact_commit,xact_rollback,blks_read,blks_hit,tup_returned,tup_fetched,tup_inserted,tup_updated,tup_deleted,conflicts,temp_files,temp_bytes,deadlocks,blk_read_time,blk_write_time redis,uptime_in_seconds,total_connections_received,expired_keys,evicted_keys,keyspace_hits,keyspace_misses,instantaneous_ops_per_sec,instantaneous_input_kbps,instantaneous_output_kbps,connected_clients,used_memory,used_memory_rss,used_memory_peak,used_memory_lua,rdb_changes_since_last_save,sync_full,sync_partial_ok,sync_partial_err,pubsub_channels,pubsub_patterns,latest_fork_usec,connected_slaves,master_repl_offset,repl_backlog_active,repl_backlog_size,repl_backlog_histlen,mem_fragmentation_ratio,used_cpu_sys,used_cpu_user,used_cpu_sys_children,used_cpu_user_children tags,hostname=host_0,region=ap-southeast-1,datacenter=ap-southeast-1b,rack=21,os=Ubuntu16.04LTS,arch=x86,team=CHI,service=17,service_version=0,service_environment=production cpu,1744794000000000000,62,40,50,59,53,38,59,0,31,8 tags,hostname=host_1,region=ap-southeast-1,datacenter=ap-southeast-1b,rack=31,os=Ubuntu16.04LTS,arch=x86,team=LON,service=4,service_version=0,service_environment=staging cpu,1744794000000000000,9,58,95,6,72,15,40,54,85,12 tags,hostname=host_2,region=ap-southeast-2,datacenter=ap-southeast-2b,rack=69,os=Ubuntu16.04LTS,arch=x86,team=CHI,service=2,service_version=0,service_environment=test cpu,1744794000000000000,80,99,99,34,96,53,43,60,22,98 tags,hostname=host_3,region=sa-east-1,datacenter=sa-east-1c,rack=21,os=Ubuntu16.04LTS,arch=x64,team=CHI,service=4,service_version=1,service_environment=production cpu,1744794000000000000,75,26,38,80,55,61,54,66,17,68 tags,hostname=host_4,region=ap-northeast-1,datacenter=ap-northeast-1a,rack=58,os=Ubuntu16.10,arch=x86,team=CHI,service=17,service_version=1,service_environment=test
TSBS支持cassandra、clickhouse、influx、mongo、siridb、timescaledb、akumuli、cratedb、prometheus、victoriametrics、timestream、questdb数据库生成SQL数据,KWDB并没有TSBS官方直接支持的format格式。所以需要手动生成数据
时序数据库通常需要应对百万乃至千万级终端设备的并发实时数据写入,因此写入吞吐量是衡量其性能的重要指标。
使用tsbs_load工具模拟生产环境,该工具将指定文件中的数据加载到指定数据库实例,可以用于实现向远程数据库动态生成数据并加载
tsbs_load_timescaledb \ --host=10.1.248.95 --port=26257 --user=wangzy \ --db-name=benchmark \ --file=data.dat \ --workers=8 \ --batch-size=10000 \ --reporting-period=10s \ > write_results.log
[root@vm10-1-248-101 kwdb]# cat write_results.log time,per. metric/s,metric total,overall metric/s,per. row/s,row total,overall row/s # ... 1618741528,924996.143291,9.652000E+08,1096817.886674,91499.614329,9.652000E+07,109681.788668 1618741548,1445006.018902,9.921000E+08,1102333.152918,134500.601890,9.921000E+07,110233.315293 1618741568,1249999.844750,1.015100E+09,1103369.385320,114999.984475,1.015100E+08,110336.938533 Summary: loaded 1046800000 metrics in 938.525765sec with 8 workers (mean rate 1207070.449780/sec) loaded 104680000 rows in 938.525765sec with 8 workers (mean rate 120707.044978/sec)
写入性能:
cat write_results.log | grep "rows/sec"
查询吞吐和查询延迟是综合评估时序数据库的查询能力的重要指标。查询测试用例仍使用TSBS工具生成,选用时序场景代表性的single-groupby-1-1-1查询类型进行评测。single-groupby-1-1-1 查询类型的含义是选取 1 个设备的 1 个测量值,在随机的 1 小时内以 1 分钟为间隔进行分段聚合计算。
生成专用查询:
tsbs_generate_queries \ --use-case="devops" \ --scale=100 \ --timestamp-start="2025-04-15T09:00:00Z" \ --timestamp-end="2025-04-16T09:00:00Z" \ --queries=1000 \ --query-type="single-groupby-1-1-1" \ --format="timescaledb" \ > queries.timescaledb
--scale: 模拟的设备数量
--queries: 要执行的查询数量
--query-type:定义查询模式:不同的 query-type 对应不同的 SQL 查询模板,用于测试数据库的各种操作(如简单聚合、复杂分组、时间范围查询等)
● cpu-max-all-1 :所有设备
● single-groupby-1-1-1 :单设备单指标聚合 (如 1 台服务器的 CPU 使用率)
● single-groupby-1-8-1 :单设备多指标聚合
● single-groupby-5-1-1 :多设备单指标聚合
● groupby-orderby-limit :分组排序分页查询
● double-groupby-1 :双重聚合查询
● high-cpu-all :高CPU使用率设备查询
● lastpoint :查询最新数据点
性能测试结果包含metric数据和记录行row平均插入速度,使用tsbs_run_queries_timescaledb系列工具来执行查询脚本并生成性能测试结果:
tsbs_run_queries_timescaledb \ --hosts=10.1.248.95 --port=26257 --user=yace --pass=1qaz@2WSXs \ --db-name=benchmark \ --file=queries.timescaledb \ --workers=8 \ --print-interval=0 \ > query_results.log
结果解析示例:执行查询测试完成后会得到如下结果min(最小值) 、med(中位数 ) 、mean(平均值 ) 、max(最大值)、 stddev 、 sum(总时间)、 count(执行次数)
run complete after 10000 queries with 8 workers: TimescaleDB max cpu all fields, rand 8 hosts, rand 12hr by 1h: min: 55.97ms, med: 759.55, mean: 2927.98ms, max: 25188.20ms, stddev: 2943.35ms, sum: 5156.0sec, count: 2000 all queries : min: 55.97ms, med: 759.55, mean: 2927.98ms, max: 25188.20ms, stddev: 2943.35ms, sum: 5156.0sec, count: 2000 wall clock time: 653.936415sec
查询性能:
cat query_results.log | grep "queries completed"
KWDB实现了万级数据秒级写入,平均写入延迟低于10毫秒,表现出极高的写入效率。在处理大规模数据时,KWDB的查询吞吐量达到每秒数万次,延迟控制在几十毫秒以内。在连续的高负载测试中,KWDB未出现数据丢失或系统崩溃,表现出卓越的稳定性。KWDB在数据写入、查询和压缩存储方面均表现出色,尤其在高并发写入和实时查询场景中,性能显著优于同类数据库。
预计再将被压测的部署环境硬件规格再次提升的话,KaiwuDB 的性能还可能会继续增长。这就充分证明了KaiwuDB的性能与技术实力能为用户在高性能时序数据管理方面提供可靠选择。