讀寫分離在我們配置數據庫集羣時是必然會考慮的一個點,因爲這可以有效的降低主庫的負載,並且在讀多餘寫的情況下,絕大部分的讀請求都可以分發到各個不同的從庫上。即使從庫負載不夠,也可以通過增加從庫的方式來提升整體的查詢效率。本文主要講解MyCat
如何進行讀寫分離的配置。
1. 環境搭建
爲了搭建讀寫分離數據庫架構,這裏我們需要準備兩個數據庫,一個作爲主庫,一個作爲從庫。本文所使用的方式是通過docker搭建的主從架構,因而可以在本機上直接運行。具體配置如下:
角色 | 主機名 | 主機ip | 主機端口 |
---|---|---|---|
主庫 | mysql-master | 127.0.0.1 | 3306 |
從庫 | mysql-slave | 127.0.0.1 | 3307 |
關於docker如何搭建MySQL主從數據庫,讀者朋友可以閱讀本人的文章(Docker搭建MySQL主從集羣)。讀者朋友也可以通過虛擬機的方式搭建主從數據庫,這裏就不再贅述。
2. MyCat配置
關於MyCat的配置,其主要是需要在某一個數據庫節點上同時指定主庫和從庫。下面是一個示例:
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mydb" checkSQLschema="true" sqlMaxLimit="100"> <table name="t_user" primaryKey="id" autoIncrement="true" dataNode="dn1"/> </schema> <dataNode name="dn1" dataHost="dhost1" database="db1"/> <dataHost name="dhost1" maxCon="1000" minCon="10" balance="1" writeType="0" switchType="-1" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="localhost:3306" user="root" password="root"/> <writeHost host="hostS1" url="localhost:3307" user="root" password="root"/> </dataHost></mycat:schema>
關於上述配置,主要有如下幾點需要說明:
xml的配置順序
schema
、dataNode
和dataHost
的順序不能發生變化;在
dataHost
中通過writeHost
將主庫和從庫都配置進去,MyCat
可以通過show master status
來檢測具體哪一個是主庫,哪一個是從庫;在
dataHost
上有兩個參數:balance
和switchType
。-1表示當master掛了的時候,主從不進行自動切換;
1表示當master掛了的時候,主從進行自動切換;
2表示當master掛了的時候,基於MySQL的主從複製狀態來決定是否進行自動切換;鄭州不孕不育醫院性價比哪家好:http://yyk.39.net/zz3/zonghe/1d427.html
3表示當master掛了的時候,基於MySQL galary cluster的模式進行自動切換。
0表示不開啓讀寫分離機制,所有的讀寫操作都發送到writeHost上;
1表示開始讀寫分離機制,所有的讀操作都會發送到slave和standby-master上,所謂的standby-master指的是當前master的備用master節點;
2表示所有的讀操作隨機的在master和slave上分發;
3表示所有的讀操作都分發到slave上,而master和standby-master都不負擔讀操作;
這裏
balance
可以指定四個值,其各個值的含義如下:這裏
switchType
也可以指定四個值,各個值的含義如下:https://www.jianshu.com/p/3b9c64fdcec9
在進行讀寫分離的時候,如果master節點宕機,那麼此時,slave節點還是可以正常提供讀操作的,而對於客戶端發送的寫操作,將會拋出異常。
上述配置是讀寫分離的第一種方式,還有一種配置方式,就是將slave節點寫到master節點內部,從而表明從屬關係。其配置方式如下:
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mydb" checkSQLschema="true" sqlMaxLimit="100"> <table name="t_user" primaryKey="id" autoIncrement="true" dataNode="dn1"/> </schema> <dataNode name="dn1" dataHost="dhost1" database="db1"/> <dataHost name="dhost1" maxCon="1000" minCon="10" balance="1" writeType="0" switchType="-1" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="localhost:3306" user="root" password="root"> <readHost host="hostS1" url="localhost:3307" user="root" password="root" weight="1"/> </writeHost> </dataHost></mycat:schema>
對於這種配置方式,有相關的文章說,如果master宕機,那麼這種方式配置的slave機器就無法提供讀服務,但是根據筆者的測試,其還是可以正常提供讀服務的,因而上述兩種方式沒有特別大的區別。
3. 小結
本文主要講解了MyCat
主從模式搭建的兩種方式,並且詳細講解了其配置方式中需要注意的點。