在MySQL中間件出現之前,對於MySQL主從集羣,如果要實現其讀寫分離,一般是在程序端實現,這樣就帶來一個問題,即數據庫和程序的耦合度太高,如果我數據庫的地址發生改變了,那麼我程序端也要進行相應的修改,如果數據庫不小心掛掉了,則同時也意味着程序的不可用,而這對很多應用來說,並不能接受。
在這裏,我用三個實例組成MySQL主從集羣,來驗證MyCAT的讀寫分離功能。
Mysql主從複製:
https://blog.csdn.net/qq_16171815/article/details/96300490
Mycat讀寫分離
1、下載mycat
官網下載地址:http://www.mycat.org.cn/
下載完之後,解壓到本地
2、配置文件
進入到conf文件夾,配置schema.xml,server.xml兩個文件
打開schema.xml文件,去掉一些繁雜的配置,讀寫分離只需要下列配置:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--【name】屬性:mycat實例,與server.xml配置相同-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<!--【database】屬性:真實的數據庫-->
<dataNode name="dn1" dataHost="localhost1" database="mycat_test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat><!--mycat的心跳-->
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root"><!--寫服務器篇配置-->
<readHost host="hostS1" url="192.168.127.129:3306" user="root" password="root" /><!--讀服務器篇配置-->
<readHost host="hostS2" url="192.168.127.130:3306" user="root" password="root" /><!--讀服務器篇配置-->
</writeHost>
</dataHost>
</mycat:schema>
打開server.xml,去掉一些繁雜的配置,讀寫分離只需要下列配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">1</property> <!-- 1爲開啓實時統計、0爲關閉 -->
</system>
<!--mycat用戶節點,schema要與schema.xml一致-->
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
</user>
<user name="read">
<property name="password">read</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property><!--是否只讀-->
</user>
</mycat:server>
3、啓動mycat
進入到bin目錄下,進入窗口模式,
先install mycat:mycat.bat install
啓動mycat:mycat.bat start
其他命令
重啓:mycat.bat restart
停止:mycat.bat stop
4、驗證mycat讀寫分離
通過mysql連接工具,我這裏是sqlyog,連接mycat,用戶名和密碼就是剛纔server.xml文件配置的
連接成功之後,會發現有一個數據庫實例,和一張表,TESTDB就是server.xml和schema.xml配置相同的地方
剛好和需要讀寫分離的庫吻合
我們現將mysql主從複製的表中數據都刪除
說明:主服務器是本機(localhost),兩個從機分別是(192.168.127.129和192.168.127.130)
mycat中也沒有數據
下面通過mycat插入數據
插入成功,看下數據,一主兩從都有數據
因爲是主從複製,只有通過主服務器插入數據,從服務器纔有更新數據,所以肯定是寫是在主服務器
下面驗證讀,我們在兩個從服務器中各插入一條數據,這樣主服務器是不會更新數據的
可以看到讀出來的數據,和主庫數據不同
5、問題總結
搭建的過程中,遇到各種問題,絕大部分都是server.xml和schema.xml文件配置錯誤,這兩個文件的配置網上很多,這裏不做敘述,各個節點的解釋和含義,網上也很多