<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0

    關系型數據的分布式處理系統MyCAT

    ——概述和基本使用教程

    日期:2014/12/24

    文:阿蜜果

    1、   MyCAT概述

    1.1 背景

    隨著傳統的數據庫技術日趨成熟、計算機網絡技術的飛速發展和應用范圍的擴充,數據庫應用已經普遍建立于計算機網絡之上。這時集中式數據庫系統表現出它的不足:

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

    2)應用程序集中在一臺計算機上運行,一旦該計算機發生故障,則整個系統受到影響,可靠性不高;

    3)集中式處理引起系統的規模和配置都不夠靈活,系統的可擴充性差。

    在這種形勢下,集中式數據庫將向分布式數據庫發展。

    1.2 發展歷程

    MyCAT的誕生,要從其前身AmoebaCobar說起。

    Amoeba(變形蟲)項目,該開源框架于2008開始發布一款 Amoeba for Mysql軟件。這個軟件致力于MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的時候充當SQL路由功能,專注于分布式數據庫代理層(Database Proxy)開發。座落與 ClientDB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關的到目標數據庫、可并發請求多臺數據庫合并結果。 通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在很多企業的生產線上面使用。

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

    Cobar自誕生之日起, 就受到廣大程序員的追捧,但是自2013年后,幾乎沒有后續更新。在此情況下,MyCAT應運而生,它基于阿里開源的Cobar產品而研發,Cobar的穩定性、可靠性、優秀的架構和性能,以及眾多成熟的使用案例使得MyCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,MyCAT能看到更遠。目前MyCAT的最新發布版本為1.2版本。

    1.3介紹

    1.3.1 MyCat的下載方式

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

    目錄結構如下圖所示:
       

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

    1.3.2 什么是MyCat

    簡單的說,MyCAT就是:

    • 一個新穎的數據庫中間件產品;
    • 一個徹底開源的、面向企業應用開發的“大數據庫集群”;
    • 支持事務、ACID、可以替代MySQL的加強版數據庫;
    • 一個可以視為“MySQL”集群的企業級數據庫,用來替代昂貴的Oracle集群;
    • 一個融合內存緩存技術、Nosql技術、HDFS大數據的新型SQL Server
    • 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品。

    1.3.3 MyCat的目標

    MyCAT的目標是:低成本的將現有的單機數據庫和應用平滑遷移到“云”端,解決數據存儲和業務規模迅速增長情況下的數據瓶頸問題。

    1.3.4 MyCat的關鍵特性

    ·         支持 SQL 92標準;

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

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

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

    ·         自動故障切換,高可用性;

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

    ·         支持全局表,數據自動分片到多個節點,用于高效表關聯查詢;

    ·         支持獨有的基于E-R 關系的分片策略,實現了高效的表關聯查詢;

    ·         多平臺支持,部署和實施簡單。

    1.3.5 MyCat的優勢

    ·         基于阿里開源的Cobar產品而研發,Cobar的穩定性、可靠性、優秀的架構和性能,以及眾多成熟的使用案例使得MyCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,能看到更遠。

    ·         廣泛吸取業界優秀的開源項目和創新思路,將其融入到MyCAT的基因中,使得MyCAT在很多方面都領先于目前其他一些同類的開源項目,甚至超越某些商業產品。

    ·         MyCAT背后有一只強大的技術團隊,其參與者都是5年以上資深軟件工程師、架構師、DBA等,優秀的技術團隊保證了MyCAT的產品質量。

    ·         MyCAT并不依托于任何一個商業公司,因此不像某些開源項目,將一些重要的特性封閉在其商業產品中,使得開源項目成了一個擺設。

    1.4 總體架構

    MyCAT的架構如下圖所示:

    MyCAT使用MySQL的通訊協議模擬成一個MySQL服務器,并建立了完整的Schema(數據庫)、Table (數據表)、User(用戶)的邏輯模型,并將這套邏輯模型映射到后端的存儲節點DataNodeMySQL Instance)上的真實物理庫中,這樣一來,所有能使用MySQL的客戶端以及編程語言都能將MyCAT當成是MySQLServer來使用,不必開發新的客戶端協議。

    MyCAT收到一個客戶端發送的SQL請求時,會先對SQL進行語法分析和檢查,分析的結果用于SQL路由,SQL路由策略支持傳統的基于表格的分片字段方式進行分片,也支持獨有的基于數據庫E-R關系的分片策略,對于路由到多個數據節點(DataNode)的SQL,則會對收到的數據集進行“歸并”然后輸出到客戶端。

    SQL執行的過程,簡單的說,就是把SQL通過網絡協議發送給后端的真正的數據庫上進行執行,對于MySQL Server來說,是通過MySQL網絡協議發送報文,并解析返回的結果,若SQL不涉及到多個分片節點,則直接返回結果,寫入客戶端的SOCKET流中,這個過程是非阻塞模式(NIO)。

    DataNodeMyCAT的邏輯數據節點,映射到后端的某一個物理數據庫的一個Database,為了做到系統高可用,每個DataNode可以配置多個引用地址(DataSource),當主DataSource被檢測為不可用時,系統會自動切換到下一個可用的DataSource上,這里的DataSource即可認為是Mysql的主從服務器的地址。

    1.5 邏輯庫

    與任何一個傳統的關系型數據庫一樣,MyCAT也提供了“數據庫”的定義,并有用戶授權的功能,下面是MyCAT邏輯庫相關的一些概念:

    • schema:邏輯庫,與MySQL中的Database(數據庫)對應,一個邏輯庫中定義了所包括的Table
    • table:表,即物理數據庫中存儲的某一張表,與傳統數據庫不同,這里的表格需要聲明其所存儲的邏輯數據節點DataNode,這是通過表格的分片規則定義來實現的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴于與“父表”的具體分片地址,簡單的說,就是屬于父表里某一條記錄A的子表的所有記錄都與A存儲在同一個分片上。
    • 分片規則:是一個字段與函數的捆綁定義,根據這個字段的取值來返回所在存儲的分片(DataNode)的序號,每個表格可以定義一個分片規則,分片規則可以靈活擴展,默認提供了基于數字的分片規則,字符串的分片規則等。
    • dataNode: MyCAT的邏輯數據節點,是存放table的具體物理節點,也稱之為分片節點,通過DataSource來關聯到后端某個具體數據庫上,一般來說,為了高可用性,每個DataNode都設置兩個DataSource,一主一從,當主節點宕機,系統自動切換到從節點。
    • dataHost:定義某個物理庫的訪問地址,用于捆綁到dataNode上。

    MyCAT目前通過配置文件的方式來定義邏輯庫和相關配置:

    ·         MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節點等內容;

    ·         MYCAT_HOME/conf/rule.xml中定義分片規則;

    ·         MYCAT_HOME/conf/server.xml中定義用戶以及系統相關變量,如端口等。

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


    1.6 交流方式

    MyCATQQ群還比較活躍,都已經900多人,有興趣的朋友可以加入,群號:106088787

    2、   基本使用教程

    2.1 下載和安裝

             MyCAT使用Java開發,因為用到了JDK 7的部分功能,所以在使用前請確保安裝了JDK 7.0,并設置了正確的Java環境變量(可在命令行窗口輸入:“java –version”獲知是否安裝成功,以及獲取JDK的版本)。

      筆者的Windows操作系統的下載是:

       http://code.taobao.org/svn/openclouddb/downloads/old/MyCat-Sever-1.2/

      目錄下的“Mycat-server-1.2-GA-win.tar.gz ”文件,解壓后的目錄結構如下圖所示:
        

             安裝完成后,需要添加MYCAT_HOME環境變量,值對應MyCAT安裝的根目錄。

    目錄說明見下表所示:

    目錄名稱

    說明

    bin

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

    Windows 運行:mycat.bat console 在控制臺啟動程序,也可以裝載成服務,若此程序運行有問題,也可以運行startup_nowrap.bat,確保java命令可以在命令執行。

    Warp方式的命令,可以安裝成服務并啟動或停止。

    mycat install (可選)

    mycat start

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

    conf

    存放配置文件:

    server.xml:是Mycat服務器參數調整和用戶授權的配置文件。

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

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

    wrapper.confJVM配置參數等設置。

    log4j.xml:日志存放在logs/mycat.log中,每天一個文件,日志的配置是在conf/log4j.xml中,根據自己的需要,可以調整輸出級別為debugdebug級別下,會輸出更多的信息,方便排查問題。

    lib

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

    logs

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

    2.2 啟動和停止

             啟動前,一般需要修改JVM配置參數,打開conf/wrapper.conf文件,如下行的內容為2G2048,可根據本機配置情況修改為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

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

    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 簡單使用教程

    2.3.1 安裝MySQL以及客戶端

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

    2.3.2 創建數據庫和表

             創建weixinyixinsms三個數據庫,并分別建立表結構。

    2.3.3 垂直切分

    2.3.3.1 垂直切分定義

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

    一個架構設計較好的應用系統,其總體功能肯定是由很多個功能模塊所組成的,而每一個功能模塊所需要的數據對應到數據庫中就是一個或多個表。而在架構設計中,各個功能模塊相互之間的交互點越統一、越少,系統的耦合度就越低,系統各個模塊的維護性及擴展性也就越好。這樣的系統,實現數據的垂直切分也就越容易。

    2.3.3.2 優缺點

    垂直切分優點:

    1)數據庫的拆分簡單明了,拆分規則明確;

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

    3)數據維護方便易行,容易定位。

    垂直切分缺點:

    1)部分表關聯無法在數據庫級別完成,要在程序中完成;

    2)對于訪問極其頻繁且數據量超大的表仍然存在性能瓶頸,不一定能滿足要求;

    3)事務處理相對復雜;

    4)切分達到一定程度之后,擴展性會受到限制;

    5)過度切分可能會帶來系統過于復雜而難以維護。

    2.3.3.3 垂直切分實現

    在如下的實例中,需要將

    編輯MYCAT_HOME/conf/schema.xml文件,修改dataHostschema對應的連接信息,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的值需要根據實際的MySQL的連接信息進行修改。

    查看conf/server.xml文件,該文件Mycat服務器參數調整和用戶授權的配置文件,默認的MyCat的數據庫連接的用戶名/密碼為test/test,文件內容參考如下:

    <?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屬性需要配置對應的schema(在schema.xml)中進行配置。

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

             連接后可查看后端連接的三個數據庫,如下圖所示:

    2.3.4 水平分庫

    2.3.4.1 水平切分定義

    水平切分所指的是通過一系列的切分規則將數據水平分布到不同的DBtable中,在通過相應的DB路由 或者table路由規則找到需要查詢的具體的DB或者table以進行Query操作,比如根據用戶ID將用戶表切分到多臺數據庫上。

    將某個訪問極其頻繁的表再按照某個字段的某種規則來分散到多個表之中,每個表中包含一部分數據。

    例如,所有數據都是和用戶關聯的,那么我們就可以根據用戶來進行水平拆分,將不同用戶的數據切分到不同的數據庫中。

    現在互聯網非常火爆的web 2.0類型的網站,基本上大部分數據都能夠通過會員用戶信息關聯上,可能很多核心表都非常適合通過會員ID來進行數據的水平切分。而像論壇社區討論系統,就更容易切分了,非常容易按照論壇編號來進行數據的水平切分。切分之后基本上不會出現各個庫之間的交互。

    2.3.4.2 優缺點

    水平切分的優點:

    表關聯基本能夠在數據庫端全部完成;

    不會存在某些超大型數據量和高負載的表遇到瓶頸的問題;

    應用程序端整體架構改動相對較少;

    事務處理相對簡單;

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

    水平切分的缺點:

    切分規則相對更為復雜,很難抽象出一個能夠滿足整個數據庫的切分規則;

    后期數據的維護難度有所增加,人為手工定位數據更困難;

    應用系統各模塊耦合度較高,可能會對后面數據的遷移拆分造成一定的困難。

    2.3.4.3 水平切分實現

    在一般的應用系統中,用戶表及其密切相關的關聯表,可根據“用戶表”(egt_user)中的“用戶ID”(user_id)進行水平切分,并基于MyCATE-R關系分片策略將其密切相關的表(egt_user_class_rel)也分到對應的庫中。

    1)創建表結構

             user0user2創建同樣的表結構,t_usert_user_class_rel的建表語句參考如下:

    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 '調用方系統表示',
     `province_code` 
    varchar(10CHARACTER SET utf8 DEFAULT NULL COMMENT '省份編碼',
     `
    user_idint(11NOT NULL COMMENT '用戶ID',
     `class_id` 
    int(11NOT NULL COMMENT '班級ID',
     `role_type` 
    int(11DEFAULT NULL COMMENT '用戶在該班的角色(1學生2家長3教師)',
     `create_time` 
    datetime NOT NULL COMMENT '創建時間',
     `modify_time` 
    datetime DEFAULT NULL COMMENT '修改時間',
     
    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數據庫的dataNode設置,并添加t_usert_user_class_rel表的schema設置,修改后的schema.xml文件內容如下所示:

    <?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的文件內容中可看到t_user表指定的分片規則是rule1,需要在conf/rule.xml文件中設置rule1的規則為根據user_id進行分片,并按照類“org.opencloudb.route.function.PartitionByLong”的規則進行分片,即將user_id模除1024后每256內分到一個數據庫中,即模除后0255user0數據庫庫,256511user1數據庫,512767user2數據庫,7681023user3數據庫。

             該文件的參考內容如下所示:

    <?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)水平切分測試

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

             MySQL客戶端連接的MyCattest_mycat數據庫的t_user表運行如下插入語句,插入2000條數據:

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

           而后在MyCATtest_mycat數據庫的t_user表運行select查看記錄執行情況。進入localhostuser0user3數據庫,查看數據是否按照之前確定的rule1的規則寫入不同的數據庫。

             讀者可在test_mycat數據庫的t_user表執行updatedelete等語句,并去分庫查看執行結果,可得知MyCATMySQL客戶端基本透明,對程序也幾乎透明,在select語句運行時,MyCAT會自行去各個分庫按照規則獲取合并結果。

             接著測試按照ER關系策略分片的t_user_class_rel表是否按照user_id的分片策略,同樣user_id的數據分布在同一個user庫的t_user表和t_user_class_rel表。

      在MyCATtest_mycat數據庫的t_user_class_rel表運行如下語句:

    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數據庫的t_user_class_rel表運行select查看記錄執行情況。進入localhostuser0user3數據庫,查看數據是否按照之前確定的rule1的規則和ER分片策略寫入不同的數據庫。

    2.3.5 讀寫分離

    2.3.5.1 讀寫分離定義

    為了確保數據庫產品的穩定性,很多數據庫擁有雙機熱備功能。也就是,第一臺數據庫服務器,是對外提供增刪改查業務的生產服務器;第二臺數據庫服務器,僅僅接收來自第一臺服務器的備份數據。一般來說,為了配置方便,以及穩定性,這兩臺數據庫服務器,都用的是相同的配置。

    在實際運行中,第一臺數據庫服務器的壓力,遠遠大于第二臺數據庫服務器。因此,很多人希望合理利用第二臺數據庫服務器的空閑資源。

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

    2.3.5.2 優缺點

    優點:合理利用從數據庫服務器的空閑資源。

    缺點:本來第二臺數據庫服務器,是用來做熱備的,它就應該在一個壓力非常小的環境下,保證運行的穩定性。而讀寫分離,卻增加了它的壓力,也就增加了不穩定性。因此,讀寫分離,實質上是一個在資金比較缺乏,但又需要保證數據安全的需求下,在雙機熱備方案上,做出的一種折中的擴展方案。

    2.3.5.3 讀寫分離實現

    MyCAT的讀寫分離機制如下:

    • 事務內的SQL,全部走寫節點,除非某個select語句以注釋/*balance*/開頭
    • 自動提交select語句會走讀節點,并在所有可用讀節點中間隨機負載均衡
    • 當某個主節點宕機,則其全部讀節點都不再被使用,因為此時,同步失敗,數據已經不是最新的,MyCAT會采用另外一個主節點所對應的全部讀節點來實現select負載均衡。
    • 當所有主節點都失敗,則為了系統高可用性,自動提交的所有select語句仍將提交到全部存活的讀節點上執行,此時系統的很多頁面還是能出來數據,只是用戶修改或提交會失敗。

    例如將本機作為寫庫,10.18.96.133作為讀庫,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屬性設置為:

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

    一個dataHost元素,表明進行了數據同步的一組數據庫,DBA需要保證這一組數據庫服務器是進行了數據同步復制的writeHost相當于Master DB Server,而其下的readHost則是與從數據庫同步的Slave DB Server。當dataHost配置了多個writeHost的時候,任何一個writeHost宕機,Mycat 都會自動檢測出來,并嘗試切換到下一個可用的writeHost

    在沒有配置數據同步復制的情況下,重啟后進行測試,可使用MySQL客戶端直接連接讀庫,插入幾條數據后,使用MySQL客戶端連接MyCat,運行select語句驗證是否在讀庫上執行。

    2.3.6 全局表

    2.3.6.1 全局表定義

    一個真實的業務系統中,往往存在大量的類似字典表的表格,它們與業務表之間可能有關系,這種關系,可以理解為“標簽”,而不應理解為通常的“主從關系”,這些表基本上很少變動,可以根據主鍵ID進行緩存,下面這張圖說明了一個典型的“標簽關系”圖:

             在分片的情況下,當業務表因為規模而進行分片以后,業務表與這些附屬的字典表之間的關聯,就成了比較棘手的問題,考慮到字典表具有以下幾個特性:

    • 變動不頻繁;
    • 數據量總體變化不大;
    • 數據規模不大,很少有超過數十萬條記錄。

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

    • 全局表的插入、更新操作會實時在所有節點上執行,保持各個分片的數據一致性
    • 全局表的查詢操作,只從一個節點獲取
    • 全局表可以跟任何一個表進行JOIN操作

    將字典表或者符合字典表特性的一些表定義為全局表,則從另外一個方面,很好的解決了數據JOIN的難題。通過全局表+基于E-R關系的分片策略,MyCAT可以滿足80%以上的企業應用開發。

    2.3.6.2 全局表實現

    1)創建表結構

             在各個庫分別創建全局表(例如:t_area)的表結構,表結構保持一致,例如:

    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 '調用方系統表示',
     `province_code` 
    varchar(10CHARACTER SET utf8 NOT NULL COMMENT '省份編碼',
     `area_code` 
    varchar(10CHARACTER SET utf8 NOT NULL COMMENT '區域編碼',
     `area_name` 
    varchar(100CHARACTER SET utf8 DEFAULT NULL COMMENT '區域名稱',
     `parent_area_code` 
    varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '父區域編碼',
     `create_time` 
    datetime NOT NULL COMMENT '創建時間',
     `modify_time` 
    datetime DEFAULT NULL COMMENT '修改時間',
     
    PRIMARY KEY (`id`)
    ) ENGINE
    =InnoDB AUTO_INCREMENT=3792 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

     

    2)配置schema.xml

    全局表配置比較簡單,不用寫Rule規則,在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)全局表測試

             運行如下insert語句,往test_mycatt_area表插入10條數據,如下所示:

    INSERT INTO `t_area` VALUES ('100''test''ZX''1''全國''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''市轄區''110000''2012-09-25 08:30:23'null);
    INSERT INTO `t_area` VALUES ('103''test''BJ''110101''東城區''110100''2012-09-25 08:30:23'null);
    INSERT INTO `t_area` VALUES ('104''test''BJ''110102''西城區''110100''2012-09-25 08:30:23'null);
    INSERT INTO `t_area` VALUES ('105''test''BJ''110103''崇文區''110100''2012-09-25 08:30:23'null);
    INSERT INTO `t_area` VALUES ('106''test''BJ''110104''宣武區''110100''2012-09-25 08:30:23'null);
    INSERT INTO `t_area` VALUES ('107''test''BJ''110105''朝陽區''110100''2012-09-25 08:30:23'null);
    INSERT INTO `t_area` VALUES ('108''test''BJ''110106''豐臺區''110100''2012-09-25 08:30:23'null);
    INSERT INTO `t_area` VALUES ('109''test''BJ''110107''石景山區''110100''2012-09-25 08:30:23'null);

          插入后去user0~user3數據庫中查找,可看到這4個庫中的t_area表都被插入10條數據。執行select語句能返回t_area表的對應記錄,執行updatedelete語句能對應對全局表相關的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中文版》

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


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

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

          Power Designer系統分析與建模實戰  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294286
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费精品无码AV片在线观看| 亚洲一区二区三区91| 一本久久a久久精品亚洲| 亚洲精品成人片在线观看| 亚洲AⅤ视频一区二区三区| 国产亚洲精aa在线看| 亚洲国产最大av| 亚洲欧洲AV无码专区| 含羞草国产亚洲精品岁国产精品 | 亚洲日韩精品一区二区三区| 国产亚洲成归v人片在线观看| 国产亚洲日韩在线三区| 亚洲精品V欧洲精品V日韩精品| 久久久久亚洲精品成人网小说 | 妞干网免费视频在线观看| 成人性生活免费视频| 四虎永久精品免费观看| 真实国产乱子伦精品免费| 日本免费网站视频www区| www.黄色免费网站| 免费视频中文字幕| 亚洲国产小视频精品久久久三级 | 一个人看的www在线观看免费| 成年女人毛片免费视频| 免费一级毛片在级播放| 成人性生免费视频| 免费人成视频x8x8入口| 亚洲无线码在线一区观看| 亚洲人成依人成综合网| 香蕉大伊亚洲人在线观看| 小说专区亚洲春色校园| 国内永久免费crm系统z在线 | 久久国产亚洲高清观看| 7777久久亚洲中文字幕| 美女被免费视频网站| 亚洲AV永久无码精品网站在线观看| 国产亚洲男人的天堂在线观看 | 亚洲高清视频在线观看| 国产亚洲sss在线播放| 免费人成大片在线观看播放电影| 两个人看的www高清免费视频|