认识Mycat
1、Mycat背景
Mycat的前身是阿里巴巴大名鼎鼎的Cobar,Cobar在开源了一段时间后,就没有再维护了,阿里巴巴放弃了该项目,再加上Cobar在使用过程中也发现存在一些问题。2013年国内一批开源软件爱好者对Cobar这个项目进行了改进,并命名为Mycat,这就是MyCat的诞生。MyCat是完全免费开源的,不属于任何商业公司。Mycat于2014年首次在上海的《中华架构师》大会上对外宣讲,随后越来越多的项目采用了Mycat。截至2015年11月,超过300个项目采用Mycat,涵盖银行、电信、电子商务、物流、移动应用、O2O的众多领域和公司。Mycat官网:http://www.mycat.io/
2、Mycat是什么
Mycat是一个开源数据库中间件,是一个实现了MySQL协议的数据库中间件服务器,可以看作是一个数据库代理,用MySQL客户端工具和命令行访问Mycat,而Mycat再使用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,包括SQLServer、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储;一般地,Mycat主要用于代理MySQL数据库,虽然它也支持去访问其他类型的数据库;Mycat的默认端口是8066,一般地,我们可以使用常见的对象映射框架比如MyBatis操作Mycat。
3、 Mycat主要能做什么
3.1.数据库的读写分离
通过Mycat可以实现写数据时操作主数据库,读数据时操作从数据库,这样能有效减轻数据库压力,也能减轻IO压力。
实现读写分离,当主数据库故障后,Mycat自动切换到另一个住主数据库上,进而提高可用的数据库服务,当然我们需要部署多住多从的模式。
3.2.数据分片
3.2.1. 水平切分(横向切分)
根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库服务器上,一张表里的数据分散到多个表里面,按照年、月、日分表。
3.2.2. 垂直切分(纵向切分)
按照不同的表来切分不同数据库服务器之上
一个数据库里面的多个表分散到多个数据库里面(分库)
3.2.3. 结论
- 性能有了瓶颈,可以进行读写分离
- 数据库容量有了瓶颈,可以分库分表
3.3. 多数据源整合
能整合MySQL,Oracle,DB2,Redis等数据库
4、 原理
Mycat原理中最重要的一个动词是**“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句进行一些特定的分:如分片分析、路由分析、读写分离分析、缓存分析等**,然后将该SQL发送往后端的真是数据库,并将返回的结果做适当的处理,最终在返回给用户
5、 Mycat安装
上传到software目录下执行
yum install -y java-1.8.0-openjdk-devel.x86_64
tar –zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
6、 Mycat日常管理
6.1. Mycat启动
切换到mycat的bin路径下,执行
./mycat start
6.2. Mycat关闭
切换到mycat的bin路径下,执行
./mycat stop
6.3. Mycat命令行
登录mycat命令行,使用mysql的命令行工具来操作的:
mysql -umycat -p -P8066 -h127.0.0.1
mycat默认数据访问端口是8066
7、 MyCat核心配置文件
7.1. server.xml
常用配置:
Ø 配置序列生成方式
Ø 配置mycat逻辑数据库,表 分片
Ø 配置mycat的访问账户和密码
7.2. schema.xml
用于配置的逻辑数据库的映射、表、分片规则、数据结点及真实的数据库信息;
常用配置:
Ø 配置逻辑库映射
Ø 配置垂直切分的表
Ø 配置真实的数据库
Ø 配置读写结点
7.3. rule.xml
定义分片规则
8、Mycat读写分离
8.1. 配置server.xml文件
8.2. 配置schema文件
8.3. 注意事项
需要修改server.xml和schema.xml配置文件的权限
chmod server.xml
8.4. 配置说明
只做读写分离,不做分库分表,Mycat只是帮我们转发一下请求,读转发到从库,写转发到主库,则schema标签里面不用配置table给schema标签加上属性dataNode,配置dataNode的名字(name)
8.4.1. 最终配置如下
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
8.4.2. 配置dataNode
dataNode定义了Mycat中的数据节点,也就是我们通常说所的数据分片,一个dataNode标签就是一个独立的数据分片,通俗理解,一个分片就是一个物理数据库
Ø name
定义数据节点的名字,这个名字需要是唯一的,这个名字在schema里面会使用到;
Ø dataHost
用于定义该分片属于哪个数据库实例的,属性值是引用dataHost标签上定义的name属性
Ø database
用于对应真实的数据库名,必须是真实存在的;
最终配置如下
<dataNode name="dn1" dataHost="localhost1" database="test" />
8.4.3. 配置dataHost
定义具体的数据库实例、读写分离配置和心跳语句;
配置说明
Ø balance属性
负载均衡类型,目前的取值有4种:
n balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上;
n balance=“1”,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
n balance=“2”,所有读操作都随机的在writeHost、readhost上分发
n balance=“3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
Ø writeType
已过时,1.6版本就不用了
Ø switchType属性
用于指定主服务器发生故障后的切换类型
-1 表示不自动切换
1 默认值,自动切换(推荐)
2 基于MySQL主从同步的状态决定是否切换
3 基于MySQL galary cluster的切换机制(适合集群)(1.4.1)
通常情况下,我们MySQL采用双主双从的模式下,switchType为1即可。因为双主从模式下,主从同步关系很复杂,不能根据MySQL的状态来切换。只需要在一个主出问题后,切换到另外的主。
Ø heartbeat标签
用于和后端数据库进行心跳检查的语句,检测MySQL数据库是否正常运行
当switchType为1时,mysql心跳检查语句是select user()
当switchType为2时,mysql心跳检查语句是show slave status
当switchType为3时,mysql心跳检查语句是show status like ‘wsrep%’
Ø writeHost与readHost标签
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组合这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。
8.5. 测试读写分离
1.确保已经打开2台mysql服务
并验证2台机器 主从复制已经起作用
2.启动Mycat
3.Navicat连接mycat
mycat默认数据访问端口是8066
4.创建dept表,插入数据,各个数据库都会存在 说明实现了主从复制
create table dept(
id int(10) primary key AUTO_INCREMENT,
name varchar(20)
);
insert into dept(id,name) values(1,"development");
说明写操作在3307上执行的 然后通过主从复制copy到3308
5.修改从库数据 添加3308数据信息
6.SQL语句验证