關系型數(shù)據(jù)的分布式處理系統(tǒng)MyCAT
——概述和基本使用教程
日期:2014/12/24
文:阿蜜果
1、 MyCAT概述
1.1 背景
隨著傳統(tǒng)的數(shù)據(jù)庫技術日趨成熟、計算機網(wǎng)絡技術的飛速發(fā)展和應用范圍的擴充,數(shù)據(jù)庫應用已經(jīng)普遍建立于計算機網(wǎng)絡之上。這時集中式數(shù)據(jù)庫系統(tǒng)表現(xiàn)出它的不足:
(1)集中式處理,勢必造成性能瓶頸;
(2)應用程序集中在一臺計算機上運行,一旦該計算機發(fā)生故障,則整個系統(tǒng)受到影響,可靠性不高;
(3)集中式處理引起系統(tǒng)的規(guī)模和配置都不夠靈活,系統(tǒng)的可擴充性差。
在這種形勢下,集中式數(shù)據(jù)庫將向分布式數(shù)據(jù)庫發(fā)展。
1.2 發(fā)展歷程
MyCAT的誕生,要從其前身Amoeba和Cobar說起。
Amoeba(變形蟲)項目,該開源框架于2008年開始發(fā)布一款 Amoeba for Mysql軟件。這個軟件致力于MySQL的分布式數(shù)據(jù)庫前端代理層,它主要在應用層訪問MySQL的時候充當SQL路由功能,專注于分布式數(shù)據(jù)庫代理層(Database Proxy)開發(fā)。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關的到目標數(shù)據(jù)庫、可并發(fā)請求多臺數(shù)據(jù)庫合并結果。 通過Amoeba你能夠完成多數(shù)據(jù)源的高可用、負載均衡、數(shù)據(jù)切片的功能,目前Amoeba已在很多企業(yè)的生產(chǎn)線上面使用。
阿里巴巴于2012年6月19日,正式對外開源的數(shù)據(jù)庫中間件Cobar,前身是早已經(jīng)開源的Amoeba,不過其作者陳思儒離職去盛大之后,阿里巴巴內(nèi)部考慮到Amoeba的穩(wěn)定性、性能和功能支持,以及其他因素,重新設立了一個項目組并且更換名稱為Cobar。Cobar 是由 Alibaba 開源的 MySQL 分布式處理中間件,它可以在分布式的環(huán)境下看上去像傳統(tǒng)數(shù)據(jù)庫一樣提供海量數(shù)據(jù)服務。
Cobar自誕生之日起, 就受到廣大程序員的追捧,但是自2013年后,幾乎沒有后續(xù)更新。在此情況下,MyCAT應運而生,它基于阿里開源的Cobar產(chǎn)品而研發(fā),Cobar的穩(wěn)定性、可靠性、優(yōu)秀的架構和性能,以及眾多成熟的使用案例使得MyCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,MyCAT能看到更遠。目前MyCAT的最新發(fā)布版本為1.2版本。
1.3介紹
1.3.1 MyCat的下載方式
MyCAT的SVN地址為:http://code.taobao.org/svn/openclouddb/
目錄結構如下圖所示:
讀者可在doc/1.2子目錄,可查看該產(chǎn)品1.2版本的主要文檔,如下圖所示:
1.3.2 什么是MyCat?
簡單的說,MyCAT就是:
- 一個新穎的數(shù)據(jù)庫中間件產(chǎn)品;
- 一個徹底開源的、面向企業(yè)應用開發(fā)的“大數(shù)據(jù)庫集群”;
- 支持事務、ACID、可以替代MySQL的加強版數(shù)據(jù)庫;
- 一個可以視為“MySQL”集群的企業(yè)級數(shù)據(jù)庫,用來替代昂貴的Oracle集群;
- 一個融合內(nèi)存緩存技術、Nosql技術、HDFS大數(shù)據(jù)的新型SQL Server;
- 結合傳統(tǒng)數(shù)據(jù)庫和新型分布式數(shù)據(jù)倉庫的新一代企業(yè)級數(shù)據(jù)庫產(chǎn)品。
1.3.3 MyCat的目標
MyCAT的目標是:低成本的將現(xiàn)有的單機數(shù)據(jù)庫和應用平滑遷移到“云”端,解決數(shù)據(jù)存儲和業(yè)務規(guī)模迅速增長情況下的數(shù)據(jù)瓶頸問題。
1.3.4 MyCat的關鍵特性
· 支持 SQL 92標準;
· 支持MySQL集群,可以作為Proxy使用;
· 支持JDBC連接ORACLE、DB2、SQL Server,將其模擬為MySQL Server使用;
· 支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性數(shù)據(jù)分片集群;
· 自動故障切換,高可用性;
· 支持讀寫分離,支持MySQL雙主多從,以及一主多從的模式;
· 支持全局表,數(shù)據(jù)自動分片到多個節(jié)點,用于高效表關聯(lián)查詢;
· 支持獨有的基于E-R 關系的分片策略,實現(xiàn)了高效的表關聯(lián)查詢;
· 多平臺支持,部署和實施簡單。
1.3.5 MyCat的優(yōu)勢
· 基于阿里開源的Cobar產(chǎn)品而研發(fā),Cobar的穩(wěn)定性、可靠性、優(yōu)秀的架構和性能,以及眾多成熟的使用案例使得MyCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,能看到更遠。
· 廣泛吸取業(yè)界優(yōu)秀的開源項目和創(chuàng)新思路,將其融入到MyCAT的基因中,使得MyCAT在很多方面都領先于目前其他一些同類的開源項目,甚至超越某些商業(yè)產(chǎn)品。
· MyCAT背后有一只強大的技術團隊,其參與者都是5年以上資深軟件工程師、架構師、DBA等,優(yōu)秀的技術團隊保證了MyCAT的產(chǎn)品質(zhì)量。
· MyCAT并不依托于任何一個商業(yè)公司,因此不像某些開源項目,將一些重要的特性封閉在其商業(yè)產(chǎn)品中,使得開源項目成了一個擺設。
1.4 總體架構
MyCAT的架構如下圖所示:
MyCAT使用MySQL的通訊協(xié)議模擬成一個MySQL服務器,并建立了完整的Schema(數(shù)據(jù)庫)、Table (數(shù)據(jù)表)、User(用戶)的邏輯模型,并將這套邏輯模型映射到后端的存儲節(jié)點DataNode(MySQL Instance)上的真實物理庫中,這樣一來,所有能使用MySQL的客戶端以及編程語言都能將MyCAT當成是MySQLServer來使用,不必開發(fā)新的客戶端協(xié)議。
當MyCAT收到一個客戶端發(fā)送的SQL請求時,會先對SQL進行語法分析和檢查,分析的結果用于SQL路由,SQL路由策略支持傳統(tǒng)的基于表格的分片字段方式進行分片,也支持獨有的基于數(shù)據(jù)庫E-R關系的分片策略,對于路由到多個數(shù)據(jù)節(jié)點(DataNode)的SQL,則會對收到的數(shù)據(jù)集進行“歸并”然后輸出到客戶端。
SQL執(zhí)行的過程,簡單的說,就是把SQL通過網(wǎng)絡協(xié)議發(fā)送給后端的真正的數(shù)據(jù)庫上進行執(zhí)行,對于MySQL Server來說,是通過MySQL網(wǎng)絡協(xié)議發(fā)送報文,并解析返回的結果,若SQL不涉及到多個分片節(jié)點,則直接返回結果,寫入客戶端的SOCKET流中,這個過程是非阻塞模式(NIO)。
DataNode是MyCAT的邏輯數(shù)據(jù)節(jié)點,映射到后端的某一個物理數(shù)據(jù)庫的一個Database,為了做到系統(tǒng)高可用,每個DataNode可以配置多個引用地址(DataSource),當主DataSource被檢測為不可用時,系統(tǒng)會自動切換到下一個可用的DataSource上,這里的DataSource即可認為是Mysql的主從服務器的地址。
1.5 邏輯庫
與任何一個傳統(tǒng)的關系型數(shù)據(jù)庫一樣,MyCAT也提供了“數(shù)據(jù)庫”的定義,并有用戶授權的功能,下面是MyCAT邏輯庫相關的一些概念:
- schema:邏輯庫,與MySQL中的Database(數(shù)據(jù)庫)對應,一個邏輯庫中定義了所包括的Table。
- table:表,即物理數(shù)據(jù)庫中存儲的某一張表,與傳統(tǒng)數(shù)據(jù)庫不同,這里的表格需要聲明其所存儲的邏輯數(shù)據(jù)節(jié)點DataNode,這是通過表格的分片規(guī)則定義來實現(xiàn)的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴于與“父表”的具體分片地址,簡單的說,就是屬于父表里某一條記錄A的子表的所有記錄都與A存儲在同一個分片上。
- 分片規(guī)則:是一個字段與函數(shù)的捆綁定義,根據(jù)這個字段的取值來返回所在存儲的分片(DataNode)的序號,每個表格可以定義一個分片規(guī)則,分片規(guī)則可以靈活擴展,默認提供了基于數(shù)字的分片規(guī)則,字符串的分片規(guī)則等。
- dataNode: MyCAT的邏輯數(shù)據(jù)節(jié)點,是存放table的具體物理節(jié)點,也稱之為分片節(jié)點,通過DataSource來關聯(lián)到后端某個具體數(shù)據(jù)庫上,一般來說,為了高可用性,每個DataNode都設置兩個DataSource,一主一從,當主節(jié)點宕機,系統(tǒng)自動切換到從節(jié)點。
- dataHost:定義某個物理庫的訪問地址,用于捆綁到dataNode上。
MyCAT目前通過配置文件的方式來定義邏輯庫和相關配置:
· MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節(jié)點等內(nèi)容;
· MYCAT_HOME/conf/rule.xml中定義分片規(guī)則;
· MYCAT_HOME/conf/server.xml中定義用戶以及系統(tǒng)相關變量,如端口等。
下圖給出了MyCAT 一個可能的邏輯庫到物理庫(MySQL的完整映射關系),可以看出其強大的分片能力以及靈活的Mysql集群整合能力。
1.6 交流方式
MyCAT的QQ群還比較活躍,都已經(jīng)900多人,有興趣的朋友可以加入,群號:106088787。
2、 基本使用教程
2.1 下載和安裝
MyCAT使用Java開發(fā),因為用到了JDK 7的部分功能,所以在使用前請確保安裝了JDK 7.0,并設置了正確的Java環(huán)境變量(可在命令行窗口輸入:“java –version”獲知是否安裝成功,以及獲取JDK的版本)。
筆者的Windows操作系統(tǒng)的下載是:
http://code.taobao.org/svn/openclouddb/downloads/old/MyCat-Sever-1.2/
目錄下的“Mycat-server-1.2-GA-win.tar.gz ”文件,解壓后的目錄結構如下圖所示:
安裝完成后,需要添加MYCAT_HOME環(huán)境變量,值對應MyCAT安裝的根目錄。
目錄說明見下表所示:
目錄名稱 |
說明 |
bin |
存放window版本和linux版本,除了提供封裝成服務的版本之外,也提供nowrap的shell腳本命令,方便大家選擇和修改。 Windows 下 運行:mycat.bat console 在控制臺啟動程序,也可以裝載成服務,若此程序運行有問題,也可以運行startup_nowrap.bat,確保java命令可以在命令執(zhí)行。 Warp方式的命令,可以安裝成服務并啟動或停止。 l mycat install (可選) l mycat start 注意,wrap方式的程序,其JVM配置參數(shù)在conf/wrap.conf中,可以修改為合適的參數(shù),參數(shù)調(diào)整參照http://wrapper.tanukisoftware.com/doc/english/properties.html。 |
conf |
存放配置文件: l server.xml:是Mycat服務器參數(shù)調(diào)整和用戶授權的配置文件。 l schema.xml:是邏輯庫定義和表以及分片定義的配置文件。 l rule.xml:是分片規(guī)則的配置文件,分片規(guī)則的具體一些參數(shù)信息單獨存放為文件,也在這個目錄下,配置文件修改,需要重啟MyCAT或者通過9066端口reload。 l wrapper.conf:JVM配置參數(shù)等設置。 l log4j.xml:日志存放在logs/mycat.log中,每天一個文件,日志的配置是在conf/log4j.xml中,根據(jù)自己的需要,可以調(diào)整輸出級別為debug,debug級別下,會輸出更多的信息,方便排查問題。 |
lib |
MyCAT自身的jar包或依賴的jar包的存放目錄。 |
logs |
MyCAT日志的存放目錄。日志存放在logs/mycat.log中,每天一個文件 |
2.2 啟動和停止
啟動前,一般需要修改JVM配置參數(shù),打開conf/wrapper.conf文件,如下行的內(nèi)容為2G和2048,可根據(jù)本機配置情況修改為512M或其它值。













