讀寫分離,簡單地說是把對數據庫的讀和寫操做分開,以對應不一樣的數據庫服務器。主數據庫提供寫操做,從數據庫提供讀操做,這樣能有效地減輕單臺數據庫的壓力。主數據庫進行寫操做後,數據及時間同步到所讀的數據庫,儘量保證讀、寫數據庫的數據一致,好比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;
登陸數據端口
mysql -uroot -p123456 -P8066 -hmycat1
屢次執行select * from travelrecord ;經過datasource能夠看到全部讀操做都分發到了mysql1上:
從日誌中也能夠看到讀操做分發到了mysql1(11.112.0.10)
當balance爲1時,全部讀操做都發送到了當前writeHost對應的readhost和備用的writehost,這樣就能夠減輕主庫的壓力,高效地提供讀寫操做,而由其餘服務器承擔比較耗費資源的讀操做。
修改schema.xml中的balance=」1」,並從新加載配置文件。
reload @@config_all;
屢次執行select * from travelrecord ;經過datasource能夠看到全部讀操做都分發到了mysql2上:
從日誌中也能夠看到讀操做分發到了mysql2(11.112.0.51)
執行插入語句:insert into travelrecord (org_code,test_name) values('1000','test'); 經過datasource能夠看到全部讀操做都分發到了mysql2上:
因爲這裏只是一主一從,對於balance=3和4的狀況沒法更好的體現,感興趣的同窗能夠自行測試。
參考:《分佈式數據庫架構及企業實踐-基於Mycat中間件》