Mycat介绍
Mycat是什么?
Mycat背后是阿里曾经开源的知名产品——Cobar,Cobar是阿里巴巴研发的关系型数据的分布式处理系统
从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的的Server,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问, 而其后端可以用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里
• 支持 SQL 92标准
• 支持Mysql集群,可以作为Proxy使用
• 支持JDBC连接多数据库
• 支持各种数据库,包括Mysql 、mongodb、oracle、sqlserver 、hive 、db2 、 postgresql。
• 支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群
• 自动故障切换,高可用性
• 支持读写分离,支持Mysql双主多从,以及一主多从的模式
• 支持全局表,数据自动分片到多个节点,用于高效表关联查询
• 支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询
• 支持一致性Hash分片,有效解决分片扩容难题
• 多平台支持,部署和实施简单
• 支持Catelet开发,类似数据库存储过程,用于跨分片复杂SQL的人工智能编码实现
• 支持NIO与AIO两种网络通信机制,Windows下建议AIO,Linux下目前建议NIO
• 支持Mysql存储过程调用
• 以插件方式支持SQL拦截和改写
• 支持自增长主键、支持Oracle的Sequence机制
Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
上述图片里,Orders表被分为三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一台到N台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function),这里的分片字段为prov而分片函数为字符串枚举方式。
当Mycat收到一个SQL时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表,然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。
Mycat应用场景
Mycat几个典型的应用场景:
•单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
•分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
•多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化
•报表系统,借助于Mycat的分表能力,处理大规模报表的统计
Mycat安装
•预先安装Java运行环境 yum install -y java
•确保本机的hostname在/etc/hosts里存在 为了防止后续启动mycat的时候会报错
[root@vmware1 logs]# env XDG_SESSION_ID=5 HOSTNAME=vmware1
[root@vmware1 logs]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4 vmware1
•Mycat本机预先安装MySQL环境,但不需要启动MySQL实例
下载Mycat-server-xxxxx.linux.tar.gz
http://dl.mycat.io/1.6-RELEASE/
解压文件
tar –zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
创建日志目录 (不建的话会报错)
cd mycat
mkdir logs
把mycat 的bin/目录写到环境变量里面
以后可以直接启动mycat
source .bash_profile
Mycat配置之schema.xml
Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataHost
主要有三个标签,一是schema标签,二是dataNode标签,三是dataHost标签
[root@wyg003 conf]# vi schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="course2" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="10.0.0.201:3306" user="root" password="123456">
<readHost host="slave1" url="10.0.0.203:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
update mysql.user set host='%' where user='root';
(如果mycat上读不到master1上的表信息 ,在master1上执行)
flush privileges;
特别注意:mysql的配置文件中要添加下面2行参数来更改字符集,不然会报错
character-set-server=utf8
collation-server=utf8_general_ci
default_authentication_plugin=mysql_native_password
create user 'lwm2'@'10.0.0.%' identified with mysql_native_password by '123456';
grant select,insert,update,delete on *.* to 'lwm'@'10.0.0.%';
grant all privileges on *.* to 'root'@'%' WITH GRANT OPTION;
(8.0需要加上默认加密方式)
mysql -u root -p -P 8066 -h 127.0.0.1 --default-auth=mysql_native_password
(8.0需要加上默认加密方式)