mycat搭建讀寫分離
摘自:https://www.cnblogs.com/youzhibing/p/9553766.html
之前安裝過MySQL與MySQL的主從複制現在就不示範了
mycat是基于jdk的是以要先安裝jdk,版本一定要高7以上。
先下載下傳mycat的tar包
http://www.mycat.org.cn/

如圖所示,writeHost表示主節點,readHost表示從節點,Mycat内部定期對一個dataHost裡所有的writeHost與readHost節點發起心跳檢測(writeHost與readHost都可以配置多個,至于資料同步的問題則需要我們從mysql層面實作了,Mycat并不提供資料同步的支援,本文隻講mysql一主一從),正常情況下,Mycat會将第一個writeHost作為寫節點,所有的DML SQL會發送給此節點,若Mycat開啟了讀寫分離,則Select SQL會根據讀寫分離政策發往readHost(+writeHost)執行。當一個dataHost裡面配置了多個writeHost時,如果第一個writeHost當機,則Mycat會在預設的3次心跳檢查失敗後,自動切換到下一個可用的writeHost,以此類推。
這存在一個問題,就是當當機的writeHost恢複後,怎麼重新加入Mycat,要不要恢複為原來的寫節點? 最佳建議方式是:保持現有狀态不變,改旗易幟,恢複後的mysql節點作為從節點,跟随新的主節點,重新配置主從同步,原來跟随該節點做同步的從節點也同樣換帥,重新配置同步源,這些節點的資料手工完成同步後,再加入Mycat裡。
[[email protected] opt]# cp Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local
[[email protected] local]# useradd mycat
[[email protected] local]# chown -R mycat:mycat /usr/local/mycat
[[email protected] local]# passwd mycat
将MyCat配置到環境變量中
[[email protected] local]# vi /etc/profile
增加如下内容
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
儲存後退出,執行source指令使配置生效
[[email protected] local]# source /etc/profile
配置mycat
隻需要簡單配置下schema.xml
a. balance 屬性負載均衡類型,目前的取值有 4 種:
- balance=“0”, 不開啟讀寫分離機制,所有讀操作都發送到目前可用的 writeHost 上。
- balance=“1”,全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1 ->S1 , M2->S2,并且 M1 與 M2 互為主備),正常情況下, M2,S1,S2 都參與 select 語句的負載均衡。
- balance=“2”,所有讀操作都随機的在 writeHost、 readhost 上分發。
- balance=“3”, 所有讀請求随機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,注意 balance=3 隻在 1.4 及其以後版本有, 1.3 沒有。
b. writeType 屬性
負載均衡類型,目前的取值有 3 種:
-
writeType=“0”, 所有寫操作發送到配置的第一個 writeHost,第一個挂了切到還生存的第二個
writeHost,重新啟動後已切換後的為準,切換記錄在配置檔案中:dnindex.properties .
- writeType=“1”,所有寫操作都随機的發送到配置的 writeHost。
- writeType=“2”,沒實作。
c. switchType 屬性
- -1 表示不自動切換
- 1 預設值,自動切換
- 2 基于MySQL 主從同步的狀态決定是否切換
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 虛拟庫名稱 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> --> <!-- 真實庫名稱 -->
<dataNode name="dn1" dataHost="localhost1" database="math" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.31.113:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.31.114:3306" user="root" password="123456" /> <!-- 讀寫分離; 寫走hostM1,讀走hostS1; hostM1當機了, hostS1也不可用 -->
</writeHost>
</dataHost>
</mycat:schema>
這裡隻需要改database的名字 db1 就是你真實資料庫服務上的資料庫名 .
根據你自己的資料庫名進行修改.
修改server.xml
vi /server.xml
拉倒最後面修改mycat的登入使用者名或密碼與MySQL做于區分
修改儲存後到mycat的bin目錄中輸入
./mycat console
./mycat console是可以檢視啟動日志的可以看到哪裡出現了錯誤便于修改
如果啟動沒有問題可以使用mycat start
啟動後可以再進行測試一下讀寫分離與主從複制
我這裡使用了2台Linux因為113安裝master與mycat,114安裝slave
注意
mycat的端口号為8066
一切就緒就可以測試了
可以在113的mycat中寫入資料
到113的MySQL中檢視是否寫入,
在114中也檢視是否同步。
檢視讀寫分離也可以将MySQL的主從複制關掉,直接測試mycat的讀寫分離
也可以是手動的修改113上的資料,在修改114上的資料讓兩個資料不一緻,在再113mycat上檢視到底是讀的那個資料源上的資料。
嗯~在測試中springboot+jpa的時候遇到了一點問題,是jpa本身的事務導緻mycat在讀寫時都走了master寫庫,可以将jpa的事務關掉就可以了。
/**
* 關閉jpamor預設事務
*/
@EnableJpaRepositories(basePackages = "com.albd.math", enableDefaultTransactions = false)
@Configuration
public class JpaTransactionConfig {
}
摘自: https://www.cnblogs.com/youzhibing/p/9553766.html