在命令行窗口中進入MyCAT安裝解壓文件下的bin目錄,輸入如下命令可安裝(可選)、啟動和停止MyCAT,參考結果如下所示:














2.3 簡單使用教程
2.3.1 安裝MySQL以及客戶端
安裝MySQL服務器和MySQL客戶端,筆者使用的MySQL服務器是免安裝版本:mysql-noinstall-5.1.73-winx64,MySQL客戶端是:Navicat for MySQL,免安裝版本安裝方法請參考:http://blog.csdn.net/q98842674/article/details/12094777,不再贅述。
2.3.2 創(chuàng)建數(shù)據(jù)庫和表
創(chuàng)建weixin、yixin和sms三個數(shù)據(jù)庫,并分別建立表結構。
2.3.3 垂直切分
2.3.3.1 垂直切分定義
數(shù)據(jù)的垂直切分,也可以稱為縱向切分。將數(shù)據(jù)庫想象成由很多個一大塊一大塊的“數(shù)據(jù)塊”(表)組成,垂直地將這些“數(shù)據(jù)塊”切開,然后把它們分散到多臺數(shù)據(jù)庫主機上面。這樣的切分方法就是垂直(縱向)的數(shù)據(jù)切分。
一個架構設計較好的應用系統(tǒng),其總體功能肯定是由很多個功能模塊所組成的,而每一個功能模塊所需要的數(shù)據(jù)對應到數(shù)據(jù)庫中就是一個或多個表。而在架構設計中,各個功能模塊相互之間的交互點越統(tǒng)一、越少,系統(tǒng)的耦合度就越低,系統(tǒng)各個模塊的維護性及擴展性也就越好。這樣的系統(tǒng),實現(xiàn)數(shù)據(jù)的垂直切分也就越容易。
2.3.3.2 優(yōu)缺點
垂直切分優(yōu)點:
(1)數(shù)據(jù)庫的拆分簡單明了,拆分規(guī)則明確;
(2)應用程序模塊清晰明確,整合容易;
(3)數(shù)據(jù)維護方便易行,容易定位。
垂直切分缺點:
(1)部分表關聯(lián)無法在數(shù)據(jù)庫級別完成,要在程序中完成;
(2)對于訪問極其頻繁且數(shù)據(jù)量超大的表仍然存在性能瓶頸,不一定能滿足要求;
(3)事務處理相對復雜;
(4)切分達到一定程度之后,擴展性會受到限制;
(5)過度切分可能會帶來系統(tǒng)過于復雜而難以維護。
2.3.3.3 垂直切分實現(xiàn)
在如下的實例中,需要將
編輯MYCAT_HOME/conf/schema.xml文件,修改dataHost和schema對應的連接信息,weixin、yixin和photo垂直切分后的配置如下所示:





















