關於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全不可讀。

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