Mycat 之路 | 性能测试

一、MyCat 性能测试概述

Mycat自身提供了一套基准性能测试工具,这套工具可以用于性能测试、疲劳测试等,包括分片表插入性能测试、分片表查询性能测试、更新性能测试、全局表插入性能测试等基准测试工具。 这里需要说明的一点是,分片表的性能测试不同于普通单表,因为它的数据是分布在几个Datahost上的,因此插入和查询,都必需要特定的工具,才能做到多个节点同时负载请求,通过观察每个主机的负载,能够确定是否你的测试是合理和正确的。

大量测试表明,当带宽不是问题而且带宽没有占满,比如千兆网网络连接的Mycat和MySQL服务器,以及测试客户端,(通常个人电脑到服务器的连接为100M),分片表的性能取决于后端部署MySQL的物理机的个数,比如每个MySQL的性能是5万Tps,则3台理论上是15万,而Mycat能达到80-95%之间,即12万以上。

关于带宽问题,是一个比较棘手的问题,通常需要监控交换机、MySQL服务器、Mycat服务器、以获取测试过程中的端口流量信息,才能确定是否带宽存在问题,另外,很多企业里,千兆交换机采用了百兆的普通网线的情况时有发生,防不胜防,所以,在不能控制的网络环境里,测试最大性能的目标通常无法实现。

另外,很多人测试的时候,并不知道MySQL直连的性能,因此无法正确比较Mycat的性能,所以,建议性能测试过程里,首先直连MySQL进行性能测试,可以同时直连多个MYSQL服务器,然后把测试结果累计,作为直连的性能指标,然后改为连接Mycat进行测试,这样的对比才是有价值的,当插件过大的时候,需要先排除是否存在MySQL冷热不均的现象,然后考虑Mycat性能调优。

二、MyCat 测试数据结构

表结构

DROP DATABASE IF EXISTS small;

USE small;

CREATE TABLE `tb_item` (
  `id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号',
  `title` varchar(100) NOT NULL COMMENT '商品标题',
  `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',
  `price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',
  `num` int(10) NOT NULL COMMENT '库存数量',
  `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除',
  `created` datetime NOT NULL COMMENT '创建时间',
  `updated` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `status` (`status`),
  KEY `updated` (`updated`)
) COMMENT='商品表';
三、MyCat 测试工具

1、测试工具介绍

测试工具在单独的包中(MyCat 社区提供),解压到任意机器中执行使用,跟MyCAT Server没有关联关系,此测试工具很强大,可以测试任意表,和任意数据库,测试工具下载: https://github.com/MyCATApache/Mycat-download/tree/master/1.6-RELEASE,其中的 testtool.tar.gz

解压后,在bin目录里运行下面文中的测试脚本:

2、标准插入性能测试脚本

test_stand_insert_perf.bat:支持任意表的定制化业务数据的随机生成功能,在sql模板文件中用${int(1-100)}这种变量,测试程序会随机生成符合要求的值并插入数据库。

test_stand_insert_perf.bat jdbc:mysql://192.168.134.128:8066/small root 123456 100 "file=test-create.sql"
  
参数解释:

System.out.println("input param,format: [jdbcurl] [user] [password]  [threadpoolsize]  [recordrange or customer sql file] ");
System.out.println("jdbc:mysql://localhost:8066/TESTDB test test 10  \"0-300M,300M1-600M,600M1-900M\" ");
System.out.println("jdbc:mysql://localhost:8066/TESTDB test test 10  file=mytempate.sql ");

jdbcurl:连接mycat的地址,格式为jdbc:mysql://localhost:8066/TESTDB 
user:连接Mycat的用户名 
password:密码 
threadpoolsize:并发线程请求,可以在50-2000左右调整,看看哪种情况下的性能最好 
recordrange:插入的分片系列以及对应的ID范围,minId-maxId然后逗号分开,对应多组分片的ID范围,如 0-200000,200001-400000,400001-600000,跟分片配置保持一致。也可以使用自定义sql

其中 test-create.sql 的内容如下:

total=2000000
sql=INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (${int(0-9999)}${date(HHmmssSSS)}, '${char([A-Z,0-9]16:16)}', '${char([a-z,0-9]16:16)}', ${int(1111-9999)}, ${int(1111-9999)}, '${char([A-Z,0-9]16:16)}', '${char([a-f,0-9]16:16)}.jpg', ${int(0-9999)}, '${int(1-3)}', '${date(yyyyMMddHHmmss-[2000-2017]y)}', '${date(yyyyMMddHHmmss-[2000-2017]y)}');

