基于Mycat中间件的MySQL读写分离
简述
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;'