利用mycat实现mysql读写分离

实现mysql读写分离的工具有很多种,我这里就介绍mycat这一种方式。其它的大家有兴趣可以自己去了解。

第一步:首先就是mycat的安装:

这个地址就可以下载安装包:https://github.com/MyCATApache/Mycat-download/tree/master/1.6-RELEASE。下载完之后,就进行解压到系统相应目录,然后点击wrapper-window-x86-32(或者64).exe安装即可。

安装完之后的目录文件结构如下:

第二步:安装好了之后就可以进行mycat和mysql数据库之间的连接配置了:

首先在mycat下面的config中找到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">
<table name="test" primaryKey="ID" type="global" dataNode="dn1" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="linzhiqiang"
password="220316">
<!-- can have multi read hosts
<readHost host="hostS1" url="192.168.73.128:3307" user="linzhiqiang"
password="220316" />
-->
</writeHost>
<writeHost host="hostS1" url="192.168.73.128:3307" user="linzhiqiang"
password="220316" />
</dataHost>
</mycat:schema>

这里面,有两个参数需要注意,balance和 switchType。

其中,balance指的负载均衡类型,目前的取值有4种:

1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。

3. balance="2",所有读操作都随机的在writeHost、readhost上分发。

4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

switchType指的是切换的模式,目前的取值也有4种:

1. switchType='-1' 表示不自动切换

2. switchType='1' 默认值,表示自动切换

3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status

4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。

因此,该配置文件中的balance="1"意味着作为stand by writeHost的hostS1和hostS2将参与select语句的负载均衡,这就实现了主从的读写分离,switchType='-1'意味着当主挂掉的时候,不进行自动切换,即hostS1和hostS2并不会被提升为主,仍只提供读的功能。这就避免了将数据读进slave的可能性,毕竟,单纯的MySQL主从集群并不允许将数据读进slave中,除非配置的是双master。

然后就是mycat用户配置,mycat下面的config中找到server.xml文件并打开。配置详细信息如下:

这里的用户名稍后就会用到,例如利用Navicat连接mycat的时候,就需要用到这个用户名和密码。具体配置信息如下所示(下载好之后就是这个配置文件,如果不想改可以直接用):

第三步:最后就是启动mycat这个服务:

首先在cmd进入mycat的bin目录,然后执行mycat start命令即可启动mycat服务。

具体命令如下所示:

这里需要注意的是,如果配置文件错误,启动就会失败。

第四步:下面就是数据测试阶段了,测试到底能不能通过mycat实现mysql的读写分离:

第一步通过Navicat连接上mycat服务,具体连接信息如下所示:

然后就可以打开mycat,进行数据的添加了。

这里测试结果为:在mycat中添加的数据会自动添加到主数据库中,读取的时候只会读取从数据库。当然这种模式是通过在schema.xml配置得到,具体的配置上面已经介绍过了,这里就不重复说了。可能会有同学要问怎么知道写是写到主数据库中,读是读从数据库呢?我这里的做法是关闭主mysql的服务(直接在服务中关闭即可),然后在mycat中添加数据显示连接mysql失败,读数据是可以的。具体信息如下所示:

其实还有一种配置方法是,刚开始配置的是readHost节点,配置如下:

[html] view  
plain copy
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> 
  <heartbeat>select user()</heartbeat> 
  <!-- can have multi write hosts --> 
  <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> 
  <!-- can have multi read hosts --> 
  <readHost host="hostS1" url="192.168.244.146:3306" user="root" password="123456"/> 
  </writeHost> 
 </dataHost> 

但这种方式有个问题,即master挂了以后,slave也不能提供服务,而这违反了MySQL主从集群的初衷。

到这里通过mycat实现mysql的读写分离就结束了,具体过程就是上面那步骤,当然还有一些细节没写上去,不过都比较简单相信大家可以解决的。

如果对上面的内容还有什么疑义或者问题都可以加我QQ:208017534咨询。

文献参考地址:http://blog.csdn.net/l1028386804/article/details/55045413

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区