基於MYCAT的MYSQL主從與讀寫分離配置詳解與示例

1、不使用Mycat托管MySQL主從伺服器,簡單使用如下配置:

<dataNodename="dn1" dataHost="localhost1" database="db1"/>
         <dataNodename="dn2" dataHost="localhost1" database="db2"/>
         <dataNodename="dn3" dataHost="localhost1" database="db3"/>   
<dataHost name="localhost1"maxCon="1000" minCon="10" balance="0"
                   writeType="0"dbType="mysql" dbDriver="native"switchType="1" slaveThreshold="100">
                   <heartbeat>selectuser()</heartbeat>
                   <writeHosthost="hostM" url="10.1.176.158:3306" user="root"
                            password="123456">
                   </writeHost>
         </dataHost>

2、使用Mycat托管主從切換,使用如下配置:

<dataHostname="localhost1" maxCon="1000" minCon="500"balance="2"
                   writeType="0" dbType="mysql"dbDriver="native" switchType="2"  slaveThreshold="100">
                   <heartbeat>show slave status</heartbeat>
                   <!--can have multi write hosts -->
                   <writeHosthost="hostM1" url="10.1.176.158:3306" user="root"
                            password="123456">
                   </writeHost>
                   <writeHosthost="hostS1" url="10.1.176.78:3306" user="root"
                            password="www.com.workssys"/>
</dataHost>

(1)註意,如果隻有一個writeHost,主掛瞭,讀也不能用。writeType=0,寫操作隻發第一個writeHost,發生瞭切換,原來的從變為主,所有寫操作在原來的從執行,如果不是雙向復制原來的主數據就是舊的。切換間隔是5次心跳時間,默認是10 * 5=50秒(第一次10秒沒響應,後面可能會變成15秒檢測,然後20秒,最後真的沒響應就認為掛瞭),心跳配置在server.xml,使用dataNodeHeartbeatPeriod參數:對後端所有讀、寫庫發起心跳的間隔時間,默認是10秒。

(2)註意,切換後重啟原來的主,如果主從不同步 ,報錯:Slave_SQL_Running:No

數據保證一致後,執行:

mysql> slave stop;

Query OK, 0 rows affected(0.00 sec)

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

Query OK, 0 rows affected(0.00 sec)

mysql> slave start;

Query OK, 0 rows affected(0.00 sec)

mysql> show slave status\G

(2)切換後,Mycat會標記新的主從狀態,主從狀態保存在/conf/dnindex.properties文件,正常情況是將原來的從就作為主,主從對調,修改schema.xml文件。但是如果想恢復原來的主,需要執行9066端口的Mycat管理工具的switch命令切換數據源:

switch @@datasource name:index

name:schema中配置的dataHost 中name。

index:schema中配置的dataHost 的writeHost index 位標,即按照配置順序從上到下的一次順序,從0開始,即第一個是WriteHost是0,另一個就是1。

切換數據源時,會將原數據源所有的連接池中連接關閉,並且從新數據源創建新連接,此時mycat服務不可用。

dnindex.properties文件記錄瞭當前的活躍writer。

dataHostname="blog" maxCon="100" minCon="10"balance="0"
writeType="0"dbType="mysql" dbDriver="native">
<heartbeat>select1</heartbeat>
<writeHosthost="master" url="127.0.0.1:3306" user="root"password="root"></writeHost>
<writeHosthost="master2" url="127.0.0.1:3306" user="root1"password="root"</writeHost>
</dataHost>
mysql> show @@datasource;
+----------+---------+-------+----------------+------+------+--------+------+--
|DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE |
+----------+---------+-------+----------------+------+------+--------+------+--|blog | master | mysql | 121.40.121.133 | 3306 | W | 0 | 10 | 100 | 16 |
|blog | master2 | mysql | 127.0.0.1 | 3306 | W | 0 | 0 | 100 | 0 |
+----------+---------+-------+----------------+------+------+--------+------+--2rows in set (0.00 sec)
mysql> switch @@datasource blog:1;
Query OK, 1 row affected (1min 0.05 sec)

(3)切換後,查看哪一個在執行庫操作

show @@heartbeat、show @@backend

觀察RS_CODE字段

 

 

(4)主突然宕機後,恢復順序:

1)查看數據是否同步,人為同步數據,同步數據時註意,主從同步狀態時一定要在主的那一端執行操作,然後主會同步到從;但是一旦在從那一端操作的話,執行到主,主又會返回給從,如執行下面的操作,有drop table操作非常危險

 

2)恢復主節點

3)在DB中做主從對調,先停止原從節點的從復制操作slave stop,再啟動原主節點的從復制操作slave start

4)到新的從伺服器執行以下語句,查看主從狀態是否正常,首先手動啟動新的slave,因為加入瞭skip-slave-start參數

