MyCat读写分离
简介
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是Mycat的核心作用。
总结:Mycat是一个广受好评的数据库中间件,为了减轻单数据库的压力,可以实现主从、热备、分表分库,从而实现数据库的分布式架构。
原理
Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
上述图片里,应用程序不再直接访问数据库,而是访问Mycat,由Mycat与数据库交互,数据库数据返回给Mycat,Mycat再返回给应用程序。三个Database才是真正的数据库,又称为三个节点,也称为三个分片。
总结:Mycat作为一个中间件,应用程序直接访问它,不用 再去管真实的数据库,而由Mycat来与真实的数据库进行交互,真实的数据库可能有多个,这就是分布式架构,即多节点(多分片)
安装
这里选择安装1.6-RELEASE
选择对应的版本下载即可。这里我安装在Linux上。
上传到Linux中,tar -zxvf 安装包
即可。在mv
移动到/usr/local/
这里我安装的是在从机上(从机???见上文。安装位置不受限,也可以单独安装在新的机器上)
配置
读写分离条件需要主从复制。
在启动MyCat开启读写分离之前,首先我们修改它的配置文件
- schema.xml 定义逻辑库,表、分片节点等内容
- rule.xml 定义分片规则
- server.xml 定义用户以及系统相关变量,如端口等.
启动前先修改server.xml
(conf目录)
将用户名root修改为mycat 区分防止混淆。保存退出
接着修改schema.xml
在逻辑库TESTDB
中存在表,目前我们都没有,所以全部删掉。
:set nu
显示行号
输入:6,32d
回车即可多行删除
若想单行删除。光标移动到位置,按两下d
。
如果删除错误,想恢复按下u
即可复原。
接着配置数据节点dataNode
这里你们balance没改默认是0.先别改。
1 |
|
配置完成之后,启动MyCat。
控制台启动 :去mycat/bin 目录下./mycat console
后台启动 :去mycat/bin 目录下./mycat start
运行启动成功!!
接着我们在开一个连接窗口
后台管理窗口是使用的9066
我们使用数据窗口连接MyCat
mysql -u 用户名 -h 主机地址 -P 8066 -p
mysql -u mycat -h 10.0.0.128 -P 8066 -p
show databases;
可以看到我们设置的逻辑库
选择数据库,查看表,可以看到我们mydb_kylin数据库中的mytb1表。
我们正常可以查看当前表中的数据,但是现在我们到底访问的是主机master 还是从机的数据库呢??
我们可以在主机运行INSERT INTO mytb1 VALUES(3,@@hostname);
就能通过hostname区分主从机了。
注意:由于我上文是直接复制虚拟机的,所以改虚拟机的hostname是相同的。
hostnamectl set-hostname 名字
centos7中使用该命令修改主机名为mater,后重启。
此时读操作使用的竟然还是我们的主机。这是为什么呢??这是因为我们先前没有配置schema.xml
中的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”,所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力
我们配置为2。再次重启为mycat。停止重新启动
配置成功,当前所有读操作都随机的在 writeHost、readhost 上分发。读写分离成功!!