关于Mycat配置文件scheme.xml的dataHost标签深入理解

首先得搞清楚,balance项是控制读而writeType是控制写的,如下图为官方文档截图(有点小问题)

 

一、Balance属性

1、Balance=0时读操作会发往第一个writeHost(不会发readHost),如图读操作是在hostM1上完成的。

2、Balance=1时读操作不会发往第一个writeHost,如图M1不参与读

3、Balance=2时读操作会随机发往writeHost以及 readHost,理论上实现的是负载均衡。4、Balance=3且配置了readHost时读操作会随机发往readHost(不会发writeHost),如图读操作是在S1, S2上完成的

5、Balance=3而没有配置readHost时读操作会发往第一个writeHost,如图读操作是在M1上完成的

 

二、switchType属性(以mysql双主为例)

先晒出官网关于switchType属性的说明:

1、当switchType=1

以下为模拟搭建时的环境配置情况:

Master1:192.168.1.202

Master2:192.168.1.203

Slave:192.168.1.204

其中Master1、Master2互为主从,Slave 为Master1的从(记得开启GTID

Mycat的scheme.xml配置如下:

1.1、如果Master1宕机,写操作会切换到Master2,但是Slave无法从Master2同步数据,而此时的读操作还是会发往Slave,导致从Slave上读的数据是不完全的。所以这里要写一个自制change master的脚本(定时往Master1发送心跳包,若检测到心跳失效则Slave直接change master to Master2

1.2、接着修复Master1并启动,Master1从Master2同步数据

PS:个人理解为切换后hostM1hostM2互换角色(切换记录为dnindex.properties文件的内容host1=0更改为host1=1),根据balance=1的规则,备用主是可以做为读的,故Master1重新启动后此时hostM1hostS1是用作读而hostM2只用作写,始终保持着读写分离。

1.3、同理,自制change master脚本也要针对Master2,当Master2宕机,Slave直接change master to Master1

1.4、附上change_master.sh脚本:

#!/bin/bash
master_old="192.168.1.202"
master_new="192.168.1.203"
#master心跳检测
mysql -uroot -p123456 -h$master_old -e "select 1" > /dev/null
flag=`echo $?`
if [ $flag -eq 1 ];then
# 更改主
mysql -uroot -p123456 -h192.168.1.204 -e "stop slave;change master to master_host='$master_new',master_user='root',master_password='123456',master_port=3306,master_auto_position=1;start slave;"
#更新脚本持续高可用
sed -i 's/^master_old/1master_new/' /change_master.sh
sed -i 's/^master_new/master_old/' /change_master.sh
sed -i 's/^1master_new/master_new/' /change_master.sh
fi

1.5、由于crontab只能精确到分,所以这里另建一个每8秒循环一次的脚本crontab.sh去跑change_master.sh,如下:

#!/bin/bash
while true ;do
sh /change_master.sh
sleep 8 #每秒执行一次
done

1.6、关于crontab.sh脚本需要注意的几点:

1.6.1、mycat心跳包频率默认是10秒,所以crontab.sh最好设置小于10秒,防止Master1宕机后,写权限已经切换到备Master2且不可读,而slave还未change master,如果这个时候刚好有写数据传入,就会造成主从不一致,而导致读的数据是不准确的。

1.6.2、为防止误操作而导致crontab.sh脚本进程卡顿、停止、死掉等情况出现,运行该脚本的时候要放在后台去运行:sh crontab.sh &

1.6.3、多个mycat的情况下,每个mycat上面都要运行crontab.sh脚本

 

2、当switchType=2时

Mycat的scheme.xml配置如下:

2.1、如果Master1宕机,读写操作全部切换到Master2,此时读操作也不会发往Slave

2.2、修复Master1并启动,Master1从Master2同步数据,Slave从Master1同步数据,读数据发往Master1及Slave。

2.3、这种情况能够完美保障读数据的准确性,但在Master1修复之前,Master2压力会比较大,因为slave全不可读。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章