一、Mycat简介
MYCAT基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。
MYCAT对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。
MYCAT背后有一支强大的技术团队,其参与者都是5年以上资深软件工程师、架构师、DBA等,优秀的技术团队保证了MYCAT的产品质量。
MYCAT并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。
二、Mycat原理
三、Mycat解决问题
1.性能问题
2.数据库连接过多问题
四、Mycat架构
五、Mycat高可用
六、环境介绍
操作系统版本:Redhat 7.0
数据库版本:Mysql-5.6.24
Mycat版本:Mycat-server-1.5.1
Mysql 节点1:
数据库名:db1
hostname:server1
ip:10.138.157.108
Mysql节点2;
数据库名:db2
hostname:server2
ip:10.138.157.109
Mysql节点3;
数据库名:db3
hostname:server3
ip:10.138.157.110
Mysql节点4;
数据库名:db4
hostname:server4
ip:10.138.157.111
Mysql节点5;
数据库名:db5
hostname:server5
ip:10.138.157.112
Mycat安装环境:
hostname:server0
ip:10.138.157.113
七、Mycat安装
1、下载
https://github.com/MyCATApache/Mycat-download
2.解包
# tar -zvxf Mycat-server-1.5.1-RELEASE-20160602230303-linux.tar.gz
3.切换目录
# cd mycat
4.配置
MyCAT目前通过配置文件的方式来定义逻辑库和相关配置,主要是包括三个文件:
MYCAT_HOME/conf/server.xml中定义用户以及系统相关变量,如端口等。
MYCAT_HOME/conf/schema.xml中定义逻辑库,表、分片节点等内容。
MYCAT_HOME/conf/rule.xml中定义分片规则。
# cd conf
(1)逻辑库、系统参数配置:
server.xml里面配置MyCAT的逻辑库参数,如示例,配置的就是逻辑库mycat的登录用户名(mycat)和密码(mycat)。
# vi server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
<property name="charset">utf8</property>
</system>
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">mycat</property>
</user>
</mycat:server>
(2)逻辑库、表分片配置:
# vi schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- schema name=mycat,同server.xml中<property name="schemas">mycat</property> 一样 -->
<schema name="mycat" checkSQLschema="false" sqlMaxLimit="100">
<!-- 需要分片的表company,在节点dn1,dn2,dn3,dn4,dn5上分片,分片规则是:mod-long -->
<table name="company" primaryKey="company_id" dataNode="dn1,dn2,dn3,dn4,dn5" rule="mod-long"/>
</schema>
<!-- 数据节点 dn1,对应的主机 sever1,对应的数据库 db1,其他同理-->
<dataNode name="dn1" dataHost="server1" database="db1" />
<dataNode name="dn2" dataHost="server2" database="db2" />
<dataNode name="dn3" dataHost="server3" database="db3" />
<dataNode name="dn4" dataHost="server4" database="db4" />
<dataNode name="dn5" dataHost="server5" database="db5" />
<!-- 主机 server1, db1 数据库登录用户名(root)和密码(mysql) -->
<dataHost name="server1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="server1:3306" user="root"
password="mysql">
</writeHost>
</dataHost>
<!-- 主机 server2, db2 数据库登录用户名(root)和密码(mysql) -->
<dataHost name="server2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM2" url="server2:3306" user="root"
password="mysql">
</writeHost>
</dataHost>
<!-- 主机 server3, db3 数据库登录用户名(root)和密码(mysql) -->
<dataHost name="server3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM3" url="server3:3306" user="root"
password="mysql">
</writeHost>
</dataHost>
<!-- 主机 server4, db4 数据库登录用户名(root)和密码(mysql) -->
<dataHost name="server4" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM4" url="server4:3306" user="root"
password="mysql">
</writeHost>
</dataHost>
<!-- 主机 server5, db5 数据库登录用户名(root)和密码(mysql) -->
<dataHost name="server5" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM5" url="server5:3306" user="root"
password="mysql">
</writeHost>
</dataHost>
</mycat:schema>
说明:
逻辑表配置(schema)
<table name="company" primaryKey="company_id" dataNode="dn1,dn2,dn3,dn4,dn5" rule="mod-long"/>
table 标签 是逻辑表的配置 其中
name代表表名,
dataNode代表表对应的分片,
Mycat默认采用分库方式,也就是一个表映射到不同的库上,
rule代表表要采用的数据切分方式,名称对应到rule.xml中的对应配置,如果要分片必须配置。
配置分片(dataNode)
<dataNode name="dn1" dataHost="server1" database="db1" />
<dataNode name="dn2" dataHost="server2" database="db2" />
<dataNode name="dn3" dataHost="server3" database="db3" />
<dataNode name="dn4" dataHost="server4" database="db4" />
<dataNode name="dn5" dataHost="server5" database="db5" />
表切分后需要配置映射到哪几个数据库中,Mycat的分片实际上就是库的别名,例如上面例子配置了两个分片dn1,dn2 分别对应到物理机映射dataHost server1,server2 的库上db1,db2。
配置物理库分片映射(dataHost)
<dataHost name="server1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="server1:3306" user="root"
password="mysql">
</writeHost>
</dataHost>
Mycat作为数据库代理需要逻辑库,逻辑用户,表切分后需要配置分片,分片也就需要映射到真实的物理主机上,至于是映射到一台还是一台的多个实例上,Mycat并不关心,只需要配置好映射即可,例如例子中:
配置了一个名为localhost1的物理主机(dataHost)映射。
heartbeat 标签代表Mycat需要对物理库心跳检测的语句,正常情况下生产案例可能配置主从,或者多写 或者单库,无论哪种情况Mycat都需要维持到数据库的数据源连接,因此需要定时检查后端连接可以性,心跳语句就是来作为心跳检测。
writeHost 此标签代表 一个逻辑主机(dataHost)对应的后端的物理主机映射,例如例子中写库hostM1 映射到server1:3306。如果后端需要做读写分离或者多写 或者主从则通过配置 多个writeHost 或者readHost即可。
dataHost 标签中的 writeType balance 等标签则是不同的策略。
负载均衡类型:
balance="0" ,不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
balance="1" ,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡
balance="2" ,所有读操作都随机的在writeHost、readHost上分发
balance="3" ,所有读请求随机的分发到writeHost对应的readHost执行,writeHost不负担读压力,只在1.4及其以后的版本支持
(3)表切分规则配置:
# vi rule.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
<tableRule name="mod-long">
<rule>
<columns>company_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">5</property>
</function>
</mycat:rule>
说明:
tableRule
name 为schema.xml 中table 标签中对应的 rule="mod-long" ,也就是配置表的分片规则,
columns 是表的切分字段: company_id 公司ID。
algorithm 是规则对应的切分规则:映射到function 的name。
function
name 为切分规则的名称,名字人员取,但是需要与tableRule 中匹配。
class 是切分规则对应的切分类,写死,需要那种规则则配置那种,例如本例子是按取模分片:org.opencloudb.route.function.PartitionByMod
property 标签是切分规则对应的不同属性,不同的切分规则配置不同。
5.启动
# cd bin
# ./mycat start
注意,Mycat 默认数据端口为8066,管理端口为9066
提示:访问MyCAT的逻辑库(schema)、用户账号和授权信息是在conf/server.xml文件中配置,而MyCAT用来连接后端MySQL库的用户名、密码信息则在conf/schema.xml中,这是两套完全独立的系统。
JDBC连接配置:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://10.138.157.113:8066/mycat --连接mycat的schema
jdbc.username=mycat --连接mycat的用户名
jdbc.password=mycat --连接mycat的密码
6.Linux 命令
# ./mycat start 启动
# ./mycat stop 停止
# ./mycat console 前台运行
# ./mycat restart 重启服务
# ./mycat pause 暂停
# ./mycat status 查看启动状态