1. 程式人生 > >MySQL分布式集群之MyCAT(一)簡介【轉】

MySQL分布式集群之MyCAT(一)簡介【轉】

oba 但是 相關 水平切分 團隊 odin out mysql雙主 mys

隔了好久,才想起來更新博客,最近倒騰的數據庫從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、DB2、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的集群,由我們自己決定╰(?? ▽ ??)╯。

--------------------------------------------------------------怎麽使用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分布式集群之MyCAT(一)簡介【轉】