目录
一、什么叫压测?
二、集群规划
三、搭建守护主备集群
四、TPCC测试准备
1、上传安装包
2、修改配置
五、TPCC测试
1、创建表空间/测试用户
2、建立测试表
3、装载数据
4、TPCC正常测试
5、TPCC摸高测试
6、TPCC故障转移测试(主机宕机)
7、TPCC故障转移测试(备机宕机)
六、总结
一、什么叫压测?
定义:压测,全称压力测试,是指通过模拟大量并发用户或高频率请求,对数据库系统施加超出日常业务水平的负载,以此评估系统在极限负载条件下的性能表现。
本次实战采用TPC-C基准测试规范开展压测,验证达梦守护主备集群的高可用能力,重点观测集群在故障转移过程中的业务抖动是否在可接受范围内。
二、集群规划
本次实战采用经典的两节点守护主备集群,提前规划好IP、端口及实例名。
| 机器1 | 机器2 | |
| 业务IP | 192.168.159.156 | 192.168.159.157 |
| 心跳IP | 192.168.159.156 | 192.168.159.157 |
| 实例名 | GRP1_RT_01 | GRP1_RT_02 |
| 实例端口 | 5236 | 5236 |
| MAL端口 | 5336 | 5336 |
| MAL守护进程端口 | 5436 | 5436 |
| 守护进程端口 | 5536 | 5536 |
| OGUID | 45331 | 45331 |
| 守护组 | GRP1 | GRP1 |
| 安装目录 | /home/dmdba/dmdbms | /home/dmdba/dmdbms |
| 实例目录 | /dmdata/data | /dmdata/data |
三、搭建守护主备集群
搭建守护主备集群并非本文重点,在此仅做概括性说明。详细步骤可参考达梦在线服务平台文档中的运维指南或搜索《守护主备集群搭建》相关博文进行搭建。
四、TPCC测试准备
1、上传安装包
将宿主机上的JDK压缩包、BenchmarkSQL源码包与Apache-Ant构建工具上传至Linux虚拟机。
JDK安装:将压缩包放置在/home目录下进行解压,随后在bash_profile文件中配置java环境变量,确保系统能够识别java和javac命令。
tar -zxvf jdk-8u202-linux-x64.tar.gz
vi .bash_profile
export JAVA_HOME=/home/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
source .bash_profile
BenchmarkSQL安装:将压缩包放置在/home目录下进行解压。
unzip benchmarksql-5.0.zip
Apache-Ant安装:将压缩包放置在/home目录下进行解压。Ant是一个Java构建工具,用于将 BenchmarkSQL的源码编译为可执行的字节码文件。
gzip -dc apache-ant-1.9.16-bin.tar.gz |tar xvf -
达梦数据库的JDBC驱动位于数据库安装目录的/drivers/jdbc下,将其拷贝到BenchmarkSQL 的/lib/dameng目录中,使BenchmarkSQL在编译和运行时能够识别达梦数据库。
mkdir -p /lib/dameng
cp /home/dmdba/dmdbms/drivers/jdbc/DmJdbDriver8.jar benchmarksql-5.0/lib/dameng
所有安装包统一放置在/home目录下,目录结构如下:
2、修改配置
BenchmarkSQL默认并未内置达梦数据库的支持,因此需要修改其源码中数据库类型识别模块,新增达梦数据库类型,确保编译和运行时能够正确加载达梦JDBC驱动。即:
vim /home/benchmarksql-5.0/src/client/jTPCC.java
进入BenchmarkSQL根目录,执行ant命令进行编译。
[root@dmtest01 benchmarksql-5.0] /home/apache-ant-1.9.16/bin/ant
Ant会将源码编译为字节码文件,并生成可执行的JAR包存放在benchmarksql/dist目录下。编译成功后,BenchmarkSQL即可与达梦数据库正常建立连接并执行测试。
接下来编写BenchmarkSQL的核心配置文件props.dm,该文件定义了压测的全部运行参数:
vi /home/BenchmarkSQL/run/props.dm
仓库数(warehouses)设为10,受限于测试环境的磁盘空间,;
终端数(terminals)设为12,模拟12个并发数据库连接;
测试时长(runMins)设为5分钟,每次压测持续运行5分钟;
事务权重按照TPCC标准配比:新订单(NEW_ORDER)占比45%,支付(PAYMENT)占比43%,订单查询(ORDER_STATUS)占比4%,发货(DELIVERY)占比4%,库存水平(STOCK_LEVEL)占比4%;
客户端还需配置dm_svc.conf文件,定义服务名DMDW对应主备节点的IP与端口。其中LOGIN_MODE=(0)表示客户端优先连接主库,若主库不可用,客户端会依次尝试连接服务名中定义的备库;同时设置尝试次数300次与重试间隔1秒,并开启自动重连机制,确保集群故障切换期间应用能自动恢复连接。
五、TPCC测试
环境准备就绪后,正式进入TPCC压测阶段。
1、创建表空间/测试用户
SQL> create tablespace "BENCHMARKSQL1" datafile 'tpcc.dbf' size 2048 CACHE = "NORMAL";
SQL > CREATE USER "BENCHMARKSQL" IDENTIFIED BY "******" DEFAULT TABLESPACE "BENCHMARKSQL1";
SQL> GRANT DBA TO BENCHMARKSQL;
2、建立测试表
BenchmarkSQL按照TPCC规范创建10张标准业务表,表结构涵盖订单处理全链路。
create
table BENCHMARKSQL.bmsql_config
(
cfg_name varchar(30) cluster primary key,
cfg_value varchar(50)
);
create
table BENCHMARKSQL.bmsql_warehouse
(
w_id integer not null,
w_ytd decimal(22, 2) ,
w_tax float ,
w_name varchar(10) ,
w_street_1 varchar(20) ,
w_street_2 varchar(20) ,
w_city varchar(20) ,
w_state char(2) ,
w_zip char(9) ,
cluster primary key(w_id)
)
STORAGE
(
FILLFACTOR 1
);
create
table BENCHMARKSQL.bmsql_district
(
d_w_id integer not null,
d_id integer not null,
d_ytd decimal(22, 2) ,
d_tax float ,
d_next_o_id integer ,
d_name varchar(10),
d_street_1 varchar(20),
d_street_2 varchar(20),
d_city varchar(20),
d_state char(2) ,
d_zip char(9) ,
cluster primary key(d_w_id, d_id)
)
STORAGE
(
FILLFACTOR 1
);
create
table BENCHMARKSQL.bmsql_customer
(
c_w_id integer not null ,
c_d_id integer not null ,
c_id integer not null ,
c_discount float ,
c_credit char(2) ,
c_last varchar(16) ,
c_first varchar(16) ,
c_credit_lim float ,
c_balance float ,
c_ytd_payment float ,
c_payment_cnt integer ,
c_delivery_cnt integer ,
c_street_1 varchar(20),
c_street_2 varchar(20),
c_city varchar(20),
c_state char(2) ,
c_zip char(9) ,
c_phone char(16) ,
c_since timestamp ,
c_middle char(2) ,
c_data varchar(500) ,
cluster primary key(c_w_id, c_d_id, c_id)
);
create
table BENCHMARKSQL.bmsql_history
(
hist_id integer,
h_c_id integer,
h_c_d_id integer,
h_c_w_id integer,
h_d_id integer,
h_w_id integer,
h_date timestamp,
h_amount float ,
h_data varchar(24)
)
storage
(
branch(32, 32),
without counter
);
create
table BENCHMARKSQL.bmsql_oorder
(
o_w_id integer not null,
o_d_id integer not null,
o_id integer not null,
o_c_id integer ,
o_carrier_id integer ,
o_ol_cnt float ,
o_all_local float ,
o_entry_d timestamp ,
cluster primary key(o_w_id, o_d_id, o_id)
)
storage
(
without counter
);
create
table BENCHMARKSQL.bmsql_new_order
(
no_w_id integer not null,
no_d_id integer not null,
no_o_id integer not null,
cluster primary key(no_w_id, no_d_id, no_o_id)
)
storage
(
without counter
);
create
table BENCHMARKSQL.bmsql_order_line
(
ol_w_id integer not null,
ol_d_id integer not null,
ol_o_id integer not null,
ol_number integer not null,
ol_i_id integer not null,
ol_delivery_d timestamp ,
ol_amount float ,
ol_supply_w_id integer ,
ol_quantity float ,
ol_dist_info char(24) ,
cluster primary key(ol_w_id, ol_d_id, ol_o_id, ol_number)
)
storage
(
without counter
);
create
table BENCHMARKSQL.bmsql_stock
(
s_w_id integer not null,
s_i_id integer not null,
s_quantity float ,
s_ytd float ,
s_order_cnt integer ,
s_remote_cnt integer ,
s_data varchar(50),
s_dist_01 char(24) ,
s_dist_02 char(24) ,
s_dist_03 char(24) ,
s_dist_04 char(24) ,
s_dist_05 char(24) ,
s_dist_06 char(24) ,
s_dist_07 char(24) ,
s_dist_08 char(24) ,
s_dist_09 char(24) ,
s_dist_10 char(24) ,
cluster primary key(s_w_id, s_i_id)
);
create
table BENCHMARKSQL.bmsql_item
(
i_id integer not null,
i_name varchar(24) ,
i_price float ,
i_data varchar(50) ,
i_im_id integer ,
cluster primary key(i_id)
);
3、装载数据
在BenchmarkSQL的run目录下执行runLoader.sh脚本,脚本会根据props.dm配置的仓库数量(10仓)随机生成测试数据并插入各张表中。
cd /home/benchmarksql-5.0/run/
./runLoader.sh props.dm
数据装载完成后,库内数据量达到一定规模,可有效模拟真实业务环境。
4、TPCC正常测试
在BenchmarkSQL的run目录下执行runBenchmark.sh脚本,执行标准TPCC压测任务。该脚本会按照props.dm配置文件设定的仓库数、并发终端数以及事务权重比例,持续对数据库施加5分钟的业务负载。
./runBenchmark.sh props.dm
压测期间,重点关注两项核心指标:
tpmC(每分钟处理的新订单事务数):这是TPCC标准中衡量数据库事务处理能力的核心指标,直接反映系统在处理复杂订单业务时的综合性能;
TPS(每秒事务数):即系统每秒完成的事务总量,涵盖新订单、支付、订单查询等全部五种事务类型,反映系统的整体吞吐能力。
本轮测试获取的性能数据作为基准基线,与后续摸高测试、故障转移测试中的结果进行横向对比,量化不同场景下的性能差异。
5、TPCC摸高测试
所谓摸高测试,是指在标准压测基础上不断加大负载压力,直至系统吞吐量触及上限。本次实战使用SQL脚本进行优化。
首先,将准备好的SQL脚本上传至/home/dmdba目录。该脚本包含两类优化措施:一是为TPCC业务表创建适配的索引,加速查询过滤与关联操作;二是调整SQL写法或执行计划,减少全表扫描或低效关联,从而降低高并发下的资源消耗。
SQL> start /home/dmdab/xxx.sql
SQL脚本执行成功后,dm.ini文件中的相关参数得到针对性优化,此时重新执行压仓操作,再次启动测试结果如下:
通过上述结果可以看出SQL脚本优化有效,tpmC与TPS都有一定程度地提高。
6、TPCC故障转移测试(主机宕机)
①测试步骤:
启动5分钟的压测任务。在压测进行约40秒时,手动停止机器1(主机)的数据库服务与守护进程,模拟主机突发故障:
systemctl stop DmServiceGRP_RT_01
systemctl stop DmWatcherServiceWatche
约60秒时,手动启动机器1的数据库服务与守护进程,模拟主机修复后重新加入集群:
systemctl start DmServiceGRP_RT_01
systemctl start DmWatcherServiceWatche
②现象与结果:
从40秒至60秒期间,TPS急剧下降至0,业务完全中断,对应集群检测故障、选举新主、完成主备切换的过程;
约60秒后,机器2(原备机)切换为新主库,业务恢复,TPS回升,此时集群处于单机模式,TPS较两节点更为平稳且略有提升;
机器1修复后重新加入集群,集群回归两节点模式,TPS出现小幅度波动,性能略有下降;
③结论:
单机模式的事务处理性能优于集群模式,但集群模式提供了高可用保障,故障转移控制在20秒内,对业务影响有限。主机宕机后,监视器自动完成切换,且客户端通过重连机制成功连接到新主库,验证了守护集群自动故障转移的有效性。
7、TPCC故障转移测试(备机宕机)
①测试步骤:
同样执行5分钟压测;在压测进行约25秒时,停止机器2(备机)的守护进程和数据库服务,模拟备机故障:
systemctl stop DmServiceGRP_RT_02
systemctl stop DmWatcherServiceWatcher
约70秒时,手动开启机器2的数据库服务与守护进程模拟备机修复后重新加入集群。
②现象与结果:
25秒至75秒,集群仅剩单主机运行,TPS曲线保持稳定,且未出现业务中断,数值明显高于双节点集群模式,印证了单机性能更优的结论;
约75秒后,备机恢复并重新加入集群,集群恢复两节点状态,TPS曲线出现短暂小幅波动。
③结论:
备机宕机不影响主机对外服务,业务连续性好;单机模式性能更优但失去冗余保护;集群模式在备机恢复后能快速完成数据同步并重新加入集群,具备良好的自愈能力。
六、总结
1、文章围绕达梦数据库守护主备集群,以TPCC标准压测为手段,系统地验证了集群在高负载下的性能表现与高可用能力;
2、无论是主机宕机还是备机宕机,集群能在十秒内完成故障检测与自动切换,业务中断时间可控;
3、单机模式性能优于集群模式,但集群模式提供了不可替代的冗余保护,生产环境需根据业务对RTO/RPO的要求综合选型;
4、更多细节及高级配置,请参阅达梦官方文档https://eco.dameng.com;