注意:writeHost/readHost中的location,user,password的值需要根據(jù)實際的MySQL的連接信息進行修改。
查看conf/server.xml文件,該文件是Mycat服務器參數(shù)調(diào)整和用戶授權的配置文件,默認的MyCat的數(shù)據(jù)庫連接的用戶名/密碼為test/test,文件內(nèi)容參考如下:



















上述文件中的schemas屬性需要配置對應的schema(在schema.xml)中進行配置。
重啟MyCAT,使用MySQL客戶端連接MyCAT,需要注意的是,默認數(shù)據(jù)端口為8066,管理端口為9066,在MySQL客戶端連接MyCAT時,注意填寫端口為8066,用戶名/密碼根據(jù)server.xml中的配置進行填寫。
連接后可查看后端連接的三個數(shù)據(jù)庫,如下圖所示:
2.3.4 水平分庫
2.3.4.1 水平切分定義
水平切分所指的是通過一系列的切分規(guī)則將數(shù)據(jù)水平分布到不同的DB或table中,在通過相應的DB路由 或者table路由規(guī)則找到需要查詢的具體的DB或者table以進行Query操作,比如根據(jù)用戶ID將用戶表切分到多臺數(shù)據(jù)庫上。
將某個訪問極其頻繁的表再按照某個字段的某種規(guī)則來分散到多個表之中,每個表中包含一部分數(shù)據(jù)。
例如,所有數(shù)據(jù)都是和用戶關聯(lián)的,那么我們就可以根據(jù)用戶來進行水平拆分,將不同用戶的數(shù)據(jù)切分到不同的數(shù)據(jù)庫中。
現(xiàn)在互聯(lián)網(wǎng)非常火爆的web 2.0類型的網(wǎng)站,基本上大部分數(shù)據(jù)都能夠通過會員用戶信息關聯(lián)上,可能很多核心表都非常適合通過會員ID來進行數(shù)據(jù)的水平切分。而像論壇社區(qū)討論系統(tǒng),就更容易切分了,非常容易按照論壇編號來進行數(shù)據(jù)的水平切分。切分之后基本上不會出現(xiàn)各個庫之間的交互。
2.3.4.2 優(yōu)缺點
水平切分的優(yōu)點:
l 表關聯(lián)基本能夠在數(shù)據(jù)庫端全部完成;
l 不會存在某些超大型數(shù)據(jù)量和高負載的表遇到瓶頸的問題;
l 應用程序端整體架構改動相對較少;
l 事務處理相對簡單;
l 只要切分規(guī)則能夠定義好,基本上較難遇到擴展性限制。
水平切分的缺點:
l 切分規(guī)則相對更為復雜,很難抽象出一個能夠滿足整個數(shù)據(jù)庫的切分規(guī)則;
l 后期數(shù)據(jù)的維護難度有所增加,人為手工定位數(shù)據(jù)更困難;
應用系統(tǒng)各模塊耦合度較高,可能會對后面數(shù)據(jù)的遷移拆分造成一定的困難。
2.3.4.3 水平切分實現(xiàn)
在一般的應用系統(tǒng)中,用戶表及其密切相關的關聯(lián)表,可根據(jù)“用戶表”(eg:t_user)中的“用戶ID”(user_id)進行水平切分,并基于MyCAT的E-R關系分片策略將其密切相關的表(eg:t_user_class_rel)也分到對應的庫中。
(1)創(chuàng)建表結構
在user0~user2創(chuàng)建同樣的表結構,t_user和t_user_class_rel的建表語句參考如下:
























