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

时间:2022-03-20 04:02:28

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

简述

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

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

架构

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

实现功能:

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;'