vlambda博客
学习文章列表

基于Mycat中间件的MySQL读写分离

基于Mycat中间件的MySQL读写分离


简述

mycat是国内开源的数据库中间件,可以实现mysql读写分离和主备热切换,容灾,数据分片等功能。


详情:http://www.mycat.io/


架构


实现功能:

1. 在主从同步正常时,主从读写分离


2. 当主从复制出现延迟且延迟时间大于10秒(可自定义延迟时间)后,读操作会发到主库上,从库不再接受读操作,目的是防止延迟过大导致读到以前的旧数据。


3. 当从库追上主库后,或延迟时间小于10秒时,从库自动接受读操作


4. 当主库宕掉后,读写操作都会发到从库上。(切换时间5s-30s)


5. 从库宕掉后,读写操作都会发到主库上。(切换时间5s-30s)


 

注意:事务内部的一切操作都会走写节点,所以读操作不要加事务


环境描述

服务器           IP                         PORT             说明


mycat            172.16.10.114        8066,9066      mycat服务,8066为数据端口,9066管理端口


master           172.16.10.114        3308              mysql主实例


slave             172.16.10.114        3309              mysql从实例


 


安装

wget -c http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz


tar zxfMycat-server-1.6.5-release-20180122220033-linux.tar.gz


cd mycat


ll mycat


total 28


drwxr-xr-x 2 root root 4096 May 23 14:02 bin


drwxrwxrwx 2 root root 4096 Mar  1  2016catlet


drwxrwxrwx 4 root root 4096 May 23 14:07 conf


drwxr-xr-x 2 root root 4096 May 23 14:02 lib


drwxrwxrwx 3 root root 4096 May 23 14:08 logs


drwxr-xr-x 2 root root 4096 May 23 14:04 tmlogs


-rwxrwxrwx 1 root root 219 Jan 22 22:00 version.txt


配置

mycat的配置文件都在conf目录下,其中server.xml是mycat的配置文件,设置账号、参数等,schema.xml是mycat对应物理数据库与数据库表的配置,对于读写分离来说,主要配置的只有这2个配置文件。


schema.xml


<?xml version="1.0"?>


<!DOCTYPE mycat:schema SYSTEM"schema.dtd">


<mycat:schemaxmlns:mycat="http://io.mycat/">


 


<!-- 数据库配置,与server.xml中的数据库对应,多个库需要配置多条 -->


    <schemaname="test" checkSQLschema="false"sqlMaxLimit="100" dataNode="dn_test">


    </schema>


    <schema name="thunder"checkSQLschema="false" sqlMaxLimit="100"dataNode="dn_thunder">


</schema>


 


<!-- 数据库节点节点 -->


    <dataNodename="dn_test" dataHost="localhost1"database="test" />


<dataNode name="dn_thunder"dataHost="localhost1" database="thunder" />


 


<!-- 物理数据库配置 -->


    <dataHostname="localhost1" maxCon="1000" minCon="10"balance="1"


             writeType="0" dbType="mysql" dbDriver="native"switchType="2" slaveThreshold="10">


       <heartbeat>show slave status </heartbeat>


       <writeHost host="hostM1" url="172.16.10.114:3308"user="thunder" password="thunder" />


       <writeHost host="hostS1" url="172.16.10.114:3309"user="thunder" password="thunder" />


   </dataHost>


   


</mycat:schema>


 


dataHost标签中相关属性:


 


balance 属性:


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不负担读压力


 


writeType 属性:


1、writeType="0",所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个,writeHost,重新启动后以切换后的为准,切换记录在配置目录文件中:dnindex.properties .


2. writeType="1",所有写操作都随机的发送到配置的 writeHost上


 


switchType属性:


-1 表示不自动切换


1 默认值,自动切换


2 基于MySQL主从同步的状态决定是否切换


心跳语句为 show slave status


3 基于MySQL galary cluster的切换机制(适合集群)(1.4.1)


心跳语句为 show status like ‘wsrep%’.


 


server.xml


<propertyname="serverPort">8066</property>  #配置数据连接端口,默认8066


<propertyname="managerPort">9066</property> #配置管理端口,默认9066


 


#设置连接mycat的用户名和密码,相当于test库,thunder库的用户名为test,密码为test


<username="test">


       <property name="password">test</property>


       <property name="schemas">test,thunder</property>


    </user>


#设置只读用户名和密码,相当于test库的只读用户名为user,密码为user


    <username="user">


       <property name="password">user</property>


       <property name="schemas">test</property>


       <property name="readOnly">true</property>


</user>


启动mycat

cd mycat


./bin/mycat start


ps aux |grep mycat #检查是否启动


程序读写用户连接信息


HOST: 172.16.10.114


PORT:8066


USER:test


PASS:test


测试读写分离与故障切换脚本

while true


do


char=`openssl rand 16 -base64`


mysql -h127.0.0.1 -P8066 -utest -ptest -Nse "insertinto test.t1(name) values('"${char}"')"


echo "=========test==`date`================="


mysql -h127.0.0.1 -P8066 -utest -ptest -Nse 'select *from test.t1 order by id desc limit 1;'


echo "=========test==`date`================="


mysql -h127.0.0.1 -P8066 -utest -ptest -Nse "insertinto thunder.t1(name) values('"${char}"')"


echo"=========thunder==`date`================="


mysql -h127.0.0.1 -P8066 -utest -ptest -Nse 'select *from thunder.t1 order by id desc limit 1;'


echo "=========thunder==`date`================="


sleep 1


done


观察mycat日志wrapper.log或者开户实例的general log


将mycat日志级别调为debug


conf/log4j2.xml


<asyncRoot level="debug"includeLocation="true">


开户实例的general log


set global variables general_log=1;


也可能通过管理端口的命令来查看读写分配次数


mysql -h127.0.0.1 -P9066 -utest -ptest -e 'show  @@datasource;'