使用Mycat实现读写分离

890 阅读2分钟

背景

上一章谈到了,搭建mysql的主从集群;既然是主从,我们从库就要发挥出它的作用,不能只是做个备份。之前的项目是采用的单个数据库,如何低侵入的让项目完成读写分离成了紧要任务,查阅了资料,找到了诸多方案:mysql-proxy、ReplicationDriver、Amoeba、mycat等。因为是测试环境,所以打算将理论可行的方案都尝试一下,下面分享通过mycat实现读写分离。

安装mycat

了解配置文件

使用mycat最主要的是下面这三个配置文件:

  • server.xml

保存mycat需要的系统配置信息,以及用户信息。

  • schema.xml

mycat所有的和业务有关的配置信息都在这个文件存放,关联着读写分离策略、分库分表策略、分片节点策略。

这个配置能够实现读写分离,每个writeHost是一个写实例;这里配置了两个写实例;如果hostM1挂掉,就会使用hostM2写实例。需要注意: 这样会有个问题,实质上hostM2是从库,当主库(hostM1)挂掉,从库临时顶上,之后主库(hostM1)恢复了,mycat仍然会向从库(hostM2)写入数据。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="test1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <dataNode name="dn1" dataHost="db_host" database="test1" />
        <dataHost name="db_host" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!--如果writeHost指定的数据库宕机,这个writeHost下面的所有的readHost都不可用-->
                <writeHost host="hostM1" url="192.168.0.90:3316" user="lotdb"
                                   password="lotdb2015">
                        <readHost host="hostS2" url="192.168.0.91:3316" user="lotdb" password="lotdb2015" />
                </writeHost>
                <!--如果hostM1宕机了,使用从库-->
                <writeHost host="hostM2" url="192.168.0.91:3316" user="lotdb"
                                                                   password="lotdb2015">
                </writeHost>
        </dataHost>
</mycat:schema>
  • wrapper.conf

存放着java的目录和堆栈的配置

配置环境变量

在/etc/profile下
#set for mycat
export MYCAT_HOME=/home/test/mycat
export PATH=${JAVA_HOME}/bin:${MYCAT_HOME}/lib:$PATH

使用命令让配置起作用
source /etc/profile

走过的坑

  1. mycat/config/wrapper.conf
# 配置jvm所在位置
# Java Application
wrapper.java.command=/usr/local/jdk/jdk1.8.0_77/bin/java
wrapper.working.dir=..

# 注释掉非堆初始值
#wrapper.java.additional.3=-XX:MaxPermSize=64M
  1. 配置环境变量
在/etc/profile下
#set for mycat
export MYCAT_HOME=/home/test/mycat
export PATH=${JAVA_HOME}/bin:${MYCAT_HOME}/lib:$PATH

使用命令让配置起作用
source /etc/profile
  1. 启动出现问题

报错

解决方案:

是因为schema.xml默认有很多配置,dataNode这个配置有三个,我只对应到了一个,另外两个没有对应上,所以报了配置的空指针异常。

报错1

解决方案:

又一次遇到问题,通过查看日志,很明显的看到了是配置的用户和DB不存在,打开server.xml,果然发现默认配置中有一个多余的<user>****</user>,将他注释掉,启动完成。

相关连接

www.cnblogs.com/kevingrace/…