隨着應用的訪問量併發量的增長,應用讀寫分離是頗有必要的。固然應用要實現讀寫分離,首先數據庫層要先作到主從配置,本人前一篇文章介紹了mysql數據庫的主從配置方式即:《mysql數據庫主從配置》。java
應用實現讀寫分離至少有兩種方法:node
本篇文章是介紹經過Mycat中間件的方式實現讀寫分離。mysql
Mycat是一款開源的數據庫中間件,其官網爲http://www.mycat.io/,其中官方對它介紹爲:linux
Mycat 是一個強大的數據庫中間件,不只僅能夠用做讀寫分離、以及分表分庫、容災備份,並且能夠用於多租戶應用開發、雲平臺基礎設施、讓你的架構具有很強的適應性和靈活性,藉助於即將發佈的Mycat 智能優化模塊,系統的數據訪問瓶頸和熱點一目瞭然,根據這些統計分析數據,你能夠自動或手工調整後端存儲,將不一樣的表映射到不一樣存儲引擎上,而整個應用的代碼一行也不用改變。
Mycat的實現原理爲:web
Mycat 的原理中最重要的一個動詞是「攔截」,它攔截了用戶發送過來的SQL 語句,首先對SQL 語句作了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,而後將此SQL 發日後端的真實數據庫,並將返回的結果作適當的處理,最終再返回給用戶。
關於Mycat更多的介紹你們能夠查看官網。spring
應用是直接鏈接Mycat,而後Mycat管理了1個主數據庫和1個從數據庫,架構以下:sql
其中每一個組件對應服務器地址爲:數據庫
注意:對於mysql的主從配置方式請參考《mysql數據庫主從配置》。後端
部署Mycat步驟爲:緩存
(1)、安裝JDK,因爲Mycat是基於Java語言來編寫的,因此須要安裝JDK,版本爲1.8便可。
JDK安裝包能夠到官網下載,下載後解壓,而後配置環境變量,即:
在/etc/profile文件中加入
export JAVA_HOME=/opt/jdk1.8.0_112 export PATH=$JAVA_HOME/bin:$PATH
(2)、下載Mycat安裝包,版本爲1.6-RELEASE,下載地址爲http://dl.mycat.io/1.6-RELEASE/,選擇linux環境的版本便可。
(3)、將Mycat安裝包上傳服務器後解壓,即:
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
以上3步就至關於將Mycat部署好了,如今就須要配置Mycat了。
配置Mycat步驟爲:
(1)、在主庫和從庫中分別建立用於Mycat鏈接的帳號,即:
GRANT CREATE,DELETE,INSERT,SELECT,UPDATE ON jgyw.* TO 'jgywuser'@'192.168.197.131' IDENTIFIED BY 'jgyw@123';
以上語句的意思是建立一個jgywuser用戶,該用戶只有對jgyw模式下的表有增刪改查的權限。
(2)、配置Mycat的schema.xml文件,該文件位於Mycat中conf文件夾下,配置以下:
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="jgywnode"> </schema> <dataNode name="jgywnode" dataHost="jgywhost" database="jgyw" /> <dataHost name="jgywhost" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="master" url="192.168.197.135:3306" user="jgywuser" password="jgyw@123"> <readHost host="slave" url="192.168.197.136:3306" user="jgywuser" password="jgyw@123"/> </writeHost> </dataHost> </mycat:schema>
其中:
schema 標籤用於定義MyCat 實例中的邏輯庫,MyCat 能夠有多個邏輯庫,每一個邏輯庫都有本身的相關配置。可使用schema 標籤來劃分這些不一樣的邏輯庫。
dataNode 標籤訂義了MyCat 中的數據節點,也就是咱們一般說所的數據分片。一個dataNode 標籤就是一個獨立的數據分片。
dataHost標籤直接定義了具體的數據庫實例、讀寫分離配置和心跳語句。其中有幾個重要的屬性:
balance屬性 負載均衡類型,目前的取值有3 種: 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 沒有。 writeType 屬性 負載均衡類型,目前的取值有3 種: writeType="0", 全部寫操做發送到配置的第一個writeHost,第一個掛了切到還生存的第二個 writeHost,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties . writeType="1",全部寫操做都隨機的發送到配置的writeHost,1.5 之後廢棄不推薦。
(3)、配置server.xml,即主要配置鏈接Mycat的用戶帳號信息,即:
<user name="jgyw"> <property name="password">jgyw</property> <property name="schemas">TESTDB</property> <property name="readOnly">false</property> </user>
即配置一個用戶名爲jgyw,密碼爲jgyw的用戶,同時具備TESTDB模式下的讀寫權限,注意該模式便是在schema.xml配置文件定義的模式名同樣。
(4)、啓動Mycat,即:
./mycat start
Mycat啓動成功後,會開放兩個端口,即數據端口8066,管理端口9066
首先在主庫的jgyw模式下建立一個comm_config表,即:
CREATE TABLE comm_config (configId varchar(200) NOT NULL ,configValue varchar(1024) DEFAULT NULL ,description varchar(2000) DEFAULT NULL ,PRIMARY KEY (configId)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
應用的數據庫鏈接配置信息爲:
spring: datasource: url: jdbc:mysql://192.168.197.131:8066/TESTDB username: jgyw password: jgyw driver-class-name: com.mysql.jdbc.Driver
用的是8066端口,同時用戶也是server.xml配置文件中配置的用戶。
測試的數據接口,即:
package com.swnote.common.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.swnote.common.domain.Config; import com.swnote.common.service.IConfigService; import lombok.extern.slf4j.Slf4j; @Slf4j @RestController public class ConfigController { @Autowired private IConfigService configService; @RequestMapping(value = "/config/save", method = RequestMethod.POST) public Config save(@RequestBody Config config) throws Exception { try { configService.save(config); return config; } catch (Exception e) { log.error("新增配置信息錯誤", e); throw e; } } @RequestMapping(value = "/config/list", method = RequestMethod.GET) public List<Config> list() throws Exception { try { return configService.list(); } catch (Exception e) { log.error("查詢配置信息錯誤", e); throw e; } } }
進入Mycat的管理端,即:
mysql -h127.0.0.1 -ujgyw -pjgyw -P9066
而後執行命令:
show @@datasource;
能夠查到:
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+ | jgywnode | master | mysql | 192.168.197.135 | 3306 | W | 0 | 10 | 1000 | 8959 | 0 | 42 | | jgywnode | slave | mysql | 192.168.197.136 | 3306 | R | 0 | 10 | 1000 | 8937 | 22 | 0 | +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+ 2 rows in set (0.00 sec)
當調用讀接口時READ_LOAD的值對應在slave上會加1說明是走從庫;
當調用寫接口時WRITE_LOAD的值對就在master上會加1說明是走主庫。
以你最方便的方式關注我:
微信公衆號: