Mycat實現MySQL讀寫分離

        讀寫分離,簡單地說是把對數據庫的讀和寫操做分開,以對應不一樣的數據庫服務器。主數據庫提供寫操做,從數據庫提供讀操做,這樣能有效地減輕單臺數據庫的壓力。主數據庫進行寫操做後,數據及時間同步到所讀的數據庫,儘量保證讀、寫數據庫的數據一致,好比MySQL的主從複製、Oracle的DATA GUARD、SQL Server的複製訂閱等。在不少系統中,讀操做的比例遠高於寫操做,因此對應讀操做的數據庫能夠有多臺,經過負載均衡技術進一步分攤讀操做的壓力,讓整個數據系統高效、平穩地運行。而這些讀寫分離所需的複雜的數據庫架構,要對開發人員和應用程序透明。咱們經過Mycat便可輕易實現上述功能,不只能夠支持MySQL,也能夠支持Oracle和SQL Server。
mysql

Mycat控制後臺數據庫的讀寫分離和負載均衡由schema.xml文件datahost標籤的balance屬性控制。負載均衡類型,目前的取值有以下的種:sql

l  balance=」0」:不開啓讀寫分離機制,全部讀操做都發送到當前可用的writeHost上。數據庫

l  balance=」1」:所有的readHost與standby writeHost都參與select語句的負載均衡,簡而言之,當爲雙主雙從模式(M1->S1,M2->S2,而且M1與M2互爲主備)時,在正常狀況下,M一、S1和S2都參與select語句的負載均衡。服務器

l  balance=」2」:全部的讀操做都隨機地在writeHost、readHost上分發。架構

l  balance=」3」:全部的讀請求都隨機分發到writeHost對應的readHost上執行,writeHost不負擔讀壓力,注意balance只在Mycat1.4及以後的版本中有。負載均衡

下面將經過實例驗證並結合log來講明各類狀況下的讀寫分離。分佈式

MySQL主從讀寫分離的準備環境見下表:ide

項目測試

Mycaturl

MySQL-master

MySQL-slave

IP

11.112.0.123

11.112.0.10

11.112.0.51

Port

8066/9066

3066

3066

MySQL爲一主一從,本文檔重在介紹Mycat的用法,關於MySQL主從配置請參考其餘文檔。

實驗用例表以下:

create database yf;
create table travelrecord(
id int(11) not null auto_increment,
org_code varchar(20) not null,
test_name varchar(20) default null,
primary key(id)
) engine=InnoDB default CHARSET=UTF8;

當balance爲0時,不開啓讀寫分離機制,全部讀操做都發送到當前的writeHost上。Mycat的基本配置以下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
       <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="100">
              <table name="travelrecord" primaryKey="id" dataNode="mysql1" />
       </schema>
       <dataNode name="mysql1" dataHost="mysql1" database="yf" />
       <dataHost name="mysql1" maxCon="1000" minCon="10" balance="0"
                       writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
              <heartbeat>select user()</heartbeat>
              <writeHost host="mysql1" url="11.112.0.10:3306" user="root"
                               password="root">
                     <readHost host="mysql2" url="11.112.0.51:3306" user="root" password="root" />
              </writeHost>
       </dataHost>
</mycat:schema>

登陸管理端口

mysql -uroot -p123456 -P9066 -hmycat1

查看datasource;

1.png

登陸數據端口

mysql -uroot -p123456 -P8066 -hmycat1

屢次執行select * from travelrecord ;經過datasource能夠看到全部讀操做都分發到了mysql1上:

2.png

從日誌中也能夠看到讀操做分發到了mysql1(11.112.0.10)

3.png

當balance爲1時,全部讀操做都發送到了當前writeHost對應的readhost和備用的writehost,這樣就能夠減輕主庫的壓力,高效地提供讀寫操做,而由其餘服務器承擔比較耗費資源的讀操做。

修改schema.xml中的balance=」1」,並從新加載配置文件。

reload @@config_all;

屢次執行select * from travelrecord ;經過datasource能夠看到全部讀操做都分發到了mysql2上:

4.png

從日誌中也能夠看到讀操做分發到了mysql2(11.112.0.51)

5.png

執行插入語句:insert into travelrecord (org_code,test_name) values('1000','test'); 經過datasource能夠看到全部讀操做都分發到了mysql2上:

6.png

因爲這裏只是一主一從,對於balance=3和4的狀況沒法更好的體現,感興趣的同窗能夠自行測試。


參考:《分佈式數據庫架構及企業實踐-基於Mycat中間件》

相關文章
相關標籤/搜索