1. 程式人生 > >MySQL+MyCat實現讀寫分離和主備熱切換

MySQL+MyCat實現讀寫分離和主備熱切換

配置MyCat的schema.xml檔案

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="t1" primaryKey="id" type="global" dataNode="dn1" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
				  writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
		<heartbeat>show slave status</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="localhost:3306" user="root" password="111111">
				<!-- can have multi read hosts -->
				<readHost host="hostS2" url="localhost:3307" user="root" password="111111" />
		</writeHost>
		<writeHost host="hostS1" url="localhost:3307" user="root" password="111111" />
</dataHost>

配置說明

這裡面,有兩個引數需要注意,balance和 switchType。 balance指的負載均衡型別,目前的取值有4種: 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不負擔讀壓力 switchType指的是切換的模式,目前的取值也有4種: 1. switchType='-1' 表示不自動切換 2. switchType='1' 預設值,表示自動切換 3. switchType='2' 基於MySQL主從同步的狀態決定是否切換,心跳語句為 show slave status 4. switchType='3'基於MySQL galary cluster的切換機制(適合叢集)(1.4.1),心跳語句為 show status like 'wsrep%'。
因此,該配置檔案中的balance="1"意味著作為stand by writeHost的hostS1和hostS2將參與select語句的負載均衡,這就實現了主從的讀寫分離,switchType='-1'意味著當主掛掉的時候,不進行自動切換,即hostS1和hostS2並不會被提升為主,仍只提供讀的功能。這就避免了將資料讀進slave的可能性,畢竟,單純的MySQL主從叢集並不允許將資料讀進slave中,除非配置的是雙master。

注意點

    因為我配置的備伺服器裡面沒有配置readHost,所以我配置的balance為2,這樣讀會分發到writeHost和readHost,防止主備切換後不能讀;當然也可以給備伺服器配置readHost,這樣就算balance為1主備切換也能正常讀

主備切換後怎麼恢復

那麼問題來了,當原來配置的 MySQL 寫節點宕機恢復以後,怎麼重新加入 Mycat,要不要恢復為原來的寫 節點?關於這個問題,我們也曾與 DBA 討論很久,最終的建議方案是,保持現有狀態不變,改旗易幟,恢復後的 MySQL 節點作為從節點,跟隨新的主節點,重新配置主從同步,原先跟隨該節點做同步的其他節點也同樣換帥, 重新配置同步源,這些節點的資料手工完成同步以後,再加入 Mycat 裡。目前 1.3 版本的 Mycat 還沒有實現監控 MySQL 主從同步狀態的功能,因此這個過程裡,DBA 可以先修改 MySQL 的密碼,讓 Mycat 無法連結故障服務 器,等同步完成以後,恢復密碼,這樣 Mycat 就自動重新將修復好的 Mycat 納管進來了。 配置說明