在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。
在这里,我用三个实例组成MySQL主从集群,来验证MyCAT的读写分离功能。
Mysql主从复制:
https://blog.csdn.net/qq_16171815/article/details/96300490
Mycat读写分离
1、下载mycat
官网下载地址:http://www.mycat.org.cn/
下载完之后,解压到本地
2、配置文件
进入到conf文件夹,配置schema.xml,server.xml两个文件
打开schema.xml文件,去掉一些繁杂的配置,读写分离只需要下列配置:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--【name】属性:mycat实例,与server.xml配置相同-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<!--【database】属性:真实的数据库-->
<dataNode name="dn1" dataHost="localhost1" database="mycat_test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat><!--mycat的心跳-->
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root"><!--写服务器篇配置-->
<readHost host="hostS1" url="192.168.127.129:3306" user="root" password="root" /><!--读服务器篇配置-->
<readHost host="hostS2" url="192.168.127.130:3306" user="root" password="root" /><!--读服务器篇配置-->
</writeHost>
</dataHost>
</mycat:schema>
打开server.xml,去掉一些繁杂的配置,读写分离只需要下列配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">1</property> <!-- 1为开启实时统计、0为关闭 -->
</system>
<!--mycat用户节点,schema要与schema.xml一致-->
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
</user>
<user name="read">
<property name="password">read</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property><!--是否只读-->
</user>
</mycat:server>
3、启动mycat
进入到bin目录下,进入窗口模式,
先install mycat:mycat.bat install
启动mycat:mycat.bat start
其他命令
重启:mycat.bat restart
停止:mycat.bat stop
4、验证mycat读写分离
通过mysql连接工具,我这里是sqlyog,连接mycat,用户名和密码就是刚才server.xml文件配置的
连接成功之后,会发现有一个数据库实例,和一张表,TESTDB就是server.xml和schema.xml配置相同的地方
刚好和需要读写分离的库吻合
我们现将mysql主从复制的表中数据都删除
说明:主服务器是本机(localhost),两个从机分别是(192.168.127.129和192.168.127.130)
mycat中也没有数据
下面通过mycat插入数据
插入成功,看下数据,一主两从都有数据
因为是主从复制,只有通过主服务器插入数据,从服务器才有更新数据,所以肯定是写是在主服务器
下面验证读,我们在两个从服务器中各插入一条数据,这样主服务器是不会更新数据的
可以看到读出来的数据,和主库数据不同
5、问题总结
搭建的过程中,遇到各种问题,绝大部分都是server.xml和schema.xml文件配置错误,这两个文件的配置网上很多,这里不做叙述,各个节点的解释和含义,网上也很多