目前支持的有以下类型变量:

  • Int:${int(..)}可以是${int(10-999)}或者${int(10,999)}前者表示从10到999的值,后者表示10或者999;
  • Date:日期如${date(yyyyMMddHHmmssSSS-[2014-2015]y)}表示从2014到2015年的时间,前面是输出格式,符合Java标准;
  • Char:字符串${char([0-9]2:2)}表示从0到9的字符,长度为2位(2:2),${char([a-f,0-9]8:8)}表示从a到f以及0到9的字符串随机组成,定常为8位;
  • Enmu:枚举,表示从指定范围内获取一个值,${enum(0000,0001,0002)}里面可以是任意字符串或数字等内容。
3、标准查询性能测试脚本

test_stand_select_perf.bat也支持sqlTemplate的变量方式,查询任意指定的sql 。

test_stand_select_perf.bat jdbc:mysql://192.168.134.128:8066/small root 123456 100 100 "file=test-select.sql"

其中test-select.sql的内容类似下面:

sql=select ID,TITLE,SELL_POINT,PRICE from TB_ITEM where id = ${int(0-99999)}${date(mmssSSS)}; 

表明查询id为${int(0-9999)}${date(HHmmssSSS)的随机SQL。

注意:Windows下file=xxx.slq需要加引号

四、测试环境

测试环境介绍:在一台普通PC机上,使用 VMware 虚拟了四台服务器。

PC机配置:

  • 内存:8G
  • 处理器:i5-6300HQ CPU @ 2.30GHz 2.30GHz
  • 系统类型:Windows 10 家庭中文版(64位)

MyCat 服务器配置:

  • 内存:3G
  • 处理器:4核
  • 硬盘:15G

mysql 服务器配置(三台机器配置相同):

  • 内存:1G
  • 处理器:4核
  • 硬盘:15G

MyCat 测试环境:

此表的标准分片方式为基于ID的 hash 分片策略。Schema.xml中配置如下:

<table name="tb_item" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8" rule="rule1" />
                   +-------------+
                   | 测试工具(PC) |
                   +-------------+
                          |
                  192.168.|134.128
                   +-------------+
                   | MyCat:small |
                   +-------------+
                          |
        ------------------+-----------------
        |                                  |
192.168.|134.131                   192.168.|134.132
+---------------+                   +---------------+
|db1,db3,db5,db7|                   |db2,db4,db6,db8|
+---------------+                   +---------------+

mysql 测试环境:

                   +-------------+
                   | 测试工具(PC) |
                   +-------------+
                          |
                  192.168.|134.133
                   +-------------+
                   | mysql:small |
                   +-------------+
五、测试结果

1、分片表的录入性能测试

insert:250 线程,300万数据(tps)

环境\数据量50万100万150万200万250万300万
MyCat22211104542321220163
mysql4824676321203137105

2、分片表的查询性能测试

select:250 线程,300万数据(qps)

环境\数据量50万100万150万200万250万300万
MyCat******
mysql******

六、测试注意事项

  1. 测试过程: 每次测试,建议先执行重建表的操作,以保证测试环境的一致性;
  2. 首先参考MyCAT性能调优,确保整个系统达到最优配置;
  3. 性能测试,建议先小规模压力预热10-20分钟,这是众所周知的Java的特性,越跑越快;
  4. 带宽应该是至少100M,建议千兆;
  5. 压力程序在另一台,压力程序的机器也可以由性能差的机器来代替;
  6. 有条件的话,分片库在不同的MYSQL实例上,如20个分片,每个MYSQL实例7个分片,而且最好有多台MYSQL物理机。
七、MyCat 并发

并发线程数表明同时至少有多少个Mysql连接会被打开,当SQL不跨分片的时候,并发线程数=MYSQL连接数。在Mycat conf/schema.xml中,将minCon设置为>=并发连接数,这种情况下重启MYCAT,会初始建立minCon个连接,并发测试结果更好。另外,也可以验证是否当前内存设置,以及MYSQL是否支持开启这么多连接,若无法支持,则logs/mycat.log日志中会有告警错误信息,建议测试过程中tail –f logs/mycat.log 观察有无错误信息。

另外,开启单独的Mycat管理窗口,mysql –utest –ptest –P9066 然后运行 show @@datasource 可以看到后端连接的使用情况。Show @@threadpool 可以看线程和SQL任务积压的情况。 也可以同时启动多个测试程序,在不同的机器上,并发进行测试,每个测试程序写入一个分片的数据范围,对于1个亿的数据插入测试来说,可能效果更好,毕竟单机并发线程50个左右已经差不多极限。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值