MySQL分佈式集羣之MyCAT(一)簡介【轉】

隔了很久,纔想起來更新博客,最近倒騰的數據庫從Oracle換成了MySQL,研究了一段時間,感受社區版的MySQL在各個方面都遜色於Oracle,Oracle真的好方便!
好了,不廢話,此次準備記錄一些關於MySQL分佈式集羣搭建的一個東東,MyCAT,我把他理解爲一個MySQL代理。
-----------------------------------------------------------------重要的TIPs-----------------------------------------------------------------------
MyCAT的團隊已經發布了1.4Alpha版本,這其中修復了很多的bug,也添加了新功能,
博主這邊測試用的是1.3的版本,因此和最新版本的測試結果可能出現不一致!

-------------------------------------------------------------------背景介紹------------------------------------------------------------------

MyCAT的背景介紹直接略過,沒啥用,固然,這是一個由JAVA開發的東東,這一點須要瞭解~。

-----------------------------------------------------------------MyCAT的前身----------------------------------------------------------------
MyCAT的前身,是阿里巴巴於2012年6月19日,正式對外開源的數據庫中間件Cobar,Cobar的前身是早已經開源的Amoeba,不過其做者陳思儒離職去盛大以後,阿里巴巴內部考慮到Amoeba的穩定性、性能和功能支持,以及其餘因素,從新設立了一個項目組而且更換名稱爲Cobar。Cobar是由 Alibaba 開源的 MySQL 分佈式處理中間件,它能夠在分佈式的環境下看上去像傳統數據庫同樣提供海量數據服務。前端

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

---------------------------------------------------------MyCAT的下載方式--------------------------------------------------------------------
MyCAT的SVN地址爲:http://code.taobao.org/svn/openclouddb/

---------------------------------------------------------MyCAT的重要特性--------------------------------------------------------------------
支持 SQL 92標準;
支持MySQL集羣,能夠做爲Proxy使用;
支持JDBC鏈接ORACLE、DB二、SQL Server,將其模擬爲MySQL Server使用;
支持galera for mysql集羣,percona-cluster或者mariadb cluster,提供高可用性數據分片集羣;
自動故障切換,高可用性;
支持讀寫分離,支持MySQL雙主多從,以及一主多從的模式;
支持全局表,數據自動分片到多個節點,用於高效表關聯查詢;
支持獨有的基於E-R 關係的分片策略,實現了高效的表關聯查詢;
多平臺支持,部署和實施簡單。

------------------------------------------------------------MyCAT的體系結構----------------------------------------------------------------

整體上分紅三個部分,最前端的是鏈接器,線程管理使用了資源池,而且默認採用了AIO的方式(這些基本信息能夠再啓動日誌裏面看到);
中間層在圖中已經描述的很清楚了,SQL解析器+SQL路由,SQL Executor須要具體看源碼才能瞭解,由於經過這段時間對MyCAT的測試,沒有感受到SQL Executor的存在,更多的感受是一個SQL process的東西,DataNode和心跳檢測算是中間層實現的兩個組件,一個是和MySQL的庫(注意,不是實例)相關,一個是常見的監測機制的功能模塊;
最下層的存儲就是是MySQL的集羣了~怎麼玩MySQL的集羣,由咱們本身決定╰(?? ▽ ??)╯。node

 
--------------------------------------------------------------怎麼使用MyCAT---------------------------------------------------------- 
MyCAT目前經過配置文件的方式來定義邏輯庫和相關配置,主要是包括三個文件:
MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節點等內容;
 MYCAT_HOME/conf/rule.xml中定義分片規則;
MYCAT_HOME/conf/server.xml中定義用戶以及系統相關變量,如端口等。

 不着急,這一篇簡單介紹這幾個配置文件的做用和一些參數的意義。
