posts - 297,  comments - 1618,  trackbacks - 0

          關(guān)系型數(shù)據(jù)的分布式處理系統(tǒng)MyCAT

          ——概述和基本使用教程

          日期:2014/12/24

          文:阿蜜果

          1、   MyCAT概述

          1.1 背景

          隨著傳統(tǒng)的數(shù)據(jù)庫(kù)技術(shù)日趨成熟、計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的飛速發(fā)展和應(yīng)用范圍的擴(kuò)充,數(shù)據(jù)庫(kù)應(yīng)用已經(jīng)普遍建立于計(jì)算機(jī)網(wǎng)絡(luò)之上。這時(shí)集中式數(shù)據(jù)庫(kù)系統(tǒng)表現(xiàn)出它的不足:

          1)集中式處理,勢(shì)必造成性能瓶頸;

          2)應(yīng)用程序集中在一臺(tái)計(jì)算機(jī)上運(yùn)行,一旦該計(jì)算機(jī)發(fā)生故障,則整個(gè)系統(tǒng)受到影響,可靠性不高;

          3)集中式處理引起系統(tǒng)的規(guī)模和配置都不夠靈活,系統(tǒng)的可擴(kuò)充性差。

          在這種形勢(shì)下,集中式數(shù)據(jù)庫(kù)將向分布式數(shù)據(jù)庫(kù)發(fā)展。

          1.2 發(fā)展歷程

          MyCAT的誕生,要從其前身AmoebaCobar說(shuō)起。

          Amoeba(變形蟲)項(xiàng)目,該開(kāi)源框架于2008開(kāi)始發(fā)布一款 Amoeba for Mysql軟件。這個(gè)軟件致力于MySQL的分布式數(shù)據(jù)庫(kù)前端代理層,它主要在應(yīng)用層訪問(wèn)MySQL的時(shí)候充當(dāng)SQL路由功能,專注于分布式數(shù)據(jù)庫(kù)代理層(Database Proxy)開(kāi)發(fā)。座落與 ClientDB Server(s)之間,對(duì)客戶端透明。具有負(fù)載均衡、高可用性、SQL過(guò)濾、讀寫分離、可路由相關(guān)的到目標(biāo)數(shù)據(jù)庫(kù)、可并發(fā)請(qǐng)求多臺(tái)數(shù)據(jù)庫(kù)合并結(jié)果。 通過(guò)Amoeba你能夠完成多數(shù)據(jù)源的高可用、負(fù)載均衡、數(shù)據(jù)切片的功能,目前Amoeba已在很多企業(yè)的生產(chǎn)線上面使用。

          阿里巴巴于2012619,正式對(duì)外開(kāi)源的數(shù)據(jù)庫(kù)中間件Cobar,前身是早已經(jīng)開(kāi)源的Amoeba,不過(guò)其作者陳思儒離職去盛大之后,阿里巴巴內(nèi)部考慮到Amoeba的穩(wěn)定性、性能和功能支持,以及其他因素,重新設(shè)立了一個(gè)項(xiàng)目組并且更換名稱為CobarCobar 是由 Alibaba 開(kāi)源的 MySQL 分布式處理中間件,它可以在分布式的環(huán)境下看上去像傳統(tǒng)數(shù)據(jù)庫(kù)一樣提供海量數(shù)據(jù)服務(wù)。

          Cobar自誕生之日起, 就受到廣大程序員的追捧,但是自2013年后,幾乎沒(méi)有后續(xù)更新。在此情況下,MyCAT應(yīng)運(yùn)而生,它基于阿里開(kāi)源的Cobar產(chǎn)品而研發(fā),Cobar的穩(wěn)定性、可靠性、優(yōu)秀的架構(gòu)和性能,以及眾多成熟的使用案例使得MyCAT一開(kāi)始就擁有一個(gè)很好的起點(diǎn),站在巨人的肩膀上,MyCAT能看到更遠(yuǎn)。目前MyCAT的最新發(fā)布版本為1.2版本。

          1.3介紹

          1.3.1 MyCat的下載方式

          MyCATSVN地址為:http://code.taobao.org/svn/openclouddb/

          目錄結(jié)構(gòu)如下圖所示:
             

                讀者可在doc/1.2子目錄,可查看該產(chǎn)品1.2版本的主要文檔,如下圖所示:
             

          1.3.2 什么是MyCat

          簡(jiǎn)單的說(shuō),MyCAT就是:

          • 一個(gè)新穎的數(shù)據(jù)庫(kù)中間件產(chǎn)品;
          • 一個(gè)徹底開(kāi)源的、面向企業(yè)應(yīng)用開(kāi)發(fā)的“大數(shù)據(jù)庫(kù)集群”;
          • 支持事務(wù)、ACID、可以替代MySQL的加強(qiáng)版數(shù)據(jù)庫(kù);
          • 一個(gè)可以視為“MySQL”集群的企業(yè)級(jí)數(shù)據(jù)庫(kù),用來(lái)替代昂貴的Oracle集群;
          • 一個(gè)融合內(nèi)存緩存技術(shù)、Nosql技術(shù)、HDFS大數(shù)據(jù)的新型SQL Server
          • 結(jié)合傳統(tǒng)數(shù)據(jù)庫(kù)和新型分布式數(shù)據(jù)倉(cāng)庫(kù)的新一代企業(yè)級(jí)數(shù)據(jù)庫(kù)產(chǎn)品。

          1.3.3 MyCat的目標(biāo)

          MyCAT的目標(biāo)是:低成本的將現(xiàn)有的單機(jī)數(shù)據(jù)庫(kù)和應(yīng)用平滑遷移到“云”端,解決數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)規(guī)模迅速增長(zhǎng)情況下的數(shù)據(jù)瓶頸問(wèn)題。

          1.3.4 MyCat的關(guān)鍵特性

          ·         支持 SQL 92標(biāo)準(zhǔn);

          ·         支持MySQL集群,可以作為Proxy使用;

          ·         支持JDBC連接ORACLEDB2SQL Server,將其模擬為MySQL Server使用;

          ·         支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性數(shù)據(jù)分片集群;

          ·         自動(dòng)故障切換,高可用性;

          ·         支持讀寫分離,支持MySQL雙主多從,以及一主多從的模式;

          ·         支持全局表,數(shù)據(jù)自動(dòng)分片到多個(gè)節(jié)點(diǎn),用于高效表關(guān)聯(lián)查詢;

          ·         支持獨(dú)有的基于E-R 關(guān)系的分片策略,實(shí)現(xiàn)了高效的表關(guān)聯(lián)查詢;

          ·         多平臺(tái)支持,部署和實(shí)施簡(jiǎn)單。

          1.3.5 MyCat的優(yōu)勢(shì)

          ·         基于阿里開(kāi)源的Cobar產(chǎn)品而研發(fā),Cobar的穩(wěn)定性、可靠性、優(yōu)秀的架構(gòu)和性能,以及眾多成熟的使用案例使得MyCAT一開(kāi)始就擁有一個(gè)很好的起點(diǎn),站在巨人的肩膀上,能看到更遠(yuǎn)。

          ·         廣泛吸取業(yè)界優(yōu)秀的開(kāi)源項(xiàng)目和創(chuàng)新思路,將其融入到MyCAT的基因中,使得MyCAT在很多方面都領(lǐng)先于目前其他一些同類的開(kāi)源項(xiàng)目,甚至超越某些商業(yè)產(chǎn)品。

          ·         MyCAT背后有一只強(qiáng)大的技術(shù)團(tuán)隊(duì),其參與者都是5年以上資深軟件工程師、架構(gòu)師、DBA等,優(yōu)秀的技術(shù)團(tuán)隊(duì)保證了MyCAT的產(chǎn)品質(zhì)量。

          ·         MyCAT并不依托于任何一個(gè)商業(yè)公司,因此不像某些開(kāi)源項(xiàng)目,將一些重要的特性封閉在其商業(yè)產(chǎn)品中,使得開(kāi)源項(xiàng)目成了一個(gè)擺設(shè)。

          1.4 總體架構(gòu)

          MyCAT的架構(gòu)如下圖所示:

          MyCAT使用MySQL的通訊協(xié)議模擬成一個(gè)MySQL服務(wù)器,并建立了完整的Schema(數(shù)據(jù)庫(kù))、Table (數(shù)據(jù)表)、User(用戶)的邏輯模型,并將這套邏輯模型映射到后端的存儲(chǔ)節(jié)點(diǎn)DataNodeMySQL Instance)上的真實(shí)物理庫(kù)中,這樣一來(lái),所有能使用MySQL的客戶端以及編程語(yǔ)言都能將MyCAT當(dāng)成是MySQLServer來(lái)使用,不必開(kāi)發(fā)新的客戶端協(xié)議。

          當(dāng)MyCAT收到一個(gè)客戶端發(fā)送的SQL請(qǐng)求時(shí),會(huì)先對(duì)SQL進(jìn)行語(yǔ)法分析和檢查,分析的結(jié)果用于SQL路由,SQL路由策略支持傳統(tǒng)的基于表格的分片字段方式進(jìn)行分片,也支持獨(dú)有的基于數(shù)據(jù)庫(kù)E-R關(guān)系的分片策略,對(duì)于路由到多個(gè)數(shù)據(jù)節(jié)點(diǎn)(DataNode)的SQL,則會(huì)對(duì)收到的數(shù)據(jù)集進(jìn)行“歸并”然后輸出到客戶端。

          SQL執(zhí)行的過(guò)程,簡(jiǎn)單的說(shuō),就是把SQL通過(guò)網(wǎng)絡(luò)協(xié)議發(fā)送給后端的真正的數(shù)據(jù)庫(kù)上進(jìn)行執(zhí)行,對(duì)于MySQL Server來(lái)說(shuō),是通過(guò)MySQL網(wǎng)絡(luò)協(xié)議發(fā)送報(bào)文,并解析返回的結(jié)果,若SQL不涉及到多個(gè)分片節(jié)點(diǎn),則直接返回結(jié)果,寫入客戶端的SOCKET流中,這個(gè)過(guò)程是非阻塞模式(NIO)。

          DataNodeMyCAT的邏輯數(shù)據(jù)節(jié)點(diǎn),映射到后端的某一個(gè)物理數(shù)據(jù)庫(kù)的一個(gè)Database,為了做到系統(tǒng)高可用,每個(gè)DataNode可以配置多個(gè)引用地址(DataSource),當(dāng)主DataSource被檢測(cè)為不可用時(shí),系統(tǒng)會(huì)自動(dòng)切換到下一個(gè)可用的DataSource上,這里的DataSource即可認(rèn)為是Mysql的主從服務(wù)器的地址。

          1.5 邏輯庫(kù)

          與任何一個(gè)傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)一樣,MyCAT也提供了“數(shù)據(jù)庫(kù)”的定義,并有用戶授權(quán)的功能,下面是MyCAT邏輯庫(kù)相關(guān)的一些概念:

          • schema:邏輯庫(kù),與MySQL中的Database(數(shù)據(jù)庫(kù))對(duì)應(yīng),一個(gè)邏輯庫(kù)中定義了所包括的Table
          • table:表,即物理數(shù)據(jù)庫(kù)中存儲(chǔ)的某一張表,與傳統(tǒng)數(shù)據(jù)庫(kù)不同,這里的表格需要聲明其所存儲(chǔ)的邏輯數(shù)據(jù)節(jié)點(diǎn)DataNode,這是通過(guò)表格的分片規(guī)則定義來(lái)實(shí)現(xiàn)的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴于與“父表”的具體分片地址,簡(jiǎn)單的說(shuō),就是屬于父表里某一條記錄A的子表的所有記錄都與A存儲(chǔ)在同一個(gè)分片上。
          • 分片規(guī)則:是一個(gè)字段與函數(shù)的捆綁定義,根據(jù)這個(gè)字段的取值來(lái)返回所在存儲(chǔ)的分片(DataNode)的序號(hào),每個(gè)表格可以定義一個(gè)分片規(guī)則,分片規(guī)則可以靈活擴(kuò)展,默認(rèn)提供了基于數(shù)字的分片規(guī)則,字符串的分片規(guī)則等。
          • dataNode: MyCAT的邏輯數(shù)據(jù)節(jié)點(diǎn),是存放table的具體物理節(jié)點(diǎn),也稱之為分片節(jié)點(diǎn),通過(guò)DataSource來(lái)關(guān)聯(lián)到后端某個(gè)具體數(shù)據(jù)庫(kù)上,一般來(lái)說(shuō),為了高可用性,每個(gè)DataNode都設(shè)置兩個(gè)DataSource,一主一從,當(dāng)主節(jié)點(diǎn)宕機(jī),系統(tǒng)自動(dòng)切換到從節(jié)點(diǎn)。
          • dataHost:定義某個(gè)物理庫(kù)的訪問(wèn)地址,用于捆綁到dataNode上。

          MyCAT目前通過(guò)配置文件的方式來(lái)定義邏輯庫(kù)和相關(guān)配置:

          ·         MYCAT_HOME/conf/schema.xml中定義邏輯庫(kù),表、分片節(jié)點(diǎn)等內(nèi)容;

          ·         MYCAT_HOME/conf/rule.xml中定義分片規(guī)則;

          ·         MYCAT_HOME/conf/server.xml中定義用戶以及系統(tǒng)相關(guān)變量,如端口等。

          下圖給出了MyCAT 一個(gè)可能的邏輯庫(kù)到物理庫(kù)(MySQL的完整映射關(guān)系),可以看出其強(qiáng)大的分片能力以及靈活的Mysql集群整合能力。          


          1.6 交流方式

          MyCATQQ群還比較活躍,都已經(jīng)900多人,有興趣的朋友可以加入,群號(hào):106088787

          2、   基本使用教程

          2.1 下載和安裝

                   MyCAT使用Java開(kāi)發(fā),因?yàn)橛玫搅?/span>JDK 7的部分功能,所以在使用前請(qǐng)確保安裝了JDK 7.0,并設(shè)置了正確的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 ”文件,解壓后的目錄結(jié)構(gòu)如下圖所示:
              

                   安裝完成后,需要添加MYCAT_HOME環(huán)境變量,值對(duì)應(yīng)MyCAT安裝的根目錄。

          目錄說(shuō)明見(jiàn)下表所示:

          目錄名稱

          說(shuō)明

          bin

          存放window版本和linux版本,除了提供封裝成服務(wù)的版本之外,也提供nowrapshell腳本命令,方便大家選擇和修改。

          Windows 運(yùn)行:mycat.bat console 在控制臺(tái)啟動(dòng)程序,也可以裝載成服務(wù),若此程序運(yùn)行有問(wèn)題,也可以運(yùn)行startup_nowrap.bat,確保java命令可以在命令執(zhí)行。

          Warp方式的命令,可以安裝成服務(wù)并啟動(dòng)或停止。

          mycat install (可選)

          mycat start

          注意,wrap方式的程序,其JVM配置參數(shù)在conf/wrap.conf中,可以修改為合適的參數(shù),參數(shù)調(diào)整參照http://wrapper.tanukisoftware.com/doc/english/properties.html

          conf

          存放配置文件:

          server.xml:是Mycat服務(wù)器參數(shù)調(diào)整和用戶授權(quán)的配置文件。

          schema.xml:是邏輯庫(kù)定義和表以及分片定義的配置文件。

          rule.xml:是分片規(guī)則的配置文件,分片規(guī)則的具體一些參數(shù)信息單獨(dú)存放為文件,也在這個(gè)目錄下,配置文件修改,需要重啟MyCAT或者通過(guò)9066端口reload

          wrapper.confJVM配置參數(shù)等設(shè)置。

          log4j.xml:日志存放在logs/mycat.log中,每天一個(gè)文件,日志的配置是在conf/log4j.xml中,根據(jù)自己的需要,可以調(diào)整輸出級(jí)別為debugdebug級(jí)別下,會(huì)輸出更多的信息,方便排查問(wèn)題。

          lib

          MyCAT自身的jar包或依賴的jar包的存放目錄。

          logs

          MyCAT日志的存放目錄。日志存放在logs/mycat.log中,每天一個(gè)文件

          2.2 啟動(dòng)和停止

                   啟動(dòng)前,一般需要修改JVM配置參數(shù),打開(kāi)conf/wrapper.conf文件,如下行的內(nèi)容為2G2048,可根據(jù)本機(jī)配置情況修改為512M或其它值。

          wrapper.java.additional.5=-XX:MaxDirectMemorySize=512M
          wrapper.java.additional.
          6=-Dcom.sun.management.jmxremote
          wrapper.java.additional.
          7=-Dcom.sun.management.jmxremote.port=1984
          wrapper.java.additional.
          8=-Dcom.sun.management.jmxremote.authenticate=false
          wrapper.java.additional.
          9=-Dcom.sun.management.jmxremote.ssl=false

          # Initial Java Heap Size (in MB)
          #wrapper.java.initmemory
          =3
          wrapper.java.initmemory
          =512

          # Maximum Java Heap Size (in MB)
          #wrapper.java.maxmemory
          =64
          wrapper.java.maxmemory
          =512

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

          D:\software\Mycat-server-1.2-GA-win\bin>mycat install
          wrapper 
          | Mycat-server installed.

          D:\software\Mycat
          -server-1.2-GA-win\bin>mycat start
          wrapper 
          | Starting the Mycat-server service
          wrapper 
          | Waiting to start
          wrapper 
          | Mycat-server started.

          D:\software\Mycat
          -server-1.2-GA-win\bin>mycat stop
          wrapper 
          | Stopping the Mycat-server service
          wrapper 
          | Mycat-server stopped.



          2.3 簡(jiǎn)單使用教程

          2.3.1 安裝MySQL以及客戶端

                   安裝MySQL服務(wù)器和MySQL客戶端,筆者使用的MySQL服務(wù)器是免安裝版本:mysql-noinstall-5.1.73-winx64MySQL客戶端是:Navicat for MySQL,免安裝版本安裝方法請(qǐng)參考:http://blog.csdn.net/q98842674/article/details/12094777,不再贅述。

          2.3.2 創(chuàng)建數(shù)據(jù)庫(kù)和表

                   創(chuàng)建weixinyixinsms三個(gè)數(shù)據(jù)庫(kù),并分別建立表結(jié)構(gòu)。

          2.3.3 垂直切分

          2.3.3.1 垂直切分定義

          數(shù)據(jù)的垂直切分,也可以稱為縱向切分。將數(shù)據(jù)庫(kù)想象成由很多個(gè)一大塊一大塊的“數(shù)據(jù)塊”(表)組成,垂直地將這些“數(shù)據(jù)塊”切開(kāi),然后把它們分散到多臺(tái)數(shù)據(jù)庫(kù)主機(jī)上面。這樣的切分方法就是垂直(縱向)的數(shù)據(jù)切分。

          一個(gè)架構(gòu)設(shè)計(jì)較好的應(yīng)用系統(tǒng),其總體功能肯定是由很多個(gè)功能模塊所組成的,而每一個(gè)功能模塊所需要的數(shù)據(jù)對(duì)應(yīng)到數(shù)據(jù)庫(kù)中就是一個(gè)或多個(gè)表。而在架構(gòu)設(shè)計(jì)中,各個(gè)功能模塊相互之間的交互點(diǎn)越統(tǒng)一、越少,系統(tǒng)的耦合度就越低,系統(tǒng)各個(gè)模塊的維護(hù)性及擴(kuò)展性也就越好。這樣的系統(tǒng),實(shí)現(xiàn)數(shù)據(jù)的垂直切分也就越容易。

          2.3.3.2 優(yōu)缺點(diǎn)

          垂直切分優(yōu)點(diǎn):

          1)數(shù)據(jù)庫(kù)的拆分簡(jiǎn)單明了,拆分規(guī)則明確;

          2)應(yīng)用程序模塊清晰明確,整合容易;

          3)數(shù)據(jù)維護(hù)方便易行,容易定位。

          垂直切分缺點(diǎn):

          1)部分表關(guān)聯(lián)無(wú)法在數(shù)據(jù)庫(kù)級(jí)別完成,要在程序中完成;

          2)對(duì)于訪問(wèn)極其頻繁且數(shù)據(jù)量超大的表仍然存在性能瓶頸,不一定能滿足要求;

          3)事務(wù)處理相對(duì)復(fù)雜;

          4)切分達(dá)到一定程度之后,擴(kuò)展性會(huì)受到限制;

          5)過(guò)度切分可能會(huì)帶來(lái)系統(tǒng)過(guò)于復(fù)雜而難以維護(hù)。

          2.3.3.3 垂直切分實(shí)現(xiàn)

          在如下的實(shí)例中,需要將

          編輯MYCAT_HOME/conf/schema.xml文件,修改dataHostschema對(duì)應(yīng)的連接信息,weixinyixinphoto垂直切分后的配置如下所示:

          <?xml version="1.0"?>
          <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
          <mycat:schema xmlns:mycat="http://org.opencloudb/">
              
          <schema name="weixin" checkSQLschema="false" sqlMaxLimit="100" dataNode="weixin" />
              
          <schema name="yixin" checkSQLschema="false" sqlMaxLimit="100" dataNode="yixin" />
              
          <schema name="photo" checkSQLschema="false" sqlMaxLimit="100" dataNode="photo" />

              
          <dataNode name="weixin" dataHost="testhost" database="weixin" />
              
          <dataNode name="yixin" dataHost="testhost" database="yixin" />
              
          <dataNode name="photo" dataHost="testhost" database="photo" />

              
          <dataHost name="testhost" maxCon="1000" minCon="10" balance="0"
                 writeType
          ="0" dbType="mysql" dbDriver="native">
                 
          <heartbeat>select user()</heartbeat>
                 
          <!-- can have multi write hosts -->
                 
          <writeHost host="hostM1" url="localhost:3306" user="root" password="" />
                 
          <writeHost host="hostM2" url="10.18.96.133:3306" user="test" password="test" />
              
          </dataHost>
          </mycat:schema>

          注意:writeHost/readHost中的location,user,password的值需要根據(jù)實(shí)際的MySQL的連接信息進(jìn)行修改。

          查看conf/server.xml文件,該文件Mycat服務(wù)器參數(shù)調(diào)整和用戶授權(quán)的配置文件,默認(rèn)的MyCat的數(shù)據(jù)庫(kù)連接的用戶名/密碼為test/test,文件內(nèi)容參考如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
              - you may not use this file except in compliance with the License. - You 
              may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
              - - Unless required by applicable law or agreed to in writing, software - 
              distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
              WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
              License for the specific language governing permissions and - limitations 
              under the License. 
          -->
          <!DOCTYPE mycat:server SYSTEM "server.dtd">
          <mycat:server xmlns:mycat="http://org.opencloudb/">
              
          <system>
                  
          <property name="sequnceHandlerType">0</property> 
              
          </system>
              
          <user name="test">
                 
          <property name="password">test</property>
                 
          <property name="schemas">weixin,yixin,photo</property>
              
          </user>
          </mycat:server>

          上述文件中的schemas屬性需要配置對(duì)應(yīng)的schema(在schema.xml)中進(jìn)行配置。

          重啟MyCAT,使用MySQL客戶端連接MyCAT,需要注意的是,默認(rèn)數(shù)據(jù)端口為8066,管理端口為9066,在MySQL客戶端連接MyCAT時(shí),注意填寫端口為8066,用戶名/密碼根據(jù)server.xml中的配置進(jìn)行填寫。

                   連接后可查看后端連接的三個(gè)數(shù)據(jù)庫(kù),如下圖所示:

          2.3.4 水平分庫(kù)

          2.3.4.1 水平切分定義

          水平切分所指的是通過(guò)一系列的切分規(guī)則將數(shù)據(jù)水平分布到不同的DBtable中,在通過(guò)相應(yīng)的DB路由 或者table路由規(guī)則找到需要查詢的具體的DB或者table以進(jìn)行Query操作,比如根據(jù)用戶ID將用戶表切分到多臺(tái)數(shù)據(jù)庫(kù)上。

          將某個(gè)訪問(wèn)極其頻繁的表再按照某個(gè)字段的某種規(guī)則來(lái)分散到多個(gè)表之中,每個(gè)表中包含一部分?jǐn)?shù)據(jù)。

          例如,所有數(shù)據(jù)都是和用戶關(guān)聯(lián)的,那么我們就可以根據(jù)用戶來(lái)進(jìn)行水平拆分,將不同用戶的數(shù)據(jù)切分到不同的數(shù)據(jù)庫(kù)中。

          現(xiàn)在互聯(lián)網(wǎng)非常火爆的web 2.0類型的網(wǎng)站,基本上大部分?jǐn)?shù)據(jù)都能夠通過(guò)會(huì)員用戶信息關(guān)聯(lián)上,可能很多核心表都非常適合通過(guò)會(huì)員ID來(lái)進(jìn)行數(shù)據(jù)的水平切分。而像論壇社區(qū)討論系統(tǒng),就更容易切分了,非常容易按照論壇編號(hào)來(lái)進(jìn)行數(shù)據(jù)的水平切分。切分之后基本上不會(huì)出現(xiàn)各個(gè)庫(kù)之間的交互。

          2.3.4.2 優(yōu)缺點(diǎn)

          水平切分的優(yōu)點(diǎn):

          表關(guān)聯(lián)基本能夠在數(shù)據(jù)庫(kù)端全部完成;

          不會(huì)存在某些超大型數(shù)據(jù)量和高負(fù)載的表遇到瓶頸的問(wèn)題;

          應(yīng)用程序端整體架構(gòu)改動(dòng)相對(duì)較少;

          事務(wù)處理相對(duì)簡(jiǎn)單;

          只要切分規(guī)則能夠定義好,基本上較難遇到擴(kuò)展性限制。

          水平切分的缺點(diǎn):

          切分規(guī)則相對(duì)更為復(fù)雜,很難抽象出一個(gè)能夠滿足整個(gè)數(shù)據(jù)庫(kù)的切分規(guī)則;

          后期數(shù)據(jù)的維護(hù)難度有所增加,人為手工定位數(shù)據(jù)更困難;

          應(yīng)用系統(tǒng)各模塊耦合度較高,可能會(huì)對(duì)后面數(shù)據(jù)的遷移拆分造成一定的困難。

          2.3.4.3 水平切分實(shí)現(xiàn)

          在一般的應(yīng)用系統(tǒng)中,用戶表及其密切相關(guān)的關(guān)聯(lián)表,可根據(jù)“用戶表”(egt_user)中的“用戶ID”(user_id)進(jìn)行水平切分,并基于MyCATE-R關(guān)系分片策略將其密切相關(guān)的表(egt_user_class_rel)也分到對(duì)應(yīng)的庫(kù)中。

          1)創(chuàng)建表結(jié)構(gòu)

                   user0user2創(chuàng)建同樣的表結(jié)構(gòu),t_usert_user_class_rel的建表語(yǔ)句參考如下:

          DROP TABLE IF EXISTS `t_user_ext`;
          CREATE TABLE `t_user_ext` (
           `
          user_idint(11NOT NULL COMMENT '用戶ID',
           `receive_address` 
          varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '收貨地址',
           `create_time` 
          datetime NOT NULL,
           `province_code` 
          varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
           
          PRIMARY KEY (`user_id`)
          ) ENGINE
          =InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用戶信息表';

          DROP TABLE IF EXISTS `t_user_class_rel`;
          CREATE TABLE `t_user_class_rel` (
           `id` 
          int(11NOT NULL AUTO_INCREMENT COMMENT 'id',
           `caller` 
          varchar(16CHARACTER SET utf8 NOT NULL COMMENT '調(diào)用方系統(tǒng)表示',
           `province_code` 
          varchar(10CHARACTER SET utf8 DEFAULT NULL COMMENT '省份編碼',
           `
          user_idint(11NOT NULL COMMENT '用戶ID',
           `class_id` 
          int(11NOT NULL COMMENT '班級(jí)ID',
           `role_type` 
          int(11DEFAULT NULL COMMENT '用戶在該班的角色(1學(xué)生2家長(zhǎng)3教師)',
           `create_time` 
          datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',
           `modify_time` 
          datetime DEFAULT NULL COMMENT '修改時(shí)間',
           
          PRIMARY KEY (`id`),
           
          UNIQUE KEY `idx_rel_user_class_id` (`user_id`,`class_id`,`role_type`),
           
          KEY `idx_rel_user_id` (`user_id`) USING BTREE,
           
          KEY `idx_rel_class_id` (`class_id`)
          ) ENGINE
          =InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

           

          2)配置schema.xml文件

          首先配置schema.xml文件,添加user0user3數(shù)據(jù)庫(kù)的dataNode設(shè)置,并添加t_usert_user_class_rel表的schema設(shè)置,修改后的schema.xml文件內(nèi)容如下所示:

          <?xml version="1.0"?>
          <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
          <mycat:schema xmlns:mycat="http://org.opencloudb/">
              
          <schema name="test_mycat" checkSQLschema="false" sqlMaxLimit="100">
                 
          <!-- auto sharding by id (long) -->
                 
          <table name="t_user" dataNode="user0,user1,user2,user3" rule="rule1">
                     
          <childTable name="t_user_class_rel" primaryKey="id" joinKey="user_id" parentKey="user_id" />
                 
          </table>
              
          </schema>
              
          <schema name="weixin" checkSQLschema="false" sqlMaxLimit="100" dataNode="weixin" />
              
          <schema name="yixin" checkSQLschema="false" sqlMaxLimit="100" dataNode="yixin" />
              
          <schema name="photo" checkSQLschema="false" sqlMaxLimit="100" dataNode="photo" />

              
          <dataNode name="weixin" dataHost="testhost" database="weixin" />
              
          <dataNode name="yixin" dataHost="testhost" database="yixin" />
              
          <dataNode name="photo" dataHost="testhost" database="photo" />
              
          <dataNode name="user0" dataHost="testhost" database="user0" />
              
          <dataNode name="user1" dataHost="testhost" database="user1" />
              
          <dataNode name="user2" dataHost="testhost" database="user2" />
              
          <dataNode name="user3" dataHost="testhost" database="user3" />

              
          <dataHost name="testhost" maxCon="1000" minCon="10" balance="0"
                 writeType
          ="0" dbType="mysql" dbDriver="native">
                 
          <heartbeat>select user()</heartbeat>
                 
          <!-- can have multi write hosts -->
                 
          <writeHost host="hostM1" url="localhost:3306" user="root" password="" />
                 
          <writeHost host="hostM2" url="10.18.96.133:3306" user="test" password="test" />
              
          </dataHost>
          </mycat:schema>

           

          3)配置rule.xml文件

          schema.xml的文件內(nèi)容中可看到t_user表指定的分片規(guī)則是rule1,需要在conf/rule.xml文件中設(shè)置rule1的規(guī)則為根據(jù)user_id進(jìn)行分片,并按照類“org.opencloudb.route.function.PartitionByLong”的規(guī)則進(jìn)行分片,即將user_id模除1024后每256內(nèi)分到一個(gè)數(shù)據(jù)庫(kù)中,即模除后0255user0數(shù)據(jù)庫(kù)庫(kù),256511user1數(shù)據(jù)庫(kù),512767user2數(shù)據(jù)庫(kù),7681023user3數(shù)據(jù)庫(kù)。

                   該文件的參考內(nèi)容如下所示:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
          <mycat:rule xmlns:mycat="http://org.opencloudb/"> 
           
          <tableRule name="rule1">
              
          <rule>
                
          <columns>user_id</columns>
                
          <algorithm>func1</algorithm>
              
          </rule>
           
          </tableRule>

           
          <function name="func1" class="org.opencloudb.route.function.PartitionByLong">
              
          <property name="partitionCount">4</property>
              
          <property name="partitionLength">256</property>
           
          </function>
          </mycat:rule>

           

          4)配置server.xml文件

                   server.xml文件中的schemas屬性中添加test_mycatschema。修改后的文件如下所示:

          <!DOCTYPE mycat:server SYSTEM "server.dtd">
          <mycat:server xmlns:mycat="http://org.opencloudb/">
              
          <system>
                  
          <property name="sequnceHandlerType">0</property> 
              
          </system>
              
          <user name="test">
                 
          <property name="password">test</property>
                 
          <property name="schemas">weixin,yixin,photo,test_mycat</property>
              
          </user>
          </mycat:server>



          5)水平切分測(cè)試

                   重啟MyCAT,使用MySQL客戶端連接后,連接后可在test_mycat數(shù)據(jù)庫(kù)下看到t_usert_user_class_rel表,如下圖所示:

                   MySQL客戶端連接的MyCattest_mycat數(shù)據(jù)庫(kù)的t_user表運(yùn)行如下插入語(yǔ)句,插入2000條數(shù)據(jù):

          INSERT INTO `t_user` VALUES ('1', '廣州市越秀區(qū)廣州大道中599號(hào)', '2014-07-17 10:53:15', 'GD');
          INSERT INTO `t_user` VALUES ('2', '廣州市越秀區(qū)廣州大道中599號(hào)', '2014-07-17 10:53:17', 'GD');
          INSERT INTO `t_user` VALUES ('3', '廣州市越秀區(qū)廣州大道中599號(hào)', '2014-07-17 10:53:17', 'GD');
          INSERT INTO `t_user` VALUES ('4', '廣州市越秀區(qū)廣州大道中599號(hào)', '2014-07-17 10:53:17', 'GD');
          INSERT INTO `t_user` VALUES ('5', '廣州市越秀區(qū)廣州大道中599號(hào)', '2014-07-17 10:53:17', 'GD');
          ……
          INSERT INTO `t_user` VALUES (2000, '廣州市越秀區(qū)廣州大道中599號(hào)', '2014-07-17 10:54:37', 'GD');

                 而后在MyCATtest_mycat數(shù)據(jù)庫(kù)的t_user表運(yùn)行select查看記錄執(zhí)行情況。進(jìn)入localhostuser0user3數(shù)據(jù)庫(kù),查看數(shù)據(jù)是否按照之前確定的rule1的規(guī)則寫入不同的數(shù)據(jù)庫(kù)。

                   讀者可在test_mycat數(shù)據(jù)庫(kù)的t_user表執(zhí)行updatedelete等語(yǔ)句,并去分庫(kù)查看執(zhí)行結(jié)果,可得知MyCAT對(duì)MySQL客戶端基本透明,對(duì)程序也幾乎透明,在select語(yǔ)句運(yùn)行時(shí),MyCAT會(huì)自行去各個(gè)分庫(kù)按照規(guī)則獲取合并結(jié)果。

                   接著測(cè)試按照ER關(guān)系策略分片的t_user_class_rel表是否按照user_id的分片策略,同樣user_id的數(shù)據(jù)分布在同一個(gè)user庫(kù)的t_user表和t_user_class_rel表。

            在MyCATtest_mycat數(shù)據(jù)庫(kù)的t_user_class_rel表運(yùn)行如下語(yǔ)句:

          INSERT INTO `t_user_class_rel` VALUES ('257', 'eip', 'GD', '2', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
          INSERT INTO `t_user_class_rel` VALUES ('512', 'eip', 'GD', '1', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
          INSERT INTO `t_user_class_rel` VALUES ('1', 'eip', 'GD', '257', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
          INSERT INTO `t_user_class_rel` VALUES ('2', 'eip', 'GD', '513', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');
          INSERT INTO `t_user_class_rel` VALUES ('3', 'eip', 'GD', '769', '35', '3', '2012-08-05 17:32:13', '2013-12-27 16:07:32');

          而后在MyCATtest_mycat數(shù)據(jù)庫(kù)的t_user_class_rel表運(yùn)行select查看記錄執(zhí)行情況。進(jìn)入localhostuser0user3數(shù)據(jù)庫(kù),查看數(shù)據(jù)是否按照之前確定的rule1的規(guī)則和ER分片策略寫入不同的數(shù)據(jù)庫(kù)。

          2.3.5 讀寫分離

          2.3.5.1 讀寫分離定義

          為了確保數(shù)據(jù)庫(kù)產(chǎn)品的穩(wěn)定性,很多數(shù)據(jù)庫(kù)擁有雙機(jī)熱備功能。也就是,第一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,是對(duì)外提供增刪改查業(yè)務(wù)的生產(chǎn)服務(wù)器;第二臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,僅僅接收來(lái)自第一臺(tái)服務(wù)器的備份數(shù)據(jù)。一般來(lái)說(shuō),為了配置方便,以及穩(wěn)定性,這兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,都用的是相同的配置。

          在實(shí)際運(yùn)行中,第一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的壓力,遠(yuǎn)遠(yuǎn)大于第二臺(tái)數(shù)據(jù)庫(kù)服務(wù)器。因此,很多人希望合理利用第二臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的空閑資源。

          從數(shù)據(jù)庫(kù)的基本業(yè)務(wù)來(lái)看,數(shù)據(jù)庫(kù)的操作無(wú)非就是增刪改查這4個(gè)操作。但對(duì)于增刪改這三個(gè)操作,如果是雙機(jī)熱備的環(huán)境中做,一臺(tái)機(jī)器做了這三個(gè)操作的某一個(gè)之后,需要立即將這個(gè)操作,同步到另一臺(tái)服務(wù)器上。出于這個(gè)原因,第二臺(tái)備用的服務(wù)器,就只做了查詢操作。進(jìn)一步,為了降低第一臺(tái)服務(wù)器的壓力,干脆就把查詢操作全部丟給第二臺(tái)數(shù)據(jù)庫(kù)服務(wù)器去做,第一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器就只做增刪改了。

          2.3.5.2 優(yōu)缺點(diǎn)

          優(yōu)點(diǎn):合理利用從數(shù)據(jù)庫(kù)服務(wù)器的空閑資源。

          缺點(diǎn):本來(lái)第二臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,是用來(lái)做熱備的,它就應(yīng)該在一個(gè)壓力非常小的環(huán)境下,保證運(yùn)行的穩(wěn)定性。而讀寫分離,卻增加了它的壓力,也就增加了不穩(wěn)定性。因此,讀寫分離,實(shí)質(zhì)上是一個(gè)在資金比較缺乏,但又需要保證數(shù)據(jù)安全的需求下,在雙機(jī)熱備方案上,做出的一種折中的擴(kuò)展方案。

          2.3.5.3 讀寫分離實(shí)現(xiàn)

          MyCAT的讀寫分離機(jī)制如下:

          • 事務(wù)內(nèi)的SQL,全部走寫節(jié)點(diǎn),除非某個(gè)select語(yǔ)句以注釋/*balance*/開(kāi)頭
          • 自動(dòng)提交select語(yǔ)句會(huì)走讀節(jié)點(diǎn),并在所有可用讀節(jié)點(diǎn)中間隨機(jī)負(fù)載均衡
          • 當(dāng)某個(gè)主節(jié)點(diǎn)宕機(jī),則其全部讀節(jié)點(diǎn)都不再被使用,因?yàn)榇藭r(shí),同步失敗,數(shù)據(jù)已經(jīng)不是最新的,MyCAT會(huì)采用另外一個(gè)主節(jié)點(diǎn)所對(duì)應(yīng)的全部讀節(jié)點(diǎn)來(lái)實(shí)現(xiàn)select負(fù)載均衡。
          • 當(dāng)所有主節(jié)點(diǎn)都失敗,則為了系統(tǒng)高可用性,自動(dòng)提交的所有select語(yǔ)句仍將提交到全部存活的讀節(jié)點(diǎn)上執(zhí)行,此時(shí)系統(tǒng)的很多頁(yè)面還是能出來(lái)數(shù)據(jù),只是用戶修改或提交會(huì)失敗。

          例如將本機(jī)作為寫庫(kù),10.18.96.133作為讀庫(kù),MyCAT的讀寫分離的配置如下:

          <dataHost name="testhost" maxCon="1000" minCon="10" balance="1"
                 writeType
          ="0" dbType="mysql" dbDriver="native">
                 
          <heartbeat>select user()</heartbeat>
                 
          <!-- can have multi write hosts -->
                 
          <writeHost host="hostM1" url="localhost:3306" user="root" password="">
                     
          <readHost host="hostM2" url="10.18.96.133:3306" user="test" password="test" />
                 
          </writeHost>
          </dataHost>

          dataHostbalance屬性設(shè)置為:

          • 0,不開(kāi)啟讀寫分離機(jī)制
          • 1,全部的readHoststand by writeHost參與select語(yǔ)句的負(fù)載均衡,簡(jiǎn)單的說(shuō),當(dāng)雙主雙從模式(M1->S1M2->S2,并且M1 M2互為主備),正常情況下,M2,S1,S2都參與select語(yǔ)句的負(fù)載均衡。
          • 2,所有的readHostwriteHost都參與select語(yǔ)句的負(fù)載均衡,也就是說(shuō),當(dāng)系統(tǒng)的寫操作壓力不大的情況下,所有主機(jī)都可以承擔(dān)負(fù)載均衡。

          一個(gè)dataHost元素,表明進(jìn)行了數(shù)據(jù)同步的一組數(shù)據(jù)庫(kù),DBA需要保證這一組數(shù)據(jù)庫(kù)服務(wù)器是進(jìn)行了數(shù)據(jù)同步復(fù)制的writeHost相當(dāng)于Master DB Server,而其下的readHost則是與從數(shù)據(jù)庫(kù)同步的Slave DB Server。當(dāng)dataHost配置了多個(gè)writeHost的時(shí)候,任何一個(gè)writeHost宕機(jī),Mycat 都會(huì)自動(dòng)檢測(cè)出來(lái),并嘗試切換到下一個(gè)可用的writeHost

          在沒(méi)有配置數(shù)據(jù)同步復(fù)制的情況下,重啟后進(jìn)行測(cè)試,可使用MySQL客戶端直接連接讀庫(kù),插入幾條數(shù)據(jù)后,使用MySQL客戶端連接MyCat,運(yùn)行select語(yǔ)句驗(yàn)證是否在讀庫(kù)上執(zhí)行。

          2.3.6 全局表

          2.3.6.1 全局表定義

          一個(gè)真實(shí)的業(yè)務(wù)系統(tǒng)中,往往存在大量的類似字典表的表格,它們與業(yè)務(wù)表之間可能有關(guān)系,這種關(guān)系,可以理解為“標(biāo)簽”,而不應(yīng)理解為通常的“主從關(guān)系”,這些表基本上很少變動(dòng),可以根據(jù)主鍵ID進(jìn)行緩存,下面這張圖說(shuō)明了一個(gè)典型的“標(biāo)簽關(guān)系”圖:

                   在分片的情況下,當(dāng)業(yè)務(wù)表因?yàn)橐?guī)模而進(jìn)行分片以后,業(yè)務(wù)表與這些附屬的字典表之間的關(guān)聯(lián),就成了比較棘手的問(wèn)題,考慮到字典表具有以下幾個(gè)特性:

          • 變動(dòng)不頻繁;
          • 數(shù)據(jù)量總體變化不大;
          • 數(shù)據(jù)規(guī)模不大,很少有超過(guò)數(shù)十萬(wàn)條記錄。

          鑒于此,MyCAT定義了一種特殊的表,稱之為“全局表”,全局表具有以下特性:

          • 全局表的插入、更新操作會(huì)實(shí)時(shí)在所有節(jié)點(diǎn)上執(zhí)行,保持各個(gè)分片的數(shù)據(jù)一致性
          • 全局表的查詢操作,只從一個(gè)節(jié)點(diǎn)獲取
          • 全局表可以跟任何一個(gè)表進(jìn)行JOIN操作

          將字典表或者符合字典表特性的一些表定義為全局表,則從另外一個(gè)方面,很好的解決了數(shù)據(jù)JOIN的難題。通過(guò)全局表+基于E-R關(guān)系的分片策略,MyCAT可以滿足80%以上的企業(yè)應(yīng)用開(kāi)發(fā)。

          2.3.6.2 全局表實(shí)現(xiàn)

          1)創(chuàng)建表結(jié)構(gòu)

                   在各個(gè)庫(kù)分別創(chuàng)建全局表(例如:t_area)的表結(jié)構(gòu),表結(jié)構(gòu)保持一致,例如:

          DROP TABLE IF EXISTS `t_area`;
          CREATE TABLE `t_area` (
           `id` 
          int(11NOT NULL AUTO_INCREMENT COMMENT 'id',
           `caller` 
          varchar(16CHARACTER SET utf8 DEFAULT NULL COMMENT '調(diào)用方系統(tǒng)表示',
           `province_code` 
          varchar(10CHARACTER SET utf8 NOT NULL COMMENT '省份編碼',
           `area_code` 
          varchar(10CHARACTER SET utf8 NOT NULL COMMENT '區(qū)域編碼',
           `area_name` 
          varchar(100CHARACTER SET utf8 DEFAULT NULL COMMENT '區(qū)域名稱',
           `parent_area_code` 
          varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '父區(qū)域編碼',
           `create_time` 
          datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',
           `modify_time` 
          datetime DEFAULT NULL COMMENT '修改時(shí)間',
           
          PRIMARY KEY (`id`)
          ) ENGINE
          =InnoDB AUTO_INCREMENT=3792 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

           

          2)配置schema.xml

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

          <schema name="test_mycat" checkSQLschema="false" sqlMaxLimit="100">
                 
          <!-- auto sharding by id (long) -->
                 
          <table name="t_user" dataNode="user0,user1,user2,user3" rule="rule1">
                     
          <childTable name="t_user_class_rel" primaryKey="id" joinKey="user_id" parentKey="user_id" />
                 
          </table>
                 
          <table name="t_area" primaryKey="id" type="global" dataNode="weixin,yixin,photo,user0,user1,user2,user3" />
          </schema>



          3)全局表測(cè)試

                   運(yùn)行如下insert語(yǔ)句,往test_mycatt_area表插入10條數(shù)據(jù),如下所示:

          INSERT INTO `t_area` VALUES ('100''test''ZX''1''全國(guó)''0''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('101''test''BJ''110000''北京市''1''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('102''test''BJ''110100''市轄區(qū)''110000''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('103''test''BJ''110101''東城區(qū)''110100''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('104''test''BJ''110102''西城區(qū)''110100''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('105''test''BJ''110103''崇文區(qū)''110100''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('106''test''BJ''110104''宣武區(qū)''110100''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('107''test''BJ''110105''朝陽(yáng)區(qū)''110100''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('108''test''BJ''110106''豐臺(tái)區(qū)''110100''2012-09-25 08:30:23'null);
          INSERT INTO `t_area` VALUES ('109''test''BJ''110107''石景山區(qū)''110100''2012-09-25 08:30:23'null);

                插入后去user0~user3數(shù)據(jù)庫(kù)中查找,可看到這4個(gè)庫(kù)中的t_area表都被插入10條數(shù)據(jù)。執(zhí)行select語(yǔ)句能返回t_area表的對(duì)應(yīng)記錄,執(zhí)行updatedelete語(yǔ)句能對(duì)應(yīng)對(duì)全局表相關(guān)的4個(gè)庫(kù)中的記錄進(jìn)行更新和刪除操作。

          3、   參考文檔

          1)《Amoeba使用指南》:http://docs.hexnova.com/amoeba/

          2)《MySQL-5.6.13免安裝版配置方法》:

          http://blog.csdn.net/q98842674/article/details/12094777

          3)《MyCat inAction中文版》

          posted on 2014-12-24 16:12 阿蜜果 閱讀(47777) 評(píng)論(3)  編輯  收藏 所屬分類: Javadatabase


          FeedBack:
          # re: 關(guān)系型數(shù)據(jù)的分布式處理系統(tǒng)MyCAT(1)—概述和基本使用教程[未登錄](méi)
          2015-07-30 17:13 | 王磊
          太感謝了.  回復(fù)  更多評(píng)論
            
          # re: 關(guān)系型數(shù)據(jù)的分布式處理系統(tǒng)MyCAT(1)—概述和基本使用教程
          2016-01-06 02:50 | hq
          Mycat權(quán)威指南第一版_V1.5.1(可直接試讀):http://pan.baidu.com/s/1i3SFOpf
            回復(fù)  更多評(píng)論
            
          # re: 關(guān)系型數(shù)據(jù)的分布式處理系統(tǒng)MyCAT(1)—概述和基本使用教程
          2016-02-19 03:08 | hq
          對(duì)數(shù)據(jù)庫(kù)中間件感興趣,可了解下開(kāi)源的Mycat,java高手也有參考價(jià)值,因Mycat是java編寫的:
          Mycat權(quán)威指南_V1.5.3(總)免費(fèi)下載,可預(yù)覽
          http://pan.baidu.com/s/1gejkq59  回復(fù)  更多評(píng)論
            
          <2014年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來(lái)如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊(cè)

          關(guān)注blog

          積分與排名

          • 積分 - 2296320
          • 排名 - 3

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 合山市| 新营市| 松原市| 临邑县| 长春市| 阿合奇县| 青田县| 桂平市| 米脂县| 北宁市| 亳州市| 拜城县| 准格尔旗| 吕梁市| 塘沽区| 玛纳斯县| 区。| 太白县| 姚安县| 天峨县| 瑞昌市| 花莲县| 子长县| 云霄县| 赤峰市| 嵩明县| 晋中市| 岳阳市| 夏津县| 易门县| 宝应县| 犍为县| 富阳市| 河池市| 石泉县| 乌鲁木齐市| 克什克腾旗| 竹溪县| 德保县| 榆中县| 贵德县|