(2)配置schema.xml文件
首先配置schema.xml文件,添加user0~user3數(shù)據(jù)庫的dataNode設置,并添加t_user和t_user_class_rel表的schema設置,修改后的schema.xml文件內(nèi)容如下所示:





























(3)配置rule.xml文件
在schema.xml的文件內(nèi)容中可看到t_user表指定的分片規(guī)則是rule1,需要在conf/rule.xml文件中設置rule1的規(guī)則為根據(jù)user_id進行分片,并按照類“org.opencloudb.route.function.PartitionByLong”的規(guī)則進行分片,即將user_id模除1024后每256內(nèi)分到一個數(shù)據(jù)庫中,即模除后0~255到user0數(shù)據(jù)庫庫,256~511到user1數(shù)據(jù)庫,512~767到user2數(shù)據(jù)庫,768~1023到user3數(shù)據(jù)庫。
該文件的參考內(nèi)容如下所示:















(4)配置server.xml文件
在server.xml文件中的schemas屬性中添加test_mycat的schema。修改后的文件如下所示:










(5)水平切分測試
重啟MyCAT,使用MySQL客戶端連接后,連接后可在test_mycat數(shù)據(jù)庫下看到t_user和t_user_class_rel表,如下圖所示:
在MySQL客戶端連接的MyCat的test_mycat數(shù)據(jù)庫的t_user表運行如下插入語句,插入2000條數(shù)據(jù):







