Mycat对于导入和扩容迁移性能压测(转)
1. 测试环境
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数据导入方案有三种:
-
用jdbc直接进行insert操作
根据官网测试结果:在16核上insert性能可以达到12w/s
本轮测试数据量200w,测试工具为testtool.tar.gz。结论:tps约8w
-
用mysqldump操作
mysqldump操作原理与insert相同,数据量100w,没有预热。结论tps:3w
-
用load data infile操作
官网说法:是insert性能的几十倍,如下
Load data功能在1.4版本+支持,经过测试发现,如果导入数据量比较大(大于10w),则会出现文件找不到情况,官网群中有人出现同样问题,原因待查。
根据其他人测试结果:loaddata local infile命令64M23万条数据用到500多M内存
2.3. 扩容迁移方案
从schema db1迁移扩容到db2。由于mycql不支持自动扩容,所以需要手动进行rehash。
目前方案有:
-
将数据导出本分,清空数据,通过上述导入方案的三种方式进行扩容迁移
性能结果如上测试
-
手动迁移(注意:此方案只适合单节点迁移):
-
1) 使用mycat的RehashLauncher重新进行hash算法,得出rehash的id列表
-
2) 在mysql上使用mysqldump根据rehash的id列表,导出数据
-
3) 在mycat上mysqldump,导入数据
-
4) 在mysql上删除迁移的数据
对于1)步骤,有2个bug:
-
取得id值时错误
此bug已经提交到mycate1.4和mycat master分支,并已合并
-
hash后的host比较错误
此bug已经提交到1.4分支,并已合并
对于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
|