**大纲 **
第一 MYCAT 背景
第二 MYCAT 发展
第三 MYCAT 简介
第四 MYCAT特性
第五 MYCAT安装使用
第六 MYCAT和COBAR 比较
第七 参考
**一,**背景
随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:
(1)集中式处理,势必造成性能瓶颈;
(2)应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性不高;
(3)集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。
在这种形势下,集中式数据库将向分布式数据库发展。
二,发展
MyCAT的诞生,要从其前身Amoeba和Cobar说起。
Amoeba(变形虫)项目,该开源框架于2008年开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上面使用。
阿里巴巴于2012年6月19****日,正式对外开源的数据库中间件Cobar,前身是早已经开源的Amoeba,不过其作者陈思儒离职去盛大之后,阿里巴巴内部考虑到Amoeba的稳定性、性能和功能支持,以及其他因素,重新设立了一个项目组并且更换名称为Cobar。Cobar 是由 Alibaba 开源的 MySQL 分布式处理中间件,它可以在分布式的环境下看上去像传统数据库一样提供海量数据服务。
Cobar自诞生之日起, 就受到广大程序员的追捧,但是自2013年后,几乎没有后续更新。在此情况下,MyCAT应运而生,它基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能,以及众多成熟的使用案例使得MyCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,MyCAT能看到更远。目前MyCAT的最新发布版本为1.3.0.2版本。
三, MYCAT简介
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。
Mycat 被描述和定义如下:
1 一个彻底开源的,面向企业应用开发的大数据库集群
2 支持事务、ACID、可以替代MySQL的加强版数据库
3 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
4 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
5 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
6 一个新颖的数据库中间件产品
** 四,Mycat关键特性 **
支持SQL92标准
1 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
2 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
3 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
4 基于Nio实现,有效管理线程,高并发问题。
5 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
6 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
7 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
8 支持多租户方案。
9 支持分布式事务(弱xa)。
10 支持全局序列号,解决分布式下的主键生成问题。
11 分片规则丰富,插件化开发,易于扩展。
12 强大的web,命令行监控。
13 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
14 支持密码加密
15 支持服务降级
16 支持IP白名单
17 支持SQL黑名单、sql注入攻击拦截
18 支持分表(1.6)
19 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
五,安装使用
A 测试环境:
有3张表 users,item,item_detail (item 的子表) 和 3 个数据库 db01,db02,db03
表 users 存储在数据库 db01, 表 item 和 item_detail 分布存储在数据 db01 和 db02
现在在3个数据库都创建相同的表
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 1create database db01;
2
3create database db02;
4
5create database db03;
6
7
8
9CREATE TABLE users (
10
11 id INT NOT NULL AUTO_INCREMENT,
12
13 name varchar(50) NOT NULL default '',
14
15 indate DATETIME NOT NULL default '0000-00-00 00:00:00',
16
17 PRIMARY KEY (id)
18
19)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
20
21
22
23CREATE TABLE item (
24
25 id INT NOT NULL AUTO_INCREMENT,
26
27 value INT NOT NULL default 0,
28
29 indate DATETIME NOT NULL default '0000-00-00 00:00:00',
30
31 PRIMARY KEY (id)
32
33)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
34
35
36
37CREATE TABLE item_detail (
38
39 id INT NOT NULL AUTO_INCREMENT,
40
41 value INT NOT NULL default 0,
42
43 name varchar(50) NOT NULL default '',
44
45 item_id INT NOT NULL,
46
47 PRIMARY KEY (id),
48
49 key (item_id)
50
51)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
52
53
** B JDK 安装配置**
不在此安装演示
C Mycat 安装配置
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275 11. cd /usr/local/src
21. tar xvf Mycat-server-1.5.1-RELEASE-20160405120037-linux.tar.gz
31. mv /usr/local/src/mycat /usr/local/
41.
51. groupadd mycat
61. useradd -g mycat mycat
71. passwd mycat
81. chown -R mycat.mycat /usr/local/mycat
9``
10
11
12添加环境变量
13
141. vi /etc/profile
151. vi ~/.bash_profile
161.
171. export MYCAT_HOME=/usr/local/mycat
18
19设置生效(最好重启系统)
20
21
22
231. source /etc/profile
241. source ~/.bash_profile
25
26**D 服务器名和IP绑定**
27
28
29
301. vi /etc/hosts
311. 192.168.100.50 server1
321. 127.0.0.1 server1
33
34设置 wrapper.java.command 的java 路径
35
36 ( 同时可设置 -Xmx 和 -Xms ,参考:**mycat 启动失败 The specified size exceeds the maximum representable size**)
37
38
39
401. vi /usr/local/mycat/conf/wrapper.conf
411.
421. wrapper.java.command=%JAVA_HOME%/bin/java
43
44配置 server.xml 和 schema.xml (本案例配置信息在文章底部)
45
46
47
481. vi /usr/local/mycat/conf/server.xml
491. vi /usr/local/mycat/conf/schema.xml
50
51启动mycat服务 ./mycat { console | start | stop | restart | status | dump }
52
53
54
551. /usr/local/mycat/bin/mycat console
561. \#mycat 进程
571. ps -ef | grep mycat
581.
591. \#日子信息
601. tail -20 /usr/local/mycat/logs/wrapper.log
61
62
63
64**E 测试**
65
66访问 mycat (凭据参考 /usr/local/mycat/conf/server.xml)
67
681. mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB
691. mysql> show databases;
701. +----------+
711. | DATABASE |
721. +----------+
731. | TESTDB |
741. +----------+
751.
761. mysql> show tables;
771. +------------------+
781. | Tables in TESTDB |
791. +------------------+
801. | item |
811. | item_detail |
821. | users |
831. +------------------+
84
85在 mycat 中插入数据并查询:
86
87
88
891. insert into users(name,indate) values('kk',now());
901. insert into item(id,value,indate) values(1,100,now());
911. insert into item_detail(value,name,item_id) values('pad',40,1);
921. insert into item_detail(value,name,item_id) values('phone',50,1);
931.
941. insert into item(id,value,indate) values(999,100,now());
951. insert into item_detail(value,name,item_id) values('pad',40,999);
961. insert into item_detail(value,name,item_id) values('phone',50,999);
97
98
99
1001. mysql> select \* from users;
1011. +----+------+---------------------+
1021. | id | name | indate |
1031. +----+------+---------------------+
1041. | 1 | kk | 2016-04-13 06:28:00 |
1051. +----+------+---------------------+
1061.
1071. mysql> select \* from item;
1081. +-----+-------+---------------------+
1091. | id | value | indate |
1101. +-----+-------+---------------------+
1111. | 999 | 100 | 2016-04-13 06:34:12 |
1121. | 1 | 100 | 2016-04-13 06:32:58 |
1131. +-----+-------+---------------------+
1141.
1151. mysql> select \* from item_detail;
1161. +----+-------+------+---------+
1171. | id | value | name | item_id |
1181. +----+-------+------+---------+
1191. | 1 | 0 | 40 | 999 |
1201. | 2 | 0 | 50 | 999 |
1211. | 1 | 0 | 40 | 1 |
1221. | 2 | 0 | 50 | 1 |
1231. +----+-------+------+---------+
124
125打开另一个终端,使用mysql账号登陆访问查看表情况
126
1271. mysql -uroot -ptest -p
128
129具体的表数据存储情况:
130
131
132
1331. -----------------------------------------
1341. mysql> select \* from db01.users;
1351. +----+------+---------------------+
1361. | id | name | indate |
1371. +----+------+---------------------+
1381. | 1 | kk | 2016-04-13 06:28:00 |
1391. +----+------+---------------------+
1401.
1411. mysql> select \* from db02.users;
1421.
1431. mysql> select \* from db03.users;
1441.
1451. -----------------------------------------
1461.
1471. mysql> select \* from db01.item;
1481.
1491. mysql> select \* from db02.item;
1501. +-----+-------+---------------------+
1511. | id | value | indate |
1521. +-----+-------+---------------------+
1531. | 999 | 100 | 2016-04-13 06:34:12 |
1541. +-----+-------+---------------------+
1551.
1561. mysql> select \* from db03.item;
1571. +----+-------+---------------------+
1581. | id | value | indate |
1591. +----+-------+---------------------+
1601. | 1 | 100 | 2016-04-13 06:32:58 |
1611. +----+-------+---------------------+
1621.
1631. -----------------------------------------
1641.
1651. mysql> select \* from db01.item_detail;
1661.
1671. mysql> select \* from db02.item_detail;
1681. +----+-------+------+---------+
1691. | id | value | name | item_id |
1701. +----+-------+------+---------+
1711. | 1 | 0 | 40 | 999 |
1721. | 2 | 0 | 50 | 999 |
1731. +----+-------+------+---------+
1741.
1751. mysql> select \* from db03.item_detail;
1761. +----+-------+------+---------+
1771. | id | value | name | item_id |
1781. +----+-------+------+---------+
1791. | 1 | 0 | 40 | 1 |
1801. | 2 | 0 | 50 | 1 |
1811. +----+-------+------+---------+
182
183
184
185测试完成,数据进行了分库分表。
186
187 server.xml 和 schema.xml 配置情况
188
1891. \# vi /usr/local/mycat/conf/server.xml
1901.
1911. <?xml version="1.0" encoding="UTF-8"?>
1921. <!DOCTYPE mycat:server SYSTEM "server.dtd">
1931. <mycat:server xmlns:mycat="http://org.opencloudb/">
1941. <system>
1951. <!--
1961. <property name="processors">32</property>
1971. <property name="processorExecutor">32</property>
1981. <property name="bindIp">0.0.0.0</property>
1991. <property name="frontWriteQueueSize">4096</property>
2001. <property name="idleTimeout">300000</property>
2011. <property name="mutiNodePatchSize">100</property>
2021. -->
2031. <property name="defaultSqlParser">druidparser</property>
2041. <property name="mutiNodeLimitType">1</property>
2051. <property name="serverPort">8066</property>
2061. <property name="managerPort">9066</property>
2071. </system>
2081. <!-- 任意设置登陆 mycat 的用户名,密码,数据库 -->
2091. <user name="test">
2101. <property name="password">test</property>
2111. <property name="schemas">TESTDB</property>
2121. </user>
2131.
2141. <user name="user">
2151. <property name="password">user</property>
2161. <property name="schemas">TESTDB</property>
2171. <property name="readOnly">true</property>
2181. </user>
2191. <!--
2201. <quarantine>
2211. <whitehost>
2221. <host host="127.0.0.1" user="mycat"/>
2231. <host host="127.0.0.2" user="mycat"/>
2241. </whitehost>
2251. <blacklist check="false"></blacklist>
2261. </quarantine>
2271. -->
2281. </mycat:server>
229
230
231
2321. \# vi /usr/local/mycat/conf/schema.xml
2331.
2341. <?xml version="1.0"?>
2351. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
2361. <mycat:schema xmlns:mycat="http://org.opencloudb/">
2371.
2381. <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致 -->
2391. <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
2401. <table name="users" primaryKey="id" type="global" dataNode="node_db01" />
2411.
2421. <table name="item" primaryKey="id" dataNode="node_db02,node_db03" rule="mod-long">
2431. <childTable name="item_detail" primaryKey="id" joinKey="item_id" parentKey="id" />
2441. </table>
2451. </schema>
2461.
2471. <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->
2481. <dataNode name="node_db01" dataHost="dataHost01" database="db01" />
2491. <dataNode name="node_db02" dataHost="dataHost01" database="db02" />
2501. <dataNode name="node_db03" dataHost="dataHost01" database="db03" />
2511.
2521. <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
2531. <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
2541. <heartbeat>select user()</heartbeat>
2551. <writeHost host="server1" url="127.0.0.1:3306" user="root" password="mysql"/>
2561. </dataHost>
2571. </mycat:schema>
258
259### **六,MYCAT和COBAR 比较**
260
2611 mycat 比cobar 推出比较晚,mycat 有很多 后者没有的功能
262
2632 mycat 以cobar为基础做了改进和优化,系统架构基本一致,都比较成熟。
264
2653 主流程中的类名,接口名,函数名以及之间的调用关系基本一致。
266
2674 对于 Cobar 前端BIO 实现方式,一个并发连接就要阻塞一个线程,而JVM线程数是有限的,所以Cobar与DBServer 执行时慢,会导致Cobar无响应,即假死。为此Mycat 版本做了较大改进,改进为AIO ,并发连接数上线过万。另外,NIO改为AIO,对于内核的slelect 改为epoll:一是进一步提高了IO效率:二是简化了API调用,至少应用不需要一个额外的线程进程循环等等读。
2685 Cobar 仅仅是结果的简单集合,并没有排序,函数归并等功能,例如:max,count函数都不支持,Mycat 为此增加DataMergeService
269
2706 Cobar处于停滞状态,MyCAT社区非常活跃
271
272
273
274
275