Mycat 筆記 2:雙主雙從
1. 結構
192.168.0.100 master1
192.168.0.101 slave1
192.168.0.190 master2
192.168.0.191 slave2
192.168.0.170 mycat
slave1 是 master1 的從庫
slave2 是 master2 的從庫
master1 和 master2 互為主從,
建議 mysql 例項是 gtid + semi sync + mts,或者 PXC,或者 MGR
此處演示為了方便採用普通非同步複製。
2. 雙主雙從高可用
據說 mycat 推薦的底層節點架構是雙主雙從來保證高可用。
在 mycat 的配置中,
- master1 為第一個 write host,
- master2 為第二個 write host,也就是 stand for write host
如果 master1 宕機的話,因為有 switchType=1 會自動切換到 master2 上面
<dataHost> 標籤中配置 writeType=0,也就是:
- 所有寫操作均由第一個 write host 承擔,第一個宕機再由第二個負擔
<dataHost> 標籤中配置 balance=1,也就是:
- 所有的讀操作在 read host 和 stand for write host 之間負擔
由此,在雙主雙從中,往 master1 寫資料,從 master2、slave1、slave2 中讀資料,
由此來實現高可用。
3. 雙主雙從的搭建
-
slave1 是 master1 的從庫
-
slave2 是 master2 的從庫
-
master1 和 master2 互為主從
-
master1 是 master2 的從庫
-
master2 是 master1 的從庫
-
搭建過程 略
4. mycat 的 schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="2m2s" database="world" /> <dataHost name="2m2s" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.0.100:3306" user="root" password="123456"> <readHost host="hostS1" url="192.168.0.101:3306" password="123456" user="root" /> </writeHost> <writeHost host="hostM2" url="192.168.0.190:3306" user="root" password="123456"> <readHost host="hostS2" url="192.168.0.191:3306" password="123456" user="root" /> </writeHost> </dataHost> </mycat:schema>
如上:
邏輯庫依舊是 TESTDB
對應的資料節點是 dn1
資料節點對應的主機組是 2m2s
2m2s 下:
hostM1 作為寫節點(100),其從庫 hostS1(101)作為讀節點
hostM2 作為 stand by 寫節點(190),其從庫 hostS2(191)作為讀節點
5. 啟動 mycat 測試讀寫分離和高可用
(1)讀寫分離
寫操作:
如上,寫操作在 hostM1(100)上完成
讀操作:
如上,
讀操作分別在幾個節點中進行,(並非輪詢)
(2)高可用
先停掉 master1
再次檢視讀寫分離
如上,
master1 宕機後,其從庫 slave1 也不再參與到讀中,
如上,寫操作切換到 master2(190)
在 master1 宕機期間,插入一些資料,
還是建議寫 use database; SQL; 的方式
重新啟動 master1
master1 和 slave1 重新加入,並且已經同步了資料