基于mycat实现读写分离

 Mycat 概述

    在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。

引入MySQL中间件能很好的对程序端和数据库进行解耦,这样,程序端只需关注数据库中间件的地址,而无需知晓底层数据库是如何提供服务。

作为当前炙手可热的MySQL中间件,MyCAT实现MySQL主从集群的读写分离自是应有之义,其配置也相当简单。

在这里,我用三个实例组成MySQL主从集群,来验证MyCAT的读写分离功能,其实,一主一从就可以满足,之所以用三个,是为了验证MyCAT的分片功能。

集群组成如下:

角色             主机名                      主机IP

master         server1              192.168.200.112

slave            server2              192.168.200.113

slave            server3              192.168.200.114

在 server1 上安装 jdk 和 mycat

安装Java环境(mycat基于java)
yum install java-1.8.0-openjdk.x86_64
下载mycat
wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
解压
tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
创建专门运行mycat账号
useradd -M -s /sbin/nologin mycat
将文件权限赋给mycat账号
chown -R mycat:mycat mycat

切换目录

cd /usr/local/mycat/bin/

启动mycat

./mycat start
配置环境变量并添加 

vim /etc/profile

export JAVA_HOME=/usr/local/java

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$HOME/bin

export MYCAT_HOME=/usr/local/mycat

export PATH=$PATH:$MYCAT_HOME/bin

使配置文件立即生效

source /etc/profile

进入mycat的配置文件目录

cd /usr/local/mycat/conf/
vi schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- 定义MyCat的逻辑库 -->
<schema name="pcx_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>
<!-- 定义MyCat的数据节点 -->
<dataNode name="pcxNode" dataHost="dtHost" database="pcx" />
<!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
<!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
<!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
<!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
<dataHost name="dtHost" maxCon="500" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<!--心跳检测 -->
<heartbeat>show slave status</heartbeat>
<!--配置后台数据库的IP地址和端口号,还有账号密码 -->
<writeHost host="hostMaster" url="192.168.1.6:3306" user="root" password="root" />
<writeHost host="hostSlave" url="192.168.1.7:3306" user="root" password="root" />
</dataHost>
</mycat:schema>

vi server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 -->
<property name="defaultSqlParser">druidparser</property>
<property name="charset">utf8mb4</property>
</system>
<!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 -->
<user name="user1">
<property name="password">root</property>
<property name="schemas">pcx_schema</property>
</user>
<!-- 用户2,只读权限-->
<user name="user2">
<property name="password">root</property>
<property name="schemas">pcx_schema</property>
<property name="readOnly">true</property>
</user>
</mycat:server>

重启

cd /usr/local/mycat/bin/

./mycat restart

测试同步:

1.在主库创建一张表,插入记录。

2.在从库查询验证是否正确,经验证配置正确。