数据集成性能测试 #
测试方案一:数据导出 #
数据迁移,将单库单表 36G 的数据量(1 亿 4 千万行)迁移到目标源上。
测试目的 #
当数据数据达到一定量级后,数据库的性能会显著下降,数据库的读写操作后会随之受到影响。在不影响业务场景操作的情况下,我们通过使用 DBPlusEngine-Proxy 的 scaling 功能将原数据迁移到多个目标库中。
测试工具 #
Sysbench
测试环境 #
应用 | IP地址 | 端口 |
---|---|---|
DBPlusEngine-Proxy | 192.168.xx.25 | 3307 |
MySQL | 192.168.xx.20 | 13306 |
MySQL | 192.168.xx.21 | 13306 |
MySQL | 192.168.xx.22 | 13306 |
MySQL | 192.168.xx.23 | 13306 |
MySQL | 192.168.xx.24 | 13306 |
服务器配置
条目 | 配置 |
---|---|
CPU | 48 C |
内存 | 96 G |
硬盘 | SSD 820 G |
JDK | 17.0.2 |
测试步骤 #
- 创建测试表。
mysql -utest -h192.168.xx.20 -P13306 -p
DROP DATABASE IF EXISTS migration_ds_0;
CREATE DATABASE IF NOT EXISTS migration_ds_0;
mysql -utest -h192.168.xx.21 -P13306 -p
DROP DATABASE IF EXISTS migration_ds_1;
CREATE DATABASE IF NOT EXISTS migration_ds_1;
mysql -utest -h192.168.xx.22 -P13306 -p
DROP DATABASE IF EXISTS migration_ds_2;
CREATE DATABASE IF NOT EXISTS migration_ds_2;
mysql -utest -h192.168.xx.23 -P13306 -p
DROP DATABASE IF EXISTS migration_ds_3;
CREATE DATABASE IF NOT EXISTS migration_ds_3;
mysql -utest -h192.168.xx.24 -P13306 -p
DROP DATABASE IF EXISTS migration_ds_4;
CREATE DATABASE IF NOT EXISTS migration_ds_4;
mysql -uroot -h192.168.xx.25 -P3307 -proot
DROP DATABASE IF EXISTS sphereex_demo;
CREATE DATABASE IF NOT EXISTS sphereex_demo;
- 安装测试工具。
tar -xzvf sysbench-1.0.20.tar.gz -C /usr/local
cd /usr/local/sysbench-1.0.20
./autogen.sh
./configure
make && make install
- 数据准备。
使用 Sysbench 工具向源端数据库插入 140,000,000 的数据。
sysbench oltp_read_only --mysql-host='192.168.xx.20' --mysql-port=13306 --mysql-user=test --mysql-password='test' --mysql-db=migration_ds_0 --tables=1 --table-size=140000000 --report-interval=10 --time=3600 --threads=256 --max-requests=0 --percentile=99 --mysql-ignore-errors="all" --rand-type=uniform --range_selects=off --auto_inc=off cleanup
sysbench oltp_read_only --mysql-host='192.168.xx.20' --mysql-port=13306 --mysql-user=test --mysql-password='test' --mysql-db=migration_ds_0 --tables=1 --table-size=140000000 --report-interval=10 --time=3600 --threads=256 --max-requests=0 --percentile=99 --mysql-ignore-errors="all" --rand-type=uniform --range_selects=off --auto_inc=off prepare
- 迁移过程。
通过 Proxy,新建逻辑数据库并配置好资源和规则。
mysql -uroot -h 192.168.xx.25 -P3307 -proot
CREATE DATABASE sphereex_demo;
USE sphereex_demo;
REGISTER STORAGE UNIT ds_0 (
URL="jdbc:mysql://192.168.xx.20:13306/migration_ds_0?serverTimezone=UTC&useSSL=false",
USER="test",
PASSWORD="test",
PROPERTIES("maximumPoolSize"=500,"idleTimeout"=60000)
);
添加目标源。
REGISTER STORAGE UNIT ds_1 (
URL="jdbc:mysql://192.168.xx.21:13306/migration_ds_1?serverTimezone=UTC&useSSL=false",
USER="test",
PASSWORD="test",
PROPERTIES("maximumPoolSize"=50,"idleTimeout"="60000")
), ds_2 (
URL="jdbc:mysql://192.168.xx.22:13306/migration_ds_2?serverTimezone=UTC&useSSL=false",
USER="test",
PASSWORD="test",
PROPERTIES("maximumPoolSize"=50,"idleTimeout"="60000")
), ds_3 (
URL="jdbc:mysql://192.168.xx.23:13306/migration_ds_3?serverTimezone=UTC&useSSL=false",
USER="test",
PASSWORD="test",
PROPERTIES("maximumPoolSize"=50,"idleTimeout"="60000")
), ds_4 (
URL="jdbc:mysql://192.168.xx.24:13306/migration_ds_4?serverTimezone=UTC&useSSL=false",
USER="test",
PASSWORD="test",
PROPERTIES("maximumPoolSize"=50,"idleTimeout"="60000")
);
创建规则。
CREATE SHARDING TABLE RULE sbtest1(
STORAGE_UNITS(ds_1,ds_2,ds_3,ds_4),
SHARDING_COLUMN=id,
TYPE(NAME="hash_mod",PROPERTIES("sharding-count"=4)),
KEY_GENERATE_STRATEGY(COLUMN=id,TYPE(NAME="snowflake"))
);
添加迁移配置。
ALTER MIGRATION RULE (
READ(
WORKER_THREAD=40,
BATCH_SIZE=1000,
SHARDING_SIZE=7000000
),
WRITE(
WORKER_THREAD=40,
BATCH_SIZE=1000
)
);
配置源端资源。
REGISTER MIGRATION SOURCE STORAGE UNIT ds_0 (
URL="jdbc:mysql://192.168.xx.20:13306/migration_ds_0?serverTimezone=UTC&useSSL=false",
USER="test",
PASSWORD="test",
PROPERTIES("maximumPoolSize"=50,"idleTimeout"="60000")
);
启动执行任务。
MIGRATE TABLE ds_0.sbtest1 INTO sbtest1;
测试结果 #
整体迁移时间 10 min 49 s。
测试结论:在此配置下计算节点先达到瓶颈。
监控信息 #
Source DB
DBPlusEngine-Proxy
One of target DB
名词解释 #
id:迁移任务标识。
tables:所迁移的表名称。
job_item_count:迁移作业分片数。
active:迁移任务是否进行,false 代表禁用不再运行。
create_time:迁移任务开始时间。
stop_time:迁移任务结束时间。
测试方案二:数据导入 #
使用 JMH 结合 DB Plus Engine-Driver,向数据库表中插入数据,插入时长 5 分钟,并统计插入数据量。
使用 JMH 直接向 MySQL 插入数据,时长 5 分钟,并统计插入数据量。
测试目的 #
对比两种导数方式,得到:
- 计算出 DBPlusEngine-Driver 的性能指标
- 对比 MySQL 原生插入性能损耗
测试工具 #
JMH
测试环境 #
应用 | IP 地址 | 端口 | 版本 |
---|---|---|---|
DBPlusEngine-Driver | 192.168.xx.24 | 3307 | 1.2 |
MySQL | 192.168.xx.20 | 13306 | 8.0.29 |
服务器配置
条目 | 配置 |
---|---|
CPU | 48 C |
内存 | 96 G |
硬盘 | SSD 820 G |
JDK | 17.0.2 |
主要参数
--Dtables=1
,表数量-f 1
,执行次数-r 300
,执行时间-t 128
,使用线程数-w 0
,预热次数
测试步骤 #
- 创建测试库。
mysql -utest -h192.168.xx.20 -P13306 -p
DROP SCHEMA IF EXISTS insert_db;
CREATE TABLE `sbtest1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`k` int NOT NULL DEFAULT '0',
`c` char(255) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=1;
- 安装测试工具。
提示:用户需要提前配置 JAVA 及 MAVEN 环境,本示例中使用 openjdk 17.0.2
、 Apache Maven 3.6.3
。
DBPlusEngine-Driver 构建。
用户可自行编写基于 JMH 框架的测试用例,也可用以下代码编译出 JMH 的测试用例集:
git clone https://github.com/SphereEx-QE/database-jmh.git
cd database-jmh/jmh-shardingsphere5
mvn clean package && cd target
testssj.yaml 配置:
dataSources:
write_ds:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.xx.20:13306/insert_db?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: root
password: root
maximumPoolSize: 300
minimumIdle: 1
rules: []
props:
mysql.properties 配置:
jdbc-url=jdbc:mysql://192.168.xx.21:13306/pure_mysql?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
- 执行测试。
在如下命令中传递 test.yaml 的路径参数以及其他 JMH 的参数(附录)
# 如果想了解 JMH 的参数,可以在下面的命令后加 -help 查看
java -classpath 'dependency/*:jmh-shardingsphere5-1.0-SNAPSHOT.jar' -Dshardingsphere.configurationFile=/root/testssj.yaml -Dtables=1 org.openjdk.jmh.Main "com.sphereex.jmh.shardingsphere5.ShardingSphereInsertOnlyBenchmark" -f 1 -i1 -r200 -t 100 -wi 0
java -classpath 'dependency/*:jmh-jdbc-1.0-SNAPSHOT.jar' -Dconf=/root/mysql.properties -Dtables=1 org.openjdk.jmh.Main "com.sphereex.jmh.jdbc.UnpooledReadOnlyBenchmarkJDBC" -f 1 -i1 -r200 -t 100 -wi 0
测试结果 #
测试对象 | TPS | Rows Count |
---|---|---|
DBPlusEngine-Driver | 46,055 | 13,821,323 |
MySQL | 46,402 | 13,909,701 |
结论:通过对比 DBPlusEngine-Driver & MySQL 插入情况,说明 DBPlusEngine-Driver 几乎无性能损耗。
该结论仅供参考,用户可以根据实际业务情况,实际场景进行测试。
监控信息 #
DBPlusEngine-Driver
MySQL
名词解释 #
TPS:每秒的事务处理数