首頁  >  文章  >  資料庫  >  MySQL分散式叢集之MyCAT(一)簡單介紹

MySQL分散式叢集之MyCAT(一)簡單介紹

黄舟
黄舟原創
2017-03-11 14:17:581894瀏覽

隔了好久,才想起來更新博客,最近倒騰的資料庫從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的重要特性--------------- -------------------------------------------------- ---
支援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,這是從網路上摘抄的一個範例範本                

  1. <?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
首先是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來完成,以後再詳細介紹。

  1. 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,不过这个需要去看源代码才知晓细节了。



以上是MySQL分散式叢集之MyCAT(一)簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn