您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
测试引擎——性能测试
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
测试引擎——性能测试
Apache ShardingSphere
2021-01-19
IP归属:未知
94840浏览
## 目标 对ShardingSphere-JDBC,ShardingSphere-Proxy及MySQL进行性能对比。从业务角度考虑,在基本应用场景(单路由,主从+加密+分库分表,全路由)下,INSERT+UPDATE+DELETE通常用作一个完整的关联操作,用于性能评估,而SELECT关注分片优化可用作性能评估的另一个操作;而主从模式下,可将INSERT+SELECT+DELETE作为一组评估性能的关联操作。 为了更好的观察效果,设计在一定数据量的基础上,使用jmeter 20并发线程持续压测半小时,进行增删改查性能测试,且每台机器部署一个MySQL实例,而对比MySQL场景为单机单实例部署。 ## 测试场景 ### 单路由 在1000数据量的基础上分库分表,根据`id`分为4个库,部署在同一台机器上,根据`k`分为1024个表,查询操作路由到单库单表; 作为对比,MySQL运行在1000数据量的基础上,使用INSERT+UPDATE+DELETE和单路由查询语句。 ### 主从 基本主从场景,设置一主库一从库,部署在两台不同的机器上,在10000数据量的基础上,观察读写性能; 作为对比,MySQL运行在10000数据量的基础上,使用INSERT+SELECT+DELETE语句。 ### 主从+加密+分库分表 在1000数据量的基础上,根据`id`分为4个库,部署在四台不同的机器上,根据`k`分为1024个表,`c`使用aes加密,`pad`使用md5加密,查询操作路由到单库单表; 作为对比,MySQL运行在1000数据量的基础上,使用INSERT+UPDATE+DELETE和单路由查询语句。 ### 全路由 在1000数据量的基础上,分库分表,根据`id`分为4个库,部署在四台不同的机器上,根据`k`分为1个表,查询操作使用全路由。 作为对比,MySQL运行在1000数据量的基础上,使用INSERT+UPDATE+DELETE和全路由查询语句。 ## 测试环境搭建 ### 数据库表结构 此处表结构参考sysbench的sbtest表 ```shell CREATE TABLE `tbl` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT 0, `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ); ``` ### 测试场景配置 ShardingSphere-JDBC使用与ShardingSphere-Proxy一致的配置,MySQL直连一个库用作性能对比,下面为四个场景的具体配置: #### 单路由配置 ```yaml schemaName: sharding_db dataSources: ds_0: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 ds_1: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 ds_2: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 ds_3: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 rules: - !SHARDING tables: tbl: actualDataNodes: ds_${0..3}.tbl${0..1023} tableStrategy: standard: shardingColumn: k shardingAlgorithmName: tbl_table_inline keyGenerateStrategy: column: id keyGeneratorName: snowflake defaultDatabaseStrategy: standard: shardingColumn: id shardingAlgorithmName: default_db_inline defaultTableStrategy: none: shardingAlgorithms: tbl_table_inline: type: INLINE props: algorithm-expression: tbl${k % 1024} default_db_inline: type: INLINE props: algorithm-expression: ds_${id % 4} keyGenerators: snowflake: type: SNOWFLAKE props: worker-id: 123 ``` #### 主从配置 ```yaml schemaName: sharding_db dataSources: primary_ds: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 replica_ds_0: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 rules: - !REPLICA_QUERY dataSources: pr_ds: name: pr_ds primaryDataSourceName: primary_ds replicaDataSourceNames: - replica_ds_0 ``` #### 主从+加密+分库分表配置 ```yaml schemaName: sharding_db dataSources: primary_ds_0: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 replica_ds_0: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 primary_ds_1: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 replica_ds_1: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 primary_ds_2: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 replica_ds_2: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 primary_ds_3: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 replica_ds_3: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 rules: - !SHARDING tables: tbl: actualDataNodes: pr_ds_${0..3}.tbl${0..1023} databaseStrategy: standard: shardingColumn: id shardingAlgorithmName: tbl_database_inline tableStrategy: standard: shardingColumn: k shardingAlgorithmName: tbl_table_inline keyGenerateStrategy: column: id keyGeneratorName: snowflake bindingTables: - tbl defaultDataSourceName: primary_ds_1 defaultTableStrategy: none: shardingAlgorithms: tbl_database_inline: type: INLINE props: algorithm-expression: pr_ds_${id % 4} tbl_table_inline: type: INLINE props: algorithm-expression: tbl${k % 1024} keyGenerators: snowflake: type: SNOWFLAKE props: worker-id: 123 - !REPLICA_QUERY dataSources: pr_ds_0: primaryDataSourceName: primary_ds_0 replicaDataSourceNames: - replica_ds_0 loadBalancerName: round_robin pr_ds_1: primaryDataSourceName: primary_ds_1 replicaDataSourceNames: - replica_ds_1 loadBalancerName: round_robin pr_ds_2: primaryDataSourceName: primary_ds_2 replicaDataSourceNames: - replica_ds_2 loadBalancerName: round_robin pr_ds_3: primaryDataSourceName: primary_ds_3 replicaDataSourceNames: - replica_ds_3 loadBalancerName: round_robin loadBalancers: round_robin: type: ROUND_ROBIN - !ENCRYPT: encryptors: aes_encryptor: type: AES props: aes-key-value: 123456abc md5_encryptor: type: MD5 tables: sbtest: columns: c: plainColumn: c_plain cipherColumn: c_cipher encryptorName: aes_encryptor pad: cipherColumn: pad_cipher encryptorName: md5_encryptor props: query-with-cipher-column: true ``` #### 全路由 ```yaml schemaName: sharding_db dataSources: ds_0: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 ds_1: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 ds_2: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 ds_3: url: jdbc:mysql://***.***.***.***:****/ds?serverTimezone=UTC&useSSL=false username: test password: connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 200 rules: - !SHARDING tables: tbl: actualDataNodes: ds_${0..3}.tbl1 tableStrategy: standard: shardingColumn: k shardingAlgorithmName: tbl_table_inline keyGenerateStrategy: column: id keyGeneratorName: snowflake defaultDatabaseStrategy: standard: shardingColumn: id shardingAlgorithmName: default_database_inline defaultTableStrategy: none: shardingAlgorithms: default_database_inline: type: INLINE props: algorithm-expression: ds_${id % 4} tbl_table_inline: type: INLINE props: algorithm-expression: tbl1 keyGenerators: snowflake: type: SNOWFLAKE props: worker-id: 123 ``` ## 测试结果验证 ### 压测语句 ```shell INSERT+UPDATE+DELETE语句: INSERT INTO tbl(k, c, pad) VALUES(1, '###-###-###', '###-###'); UPDATE tbl SET c='####-####-####', pad='####-####' WHERE id=?; DELETE FROM tbl WHERE id=? 全路由查询语句: SELECT max(id) FROM tbl WHERE id%4=1 单路由查询语句: SELECT id, k FROM tbl ignore index(`PRIMARY`) WHERE id=1 AND k=1 INSERT+SELECT+DELETE语句: INSERT INTO tbl1(k, c, pad) VALUES(1, '###-###-###', '###-###'); SELECT count(id) FROM tbl1; SELECT max(id) FROM tbl1 ignore index(`PRIMARY`); DELETE FROM tbl1 WHERE id=? ``` ### 压测类 参考[shardingsphere-benchmark](https://github.com/apache/shardingsphere-benchmark/tree/master/shardingsphere-benchmark)实现,注意阅读其中的注释 ### 编译 ```shell git clone https://github.com/apache/shardingsphere-benchmark.git cd shardingsphere-benchmark/shardingsphere-benchmark mvn clean install ``` ### 压测执行 ```shell cp target/shardingsphere-benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar apache-jmeter-4.0/lib/ext jmeter –n –t test_plan/test.jmx test.jmx参考https://github.com/apache/shardingsphere-benchmark/tree/master/report/script/test_plan/test.jmx ``` ### 压测结果处理 注意修改为上一步生成的result.jtl的位置。 ```shell sh shardingsphere-benchmark/report/script/gen_report.sh ``` ### 历史压测数据展示 详见:https://shardingsphere.apache.org/benchmark/#/overview 是数据以天粒度展示
原创文章,需联系作者,授权转载
上一篇:一次MTU问题导致的RDS访问故障
下一篇:测试引擎——SQL解析/改写测试引擎
Apache ShardingSphere
文章数
96
阅读量
231327
作者其他文章
01
突破关系型数据库桎梏:云原生数据库中间件核心剖析
数据库技术的发展与变革方兴未艾,NewSQL的出现,只是将各种所需技术组合在一起,而这些技术组合在一起所实现的核心功能,推动着云原生数据库的发展。 NewSQL的三种分类中,新架构和云数据库涉及了太多与数据库相关的底层实现,为了保证本文的范围不至太过发散,我们重点介绍透明化分片数据库中间件的核心功能与实现原理,另外两种类型的NewSQL在核心功能上类似,但实现原理会有所差别。
01
Apache ShardingSphere数据脱敏全解决方案详解(上)
Apache ShardingSphere针对新业务上线、旧业务改造分别提供了相应的全套脱敏解决方案。
01
Shardingsphere整合Narayana对XA分布式事务的支持(4)
ShardingSphere对于XA方案,提供了一套SPI解决方案,对Narayana进行了整合,Narayana初始化流程,开始事务流程,获取连接流程,提交事务流程,回滚事务流程。
01
从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧
5.x 是 Apache ShardingSphere从分库分表中间件向分布式数据库生态转化的里程碑,从 4.x 版本后期开始打磨的可插拔架构在 5.x 版本已逐渐成型,项目的设计理念和 API 都进行了大幅提升。欢迎大家测试使用!
最新回复
丨
点赞排行
共0条评论
Apache ShardingSphere
文章数
96
阅读量
231327
作者其他文章
01
突破关系型数据库桎梏:云原生数据库中间件核心剖析
01
Apache ShardingSphere数据脱敏全解决方案详解(上)
01
Shardingsphere整合Narayana对XA分布式事务的支持(4)
01
从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号