使用mycat實現mysql讀寫分離以及主備自動切換模式
一:軟體環境
Window7
Mycat-server1.6
JDK1.8
Mysql5.62臺
二:讀寫分離的好處增加了冗餘(備份資料)。
讀寫分開,減輕機器壓力,提高資料庫併發。
Mycat自身不提供主從複製的功能,也不做資料備份,因此應用Mycat做讀寫分離,主從複製還得使用Mysql的機制。
讀寫分離架構圖:
三:讀寫分離配置
(1)配置連線資訊
Mycat的server.xml配置邏輯庫的名稱訪問的賬號密碼
<user name="root"> <property name="password">digdeep</property> <property name="schemas">TESTDB</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user>
配置說明:
配置中name是應用連線中介軟體邏輯庫的使用者名稱。
mycat中password是應用連線中介軟體邏輯庫的密碼。
schemas中可以配置一個或多個。
readOnly是應用連線中介軟體邏輯庫所具有的許可權。true為只讀,false為讀寫都有,預設為false。
(2)配置資料庫資訊
修改schema裡面的配置
僅僅主從讀寫分離的配置:
<?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" dataHost="localhost1" database="test" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>show slave status</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS2" url="localhost:3307" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
主掛掉之後自動切換到從的配置:
<?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" dataHost="localhost1" database="test" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>show slave status</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS2" url="localhost:3307" user="root" password="123456" /> </writeHost> <writeHost host="hostM2" url="localhost:3307" user="root" password="123456"/> </dataHost> </mycat:schema>
配置說明:
name屬性唯一標識dataHost標籤,供上層的標籤使用。
maxCon屬性指定每個讀寫例項連線池的最大連線。也就是說,標籤內巢狀的
writeHost、readHost標籤都會使用這個屬性的值來例項化出連線池的最大連線數。
minCon屬性指定每個讀寫例項連線池的最小連線,初始化連線池的大小。
balance屬性負載均衡型別,目前的取值有3種:
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沒有。
writeType屬性負載均衡型別,目前的取值有3種:
1.writeType="0", 所有寫操作傳送到配置的第一個writeHost,第一個掛了切到還生存的第二個writeHost,重新啟動後已切換後的為準,切換記錄在配置檔案中:dnindex.properties.
2.writeType="1",所有寫操作都隨機的傳送到配置的writeHost,1.5以後廢棄不推薦。
3.writeType="2",不執行寫操作
switchType屬性
-1 表示不自動切換
1 預設值,自動切換
2 基於MySQL主從同步的狀態決定是否切換
3 基於MySQLgalarycluster的切換機制(適合叢集)(1.4.1)
心跳語句為show status like‘wsrep%’
dbType屬性
指定後端連線的資料庫型別,目前支援二進位制的mysql協議,還有其他使用
JDBC連線的資料庫。例如:mongodb、oracle、spark等。
dbDriver屬性指定連線後端資料庫使用的
Driver,目前可選的值有native和JDBC。使用native的話,因為這個值執行的是二進位制的mysql協議,所以可以使用mysql和maridb。其他型別的資料庫則需要使用JDBC驅動來支援。從1.6版本開始支援postgresql的native原始協議。如果使用JDBC的話需要將符合JDBC 4標準的驅動JAR包放到MYCAT\lib目錄下,並檢查驅動JAR包中包括如下目錄結構的檔案:
META-INF\services\java.sql.Driver。在這個檔案內寫上具體的Driver類名,例如:com.mysql.jdbc.Driver。
heartbeat標籤這個標籤內指明用於和後端資料庫進行心跳檢查的語句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。這個標籤還有一個
connectionInitSql屬性,主要是當使用Oracla資料庫時,需要執行的初始化SQL
語句就這個放到這裡面來。例如:altersession set nls_date_format='yyyy-mm-dd hh24:mi:ss'
1.4主從切換的語句必須是:showslave status
writeHost標籤、readHost標籤
這兩個標籤都指定後端資料庫的相關配置給mycat,用於例項化後端連線池。唯一不同的是,
writeHost指定寫例項、readHost指定讀例項,組著這些讀寫例項來滿足系統的要求。
在一個dataHost內可以定義多個writeHost和readHost。但是,如果writeHost
指定的後端資料庫宕機,那麼這個writeHost繫結的所有readHost都將不可用。另一方面,由於這個writeHost宕機系統會自動的檢測到,並切換到備用的writeHost上去。
(3)啟動mycat
在mycat的lib包下面丟入mysql的驅動包,然後在mycat\bin目錄下找到startup_nowrap.bat雙擊執行。
雙擊沒有一閃而退,就啟動成功了。如果啟動不成功,仔細檢查配置資訊。
(4)連線mycat將mycat啟動起來後,用jdbc的方式連線,預設埠是8066,邏輯庫名和賬號密碼就是在server裡配置的資訊。
四:讀寫分離測試將mycat的日誌輸出級別改完debug,在conf/log4j2.xml裡配置
然後去查詢去新增資料在/logs/mycat.log日誌檔案裡檢視sql被路由到了哪個伺服器上
特別注意:
查詢語句不要加事務,否則讀操作會被分發到寫伺服器上。