mycat分布式mysql中间件(导入和扩容迁移性能压测)


Mycat对于导入和扩容迁移性能压测(转)

1.      测试环境

wKioL1ZvZwDwviMxAAB7IE8flZs787.png

 

1.1.    硬件环境

机器ip

OS

CPU

CPU Processors

内存

172.16.54.135

CentOS Linux release 7.1.1503

Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz

24

64G

172.16.54.136

CentOS Linux release 7.1.1503

Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz

24

64G

172.16.54.138

CentOS Linux release 7.1.1503

Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz

24

64G

1.2.    软件环境

软件名称

版本

Jdk

1.8.0_45

Mycat

1.4.1

Mysql

5.6

PostgreSQL

9.2.14





 

2.      对于Mysql压测

2.1.    基本配置

  • wrapper.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Java AdditionalParameters
#wrapper.java.additional.1=
wrapper.java.additional.1=-DMYCAT_HOME=.
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:MaxPermSize=64M
wrapper.java.additional.4=-XX:+AggressiveOpts
wrapper.java.additional.5=-XX:MaxDirectMemorySize=5G
wrapper.java.additional.6=-Dcom.sun.management.jmxremote
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984
wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false
# Initial JavaHeap Size (in MB)
#wrapper.java.initmemory=3
wrapper.java.initmemory=3072
# Maximum JavaHeap Size (in MB)
#wrapper.java.maxmemory=64
wrapper.java.maxmemory=3072
  • schema.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<schemaname="testdb" checkSQLschema="false"sqlMaxLimit="100">
                <table name="user"dataNode="dn1,dn2" rule="mod-long"/>
        </schema>
        <dataNode name="dn1"dataHost="mycat" database="db1"/>
        <dataNode name="dn2"dataHost="mycat2" database="db1"/>
  
        <dataHost name="mycat"maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native"
                       switchType="1">
                <heartbeat>selectuser()</heartbeat>
                <writeHosthost="host1" url="dev-2:3306" user="test"password="test"/>
        </dataHost>
         <dataHost name="mycat2"maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native"
                        switchType="1">
                <heartbeat>selectuser()</heartbeat>
                <writeHosthost="host2" url="dev-3:3306" user="test"password="test"/>
        </dataHost>
  • 数据库脚本

1
2
create databasedb1;
create tabledb1.user(id int, user_name varchar(20), email varchar(20), phone varchar(20));

2.2.    导入方案

由于Mycat支持Mysql协议,所以Mycat对于Mysql数据导入方案有三种:

  1. jdbc直接进行insert操作

根据官网测试结果:在16核上insert性能可以达到12w/s

wKioL1ZvZwCw4pmjAABeMutFtcg198.png

本轮测试数据量200w,测试工具为testtool.tar.gz。结论:tps8w

wKiom1ZvZvrC1jXAAACBEVY0qi0693.png

  1. mysqldump操作

mysqldump操作原理与insert相同,数据量100w,没有预热。结论tps3w

wKioL1ZvZwHS-xmqAAAW-FpTwYI295.png

  1. load data infile操作

官网说法:是insert性能的几十倍,如下

wKiom1ZvZvuzObiNAAA3cGJ25lg440.png

wKiom1ZvZ6eTemSWAABGf8yqJlY022.png

Load data功能在1.4版本+支持,经过测试发现,如果导入数据量比较大(大于10w),则会出现文件找不到情况,官网群中有人出现同样问题,原因待查。

wKioL1ZvZwPx4QuMAAAbAYM8cNA420.png

根据其他人测试结果:loaddata local infile命令64M23万条数据用到500M内存

wKioL1ZvZwTDu42jAACNVRp-IJE799.png

2.3.  扩容迁移方案

wKioL1ZvZwTwfTOJAAB7-eCzLLU474.png

schema db1迁移扩容到db2。由于mycql不支持自动扩容,所以需要手动进行rehash

wKiom1ZvZv6BWSsTAAB2lJESDaM822.png

目前方案有:

  1. 将数据导出本分,清空数据,通过上述导入方案的三种方式进行扩容迁移

性能结果如上测试

  1. 手动迁移(注意:此方案只适合单节点迁移):

  2. 1)        使用mycatRehashLauncher重新进行hash算法,得出rehashid列表

  3. 2)        mysql上使用mysqldump根据rehashid列表,导出数据

  4. 3)        mycatmysqldump,导入数据

  5. 4)        mysql上删除迁移的数据

对于1)步骤,有2bug

  • 取得id值时错误

bug已经提交到mycate1.4mycat master分支,并已合并

wKiom1ZvZv-htqNWAAA-NGcWl6U492.png

  • hash后的host比较错误

bug已经提交到1.4分支,并已合并

wKiom1ZvaDfApeUmAAAxNFEbFKQ567.png

         对于2),3),4)步骤可以采用shell脚本自动运行,官网脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94