背景
上一章谈到了,搭建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
走过的坑
- 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
- 配置环境变量
在/etc/profile下
#set for mycat
export MYCAT_HOME=/home/test/mycat
export PATH=${JAVA_HOME}/bin:${MYCAT_HOME}/lib:$PATH
使用命令让配置起作用
source /etc/profile
- 启动出现问题
报错

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

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