一個一個來,先看schema.xml,這是從網上摘抄的一個示例模板                
<?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" />
        
    
    <dataNode name="dn1" dataHost="localhost0" database="weixin" />
    <dataNode name="dn2" dataHost="localhost0" database="yixin" />
    <dataHost name="localhost0" maxCon="450" 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="123456" />
           <readHost host="hostS1" url="localhost:3307" user="test" password="123456" />
    </dataHost>
</mycat:schema>

 

 

首先是schema name = "weixin",這一項配置之後的效果就是,當MySQL客戶端鏈接MyCAT時,經過Show DATABASE命令,能看到的數據庫的,名字,
好比在這個配置文件裏面,就配置了兩個數據庫,weixin和yixin,這兩個庫各自包含一張user表。
注意:MyCAT對外端顯示出來的數據庫,和數據庫裏面的表,所有在schema裏面配置,沒有寫在這個裏面的表或者庫,即便後端的MySQL裏面存在,也沒法經過MyCAT去訪問,不過MyCAT不會去定義具體表的結構。
而後是datanode,這個屬性指定了schema的表,具體存放在哪一個數據庫,好比這個配置裏面,指定了dn1的數據節點位於localhost0,這個數據庫實例的名爲weixin的數據庫,dn2同理。
datahost列出了實際的後端MySQL集羣的具體信息,writehost是負責寫入數據的MySQL實例,writehost是負責讀的MySQL實例,若是兩個實例的具體信息寫成同樣,那就意味着後端使用單實例,若是配置成不一樣的實例,那麼就在兩個實例之間配置主從同步,而後經過MyCAT實現讀寫分離
對數據庫進行垂直切分,主要由schema.xml來完成,這個之後再詳細介紹。

rule.xml如示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/"> 
 <tableRule name="rule">
    <rule>
      <columns>user_id</columns>
      <algorithm>func1</algorithm>
    </rule>
 </tableRule>
 <function name="func1" class="org.opencloudb.route.function.PartitionByLong">
    <property name="partitionCount">2</property>
    <property name="partitionLength">512</property>
 </function>
</mycat:rule>

 

                
rule.xml裏面的配置主要用於對錶的水平切分,MyCAt自己提供了不少種水平切分的策略,這個示例顯示的是取模分片,總共分紅四片,user_id對1024取模,而後分紅兩片,每一片512個。
其餘的切分策略之後再詳細介紹

server.xml如示例
<!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</property>
    </user>
</mycat:server>

 


server.xml裏面配置MyCAT的邏輯庫參數,如示例,配置的就是邏輯庫weixin和yixin的登陸用戶名和密碼
這個XML裏面其實還有一些有關於MyCAT性能調整的參數,不過略去了,東西太多,之後再詳細介紹

----------------------------------------------------------------------華麗的分割線-------------------------------------------------------------

簡單的MyCAT搭建大體上就包括這些內容,如今講講使用一段時間之後,對MyCAT的一些總結;
1.MyCAT的性能表現仍是不錯的,這幾天一直對MyCAT的各方面進行測試,發現MyCAT做爲一個代理,雖然是在JAVA虛擬機上面運行,可是面對接近9K的QPS的峯值的時候,自己並無出現無響應或者丟失鏈接的問題;
2.MyCAT對前端顯示的全部的庫,表,所有由schema來配置,可是自己不定義表結構,這使得後端的表結構若是出現不一致,MyCAT前端是察覺不到的,不太方便吧;
3.第二點的不方便,也反映了一點,沒有配置到schema的表,徹底沒法經過MyCAT去操做,這也算是安全性良好的一個表現吧;
4.以前說SQL Executor沒感受到,也是由於在一些測試中,發現MyCAT更像一個提供轉發和結果合併功能的代理,只是對SQL和結果進行了process,不過這個須要去看源代碼才知曉細節了。

此次只打算寫這麼多,關於MyCAT的一些細節介紹,留給下一章~
 
轉自

MySQL分佈式集羣之MyCAT(一)簡介(修正)-wangwenan6-ITPUB博客
http://blog.itpub.net/29510932/viewspace-1664499/mysql

相關文章
相關標籤/搜索