slave start

show slavestatus \G

5)執行插入驗證,至此操作結束

6)註意:Mycat不要重啟,心跳一直會檢測,在DB裡把主從對調好就沒錯誤提示瞭,恢復瞭心跳就會恢復正常

7)註意:如需要恢復原來配置,執行switch操作,但不建議這樣做(switch操作執行較慢,並且似乎有問題,並不能保證執行正確)。switch之前要檢查日志主的心跳有沒有恢復正常,正常瞭才能切。

mysql -utest -ptest -hlocalhost -P9066 -DTESTDB

switch @@datasource localhost1:0

8)註意:目前主從都是通過show slave status,當主宕機以後,發生切換,從變為主,原來的主變為從,這時候show slave status就會發生錯誤,因為原來的主沒有開啟slave,不建議直接使用switch操作,而是在DB中做主從對調。

(5)特別註意:schema中的每一個dataHost的host屬性值必須唯一,否則會出現主從在所有dataHost中全部切換的現象,如下所示是不對的,當一組切換時,另一組也同時切換。

<dataHostname="userDBHost" maxCon="1000" minCon="500"balance="2" writeType="0" dbType="mysql"dbDriver="native" switchType="2"slaveThreshold="100">
                 <heartbeat>showslave status</heartbeat>
                <writeHosthost="hostM1" url="172.16.224.204:3306"user="root" password="root123" />
                <writeHosthost="hostS1" url="172.16.227.129:3306"user="root" password="root123" />
</dataHost>
 
<dataHostname="orderDBHost" maxCon="1000" minCon="500"balance="2" writeType="0" dbType="mysql"dbDriver="native" switchType="2"slaveThreshold="100">
                 <heartbeat>showslave status</heartbeat>
                <writeHosthost="hostM1" url="172.16.224.205:3306"user="root" password="root123" />
                <writeHosthost="hostS1" url="172.16.225.249:3306"user="root" password="root123" />
</dataHost>

(6)註意:每天從主的那一端備份全量資料庫和增量資料庫

(7)註意:修改schema.xml要在linux下操作,否則出現編碼錯誤
(8)修改schema.xml後不需要執行switch命令,重啟mycat後自動回復原始狀態

(9)新增表或修改schema後,重新部署順序:1.修改Mycat Schema;2.更新MySQL;3.部署新應用

3、Mycat 1.4 支持MySQL主從復制狀態綁定的讀寫分離機制,讓讀更加安全可靠

<datanodename=</datanodename=

   <dataNodename="dn1" dataHost="localhost1" database="db1"/>
         <dataNodename="dn2" dataHost="localhost1" database="db2"/>
         <dataNodename="dn3" dataHost="localhost1" database="db3"/>
         <dataHostname="localhost1" maxCon="1000" minCon="10"balance="1"
                   writeType="0" dbType="mysql"dbDriver="native" switchType="2"  slaveThreshold="100">
                   <heartbeat>show slave status</heartbeat>
                   <writeHosthost="hostM" url="10.1.176.158:3306" user="root"
                            password="123456">
                            <readHosthost="hostS" url="10.1.176.78:3306" user="root"
                            password="123456"/>
                   </writeHost>
         </dataHost>

(1)設置balance="1"與writeType="0"

1) Balance參數設置:

負載均衡類型,目前的取值有3種:

<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上分發。

2) WriteType參數設置:

<1> writeType="0",所有寫操作發送到配置的第一個writeHost,第一個掛瞭切到還生存的第二個writeHost。如果都掛瞭,那就悲劇瞭,起來哪個,寫哪個,很有可能數據不一致;所以不要資料庫恢復之後不要讓mycat切回。

<2>writeType="1",所有寫操作都隨機的發送到配置的writeHost。

<3>writeType="2",沒實現。

“readHost是從屬於writeHost的,即意味著它從那個writeHost獲取同步數據,因此,當它所屬的writeHost宕機瞭,則它也不會再參與到讀寫分離中來,即“不工作瞭”,這是因為此時,它的數據已經“不可靠”瞭。基於這個考慮,目前mycat 1.3和1.4版本中,若想支持MySQL一主一從的標準配置,並且在主節點宕機的情況下,從節點還能讀取數據,則需要在Mycat裡配置為兩個writeHost並設置banlance=1。”

(2)設置 switchType="2" 與slaveThreshold="100"

“Mycat心跳檢查語句配置為 show slave status ,dataHost 上設定兩個新屬性: switchType="2" 與slaveThreshold="100",此時意味著開啟MySQL主從復制狀態綁定的讀寫分離與切換機制。Mycat心跳機制通過檢測 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running","Slave_SQL_Running" 三個字段來確定當前主從同步的狀態以及Seconds_Behind_Master主從復制時延。“

You May Also Like