Logo
数据集成性能测试

数据集成性能测试 #

测试方案一:数据导出 #

数据迁移,将单库单表 36G 的数据量(1 亿 4 千万行)迁移到目标源上。

测试目的 #

当数据数据达到一定量级后,数据库的性能会显著下降,数据库的读写操作后会随之受到影响。在不影响业务场景操作的情况下,我们通过使用 DBPlusEngine-Proxy 的 scaling 功能将原数据迁移到多个目标库中。

测试工具 #

Sysbench

测试环境 #

应用IP地址端口
DBPlusEngine-Proxy192.168.xx.253307
MySQL192.168.xx.2013306
MySQL192.168.xx.2113306
MySQL192.168.xx.2213306
MySQL192.168.xx.2313306
MySQL192.168.xx.2413306

服务器配置

条目配置
CPU48 C
内存96 G
硬盘SSD 820 G
JDK17.0.2

测试步骤 #

  1. 创建测试表。
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;  
  1. 安装测试工具。
tar -xzvf sysbench-1.0.20.tar.gz -C /usr/local
cd /usr/local/sysbench-1.0.20
./autogen.sh
./configure 
make && make install                        
  1. 数据准备。

使用 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                                      
  1. 迁移过程。

通过 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-Driver192.168.xx.2433071.2
MySQL192.168.xx.20133068.0.29

服务器配置

条目配置
CPU48 C
内存96 G
硬盘SSD 820 G
JDK17.0.2

主要参数

  • --Dtables=1,表数量
  • -f 1,执行次数
  • -r 300,执行时间
  • -t 128,使用线程数
  • -w 0,预热次数

测试步骤 #

  1. 创建测试库。
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;   
  1. 安装测试工具。

提示:用户需要提前配置 JAVA 及 MAVEN 环境,本示例中使用 openjdk 17.0.2Apache 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
  1. 执行测试。

在如下命令中传递 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

测试结果 #

测试对象TPSRows Count
DBPlusEngine-Driver46,05513,821,323
MySQL46,40213,909,701

结论:通过对比 DBPlusEngine-Driver & MySQL 插入情况,说明 DBPlusEngine-Driver 几乎无性能损耗。

该结论仅供参考,用户可以根据实际业务情况,实际场景进行测试。

监控信息 #

DBPlusEngine-Driver

MySQL

名词解释 #

TPS:每秒的事务处理数