讀寫分離模式
修改mycat的schema.xml:
balance爲1:讓全部的readHost及備用的writeHost參與select的負載均衡。
switchType爲2:基於MySQL主從同步的狀態決定是否切換。
heartbeat:主從切換的心跳語句必須爲show slave status。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
這裏只需要配置三個地方 balance="1"與writeType="0" ,switchType=”1”
a. 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 不負擔讀壓力,注意 balance=3 只在 1.4 及其以後版本有, 1.3 沒有。
b. writeType 屬性
負載均衡類型,目前的取值有 3 種:
1. writeType="0", 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個
writeHost,重新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .
2. writeType="1",所有寫操作都隨機的發送到配置的 writeHost。1.5後廢棄,不推薦
c. switchType 屬性
- -1 表示不自動切換
- 1 默認值,自動切換
- 2 基於MySQL 主從同步的狀態決定是否切換
slaveThreshold="100"
開始支持 MySQL主從複製狀態綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:
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 主從複製時延,
當Seconds_Behind_Master>slaveThreshold 時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數據,而當主節點宕機後,切換邏輯會檢查Slave上的Seconds_Behind_Master是否爲0,爲0時則表示主從同步,可以安全切換,否則不會切換。
<heartbeat>select user()</heartbeat>
心跳檢查語句
主從切換測試
mycat託管配置如下
實際生產環境需要配置雙主,不會切到讀庫