隔了好久,才想起來更新博客,最近倒騰的數據庫從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,這是從網上摘抄的一個示例模板?????????? ? ? ?
-
<?xml version="1.0"?>nbsp;mycat:schema?SYSTEM?"schema.dtd"> <schema> ????<schema> ???????? ???? ????<schema></schema> ???????? ???? ????<datanode></datanode> ????<datanode></datanode> ????<datahost> ???????<heartbeat>select?user()</heartbeat> ???????<!-- can have multi write hosts --> ???????<writehost></writehost> ???????????<readhost></readhost> ????</datahost></schema></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"?>nbsp;mycat:rule?SYSTEM?"rule.dtd"> <rule>? ?<tablerule> ????<rule> ??????<columns>user_id</columns> ??????<algorithm>func1</algorithm> ????</rule> ?</tablerule> ?<function> ????<property>2</property> ????<property>512</property> ?</function></rule>
????????????? ??
rule.xml里面的配置主要用于對表的水平切分,MyCAt本身提供了很多種水平切分的策略,這個示例顯示的是取模分片,總共分成四片,user_id對1024取模,然后分成兩片,每一片512個。
其他的切分策略以后再詳細介紹
server.xml如示例
nbsp;mycat:server?SYSTEM?"server.dtd"> <server> ????<system> ????????<property>0</property>? ????</system> ????<user> ???????<property>test</property> ???????<property>weixin,yixin</property> ????</user></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,不過這個需要去看源代碼才知曉細節了。