MyCat
MyCAT 是一款开源的Mysql企业级集群应用,它是基于阿里的开源产品Cobar发展出来的。MyCAT提供了类似Mysql的接口,可以平滑的将单机Mysql迁移到Mysql集群上,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。
配置
schema.xml
中定义逻辑库,表、分片节点等内容;
rule.xml
中定义分片规则;
server.xml
中定义用户以及系统相关变量,如端口等
server.xml
server.xml
是MyCAT对外的“虚拟数据库”配置文件。所谓的“虚拟数据库”是说,MyCAT将多个Mysql集群整合起来对外提供服务,提供服务的接口仍然采用Mysql的形式,因此,通过仿造Mysql接口,让调用程序以为自己是在访问Mysql数据库,就是所谓的“虚拟数据库”。
<?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>
</system>
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
表明该虚拟数据库有一个schema,TESTDB
;
有2个用户test
和user
,密码分别是test
和user
,
user
用户是只读的,test
用户未设置只读;
默认的SQL解析器是druidparser
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3"
rule="mod-long" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
</dataHost>
</mycat:schema>
Schema中主要配置 Mycat 数据库,MySQL表,分片规则,分片类型
schema
第1块是schema
块,主要描述了虚拟数据库的schemaTESTDB
中有哪些表,每个表分布在哪些数据节点上,分布的方法采用哪种算法。例如<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
,表示travelrecord
表分布在dn1,dn2,dn3
这3个节点上,分布的方法采用auto-sharding-long
算法。
dataNode
第2块是dataNode
,表示该数据库有哪些数据节点,以及这些数据节点实际对应的数据服务器和数据库名,这里配置了3个节点dn1,dn2,dn3
,都是在localhost1
服务器上,数据库名分别是db1,db2,db3
,其实,这也正是前面schema
块中用到的。
dataHost
第3块是dataHost
,这部分是实际的数据库服务器配置,这里配置了2个Mysql数据库,hostM1
和hostS1
,地址分别在“localhost:3306”,用户名都是root
,密码是123456
,并且指定了心跳是select user()
。
这里面有两个参数需要注意,balance和 switchType。
balance
指的负载均衡类型,目前的取值有4种:
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",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
switchType
指的是切换的模式,目前的取值也有4种:
- switchType='-1' 表示不自动切换
- switchType='1' 默认值,表示自动切换
- switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
- switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
rule.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
<tableRule name="sharding-by-hour">
<rule>
<columns>createTime</columns>
<algorithm>sharding-by-hour</algorithm>
</rule>
</tableRule>
<function name="sharding-by-hour" class="org.opencloudb.route.function.LatestMonthPartion">
<property name="splitOneDay">24</property>
</function>
</mycat:rule >
数据切分中作为表切分规则中最重要的配置,表的切分方式决定了数据切分后的性能好坏,因此也是最重要的配置。
如上面例子配置了一个切分规则,名为sharding-by-hour 对应的切分方式(function )是按日期切分,该配置中:
tableRule
name 为schema.xml 中table 标签中对应的 rule="sharding-by-hour" ,也就是配置表的分片规则,
columns 是表的切分字段: createTime 创建日期。
algorithm 是规则对应的切分规则:映射到function 的name。
function
function 配置是分片规则的配置。
name 为切分规则的名称,名字人员取,但是需要与tableRule 中匹配。
class 是切分规则对应的切分类,写死,需要哪种规则则配置哪种,例如本例子是按小时分片:org.opencloudb.route.function.LatestMonthPartion
property 标签是切分规则对应的不同属性,不同的切分规则配置不同。
登陆演示mycat
登陆
登录方式类似于 mysql 的服务端登陆,目前 mycat 有两个端口,8066 数据端口,9066 管理端口
登陆方式如:
mysql -h127.0.0.1 -utest -ptest -P9066 [-dmycat]
-h 后面是主机,即当前 mycat 按照的主机地址,本地可用 127.0.0.1 远程需要远程 ip
-u Mycat server.xml 中配置的逻辑库用户
-p Mycat server.xml 中配置的逻辑库密码
-P 后面是端口 默认 9066,注意 P 是大写
-d Mycat server.xml 中配置的逻辑库
数据端口与管理端口的配置端口修改:
数据端口默认 8066,管理端口默认 9066 ,如果需要修改需要配置 serve.xml
演示
D:\mycat\bin>mysql -utest -ptest -P9066 -Dtestdb
mysql> show @@help; -- 获取有关管理的相关命令
mysql> show @@database; -- 查看逻辑数据库
+----------+
| DATABASE |
+----------+
| testdb |
+----------+
mysql> show @@datanode; --查看分片节点
mysql> show @@server; --查看服务器状态
mysql> show @@version; --查看版本
+----------------------------------------+
| VERSION |
+----------------------------------------+
| 5.5.8-mycat-1.4-RELEASE-20150922233010 |
+----------------------------------------+
D:\mycat\bin>mysql -utest -ptest -P8066 -Dtestdb
mysql> select database();
+------------+
| DATABASE() |
+------------+
| testdb |
+------------+
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company |
| customer |
| customer_addr |
| employee |
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
+------------------+
注意
启动MyCAT之前,需要先检查一些配置:
java的版本需要是1.7或以上;
Mysql的配置文件需要加一行
lower_case_table_names = 1
在[mysqld]
栏目中,这个设置为Mysql大小写不敏感,否则可能会发生表找不到的问题;在示例的2个数据
hostM1
和hostS1
上,新建3个数据库db1,db2,db3
,如不新建,可能提示找不到数据库ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0
(这个提示不够友好,是在运行很长一段时间后才提示);-
ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:1
这个有可能是Mycat和MySQL部署在同一台机器上,而在schema.xml是使用了IP的,但是账号只能使用localhost登陆,所以会出现本地的Mycat无法连接MySQL
添加
MYCAT_HOME
环境变量指向解压的mycat目录,主要是为了一些bin
目录下的脚本的使用。