1. 程式人生 > >使用mycat實現mysql讀寫分離以及主備自動切換模式

使用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被路由到了哪個伺服器上

特別注意:

查詢語句不要加事務,否則讀操作會被分發到寫伺服器上。