利用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 条评论
登录 后参与评论

相关文章

来自专栏祝威廉

StreamingPro 支持类SQL DSL

受spark sql在喜马拉雅的使用之xql 这篇文章影响,我发现类似下面这种语法是极好的:

9410
来自专栏.NET后端开发

ADO.NET入门教程(五) 细说数据库连接池

题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没有。撇开文章质量不讲,必须肯定的是,我是用心去写每一篇文章的。无论是是在排版上,还是在内容选...

46790
来自专栏乐沙弥的世界

DRBD 的日常管理

13520
来自专栏帘卷西风的专栏

关于linux系统端口查看和占用的解决方案

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

12120
来自专栏IMWeb前端团队

webpack原理与实战

本文作者:IMWeb 吴浩麟 原文出处:IMWeb社区 未经同意,禁止转载 image.png webpack是一个js打包工具,不一个完整的前端...

43790
来自专栏noteless

不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux

35020
来自专栏王磊的博客

ReactNative环境搭建扩展篇——安装后报错解决方案

之前一篇写了《逻辑性最强的React Native环境搭建与调试》说了RN的安装,今天在这里做一个复盘,让我们能够更直观更深入的了解React Native(以...

37280
来自专栏iOSDevLog

Action API目录

32190
来自专栏c#开发者

Android Studio导入第三方类库的方法

Android Studio导入第三方类库的方法 本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的andr...

34750

解决Postfix,Dovecot和MySQL的问题

本指南是Postfix,Dovecot和MySQL安装指南的配套文件。由于设置邮件服务器非常棘手,因此我们创建了这套指南来帮助您解决可能遇到的任何问题。到本指南...

51420

扫码关注云+社区

领取腾讯云代金券