而后在MyCAT的test_mycat數(shù)據(jù)庫的t_user表運行select查看記錄執(zhí)行情況。進入localhost的user0~user3數(shù)據(jù)庫,查看數(shù)據(jù)是否按照之前確定的rule1的規(guī)則寫入不同的數(shù)據(jù)庫。
讀者可在test_mycat數(shù)據(jù)庫的t_user表執(zhí)行update和delete等語句,并去分庫查看執(zhí)行結果,可得知MyCAT對MySQL客戶端基本透明,對程序也幾乎透明,在select語句運行時,MyCAT會自行去各個分庫按照規(guī)則獲取合并結果。
接著測試按照ER關系策略分片的t_user_class_rel表是否按照user_id的分片策略,同樣user_id的數(shù)據(jù)分布在同一個user庫的t_user表和t_user_class_rel表。
在MyCAT的test_mycat數(shù)據(jù)庫的t_user_class_rel表運行如下語句:





而后在MyCAT的test_mycat數(shù)據(jù)庫的t_user_class_rel表運行select查看記錄執(zhí)行情況。進入localhost的user0~user3數(shù)據(jù)庫,查看數(shù)據(jù)是否按照之前確定的rule1的規(guī)則和ER分片策略寫入不同的數(shù)據(jù)庫。
2.3.5 讀寫分離
2.3.5.1 讀寫分離定義
為了確保數(shù)據(jù)庫產(chǎn)品的穩(wěn)定性,很多數(shù)據(jù)庫擁有雙機熱備功能。也就是,第一臺數(shù)據(jù)庫服務器,是對外提供增刪改查業(yè)務的生產(chǎn)服務器;第二臺數(shù)據(jù)庫服務器,僅僅接收來自第一臺服務器的備份數(shù)據(jù)。一般來說,為了配置方便,以及穩(wěn)定性,這兩臺數(shù)據(jù)庫服務器,都用的是相同的配置。
在實際運行中,第一臺數(shù)據(jù)庫服務器的壓力,遠遠大于第二臺數(shù)據(jù)庫服務器。因此,很多人希望合理利用第二臺數(shù)據(jù)庫服務器的空閑資源。
從數(shù)據(jù)庫的基本業(yè)務來看,數(shù)據(jù)庫的操作無非就是增刪改查這4個操作。但對于“增刪改”這三個操作,如果是雙機熱備的環(huán)境中做,一臺機器做了這三個操作的某一個之后,需要立即將這個操作,同步到另一臺服務器上。出于這個原因,第二臺備用的服務器,就只做了查詢操作。進一步,為了降低第一臺服務器的壓力,干脆就把查詢操作全部丟給第二臺數(shù)據(jù)庫服務器去做,第一臺數(shù)據(jù)庫服務器就只做增刪改了。
2.3.5.2 優(yōu)缺點
優(yōu)點:合理利用從數(shù)據(jù)庫服務器的空閑資源。
缺點:本來第二臺數(shù)據(jù)庫服務器,是用來做熱備的,它就應該在一個壓力非常小的環(huán)境下,保證運行的穩(wěn)定性。而讀寫分離,卻增加了它的壓力,也就增加了不穩(wěn)定性。因此,讀寫分離,實質(zhì)上是一個在資金比較缺乏,但又需要保證數(shù)據(jù)安全的需求下,在雙機熱備方案上,做出的一種折中的擴展方案。
2.3.5.3 讀寫分離實現(xiàn)
MyCAT的讀寫分離機制如下:
- 事務內(nèi)的SQL,全部走寫節(jié)點,除非某個select語句以注釋/*balance*/開頭
- 自動提交的select語句會走讀節(jié)點,并在所有可用讀節(jié)點中間隨機負載均衡
- 當某個主節(jié)點宕機,則其全部讀節(jié)點都不再被使用,因為此時,同步失敗,數(shù)據(jù)已經(jīng)不是最新的,MyCAT會采用另外一個主節(jié)點所對應的全部讀節(jié)點來實現(xiàn)select負載均衡。
- 當所有主節(jié)點都失敗,則為了系統(tǒng)高可用性,自動提交的所有select語句仍將提交到全部存活的讀節(jié)點上執(zhí)行,此時系統(tǒng)的很多頁面還是能出來數(shù)據(jù),只是用戶修改或提交會失敗。
例如將本機作為寫庫,10.18.96.133作為讀庫,MyCAT的讀寫分離的配置如下:








dataHost的balance屬性設置為:
- 0,不開啟讀寫分離機制
- 1,全部的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,并且M1與 M2互為主備),正常情況下,M2,S1,S2都參與select語句的負載均衡。
- 2,所有的readHost與writeHost都參與select語句的負載均衡,也就是說,當系統(tǒng)的寫操作壓力不大的情況下,所有主機都可以承擔負載均衡。
一個dataHost元素,表明進行了數(shù)據(jù)同步的一組數(shù)據(jù)庫,DBA需要保證這一組數(shù)據(jù)庫服務器是進行了數(shù)據(jù)同步復制的。writeHost相當于Master DB Server,而其下的readHost則是與從數(shù)據(jù)庫同步的Slave DB Server。當dataHost配置了多個writeHost的時候,任何一個writeHost宕機,Mycat 都會自動檢測出來,并嘗試切換到下一個可用的writeHost。
在沒有配置數(shù)據(jù)同步復制的情況下,重啟后進行測試,可使用MySQL客戶端直接連接讀庫,插入幾條數(shù)據(jù)后,使用MySQL客戶端連接MyCat,運行select語句驗證是否在讀庫上執(zhí)行。
2.3.6 全局表
2.3.6.1 全局表定義
一個真實的業(yè)務系統(tǒng)中,往往存在大量的類似字典表的表格,它們與業(yè)務表之間可能有關系,這種關系,可以理解為“標簽”,而不應理解為通常的“主從關系”,這些表基本上很少變動,可以根據(jù)主鍵ID進行緩存,下面這張圖說明了一個典型的“標簽關系”圖:
在分片的情況下,當業(yè)務表因為規(guī)模而進行分片以后,業(yè)務表與這些附屬的字典表之間的關聯(lián),就成了比較棘手的問題,考慮到字典表具有以下幾個特性:
- 變動不頻繁;
- 數(shù)據(jù)量總體變化不大;
- 數(shù)據(jù)規(guī)模不大,很少有超過數(shù)十萬條記錄。
鑒于此,MyCAT定義了一種特殊的表,稱之為“全局表”,全局表具有以下特性:
- 全局表的插入、更新操作會實時在所有節(jié)點上執(zhí)行,保持各個分片的數(shù)據(jù)一致性
- 全局表的查詢操作,只從一個節(jié)點獲取
- 全局表可以跟任何一個表進行JOIN操作
將字典表或者符合字典表特性的一些表定義為全局表,則從另外一個方面,很好的解決了數(shù)據(jù)JOIN的難題。通過全局表+基于E-R關系的分片策略,MyCAT可以滿足80%以上的企業(yè)應用開發(fā)。
2.3.6.2 全局表實現(xiàn)
(1)創(chuàng)建表結構
在各個庫分別創(chuàng)建全局表(例如:t_area)的表結構,表結構保持一致,例如:












(2)配置schema.xml
全局表配置比較簡單,不用寫Rule規(guī)則,在schema.xml中修改test_schema,添加t_area的table子元素,參考如下配置即可:







(3)全局表測試
運行如下insert語句,往test_mycat的t_area表插入10條數(shù)據(jù),如下所示:










插入后去user0~user3數(shù)據(jù)庫中查找,可看到這4個庫中的t_area表都被插入10條數(shù)據(jù)。執(zhí)行select語句能返回t_area表的對應記錄,執(zhí)行update和delete語句能對應對全局表相關的4個庫中的記錄進行更新和刪除操作。
3、 參考文檔
(1)《Amoeba使用指南》:http://docs.hexnova.com/amoeba/
(2)《MySQL-5.6.13免安裝版配置方法》:
http://blog.csdn.net/q98842674/article/details/12094777
(3)《MyCat inAction中文版》