您好,登錄后才能下訂單哦!
摘要:MyCat截至到2015年4月,保守估計(jì)已經(jīng)有超過(guò)60個(gè)項(xiàng)目在使用,主要應(yīng)用在電信領(lǐng)域、互聯(lián)網(wǎng)項(xiàng)目,大部分是交易和管理系統(tǒng),少量是信息系統(tǒng)。比較大的系統(tǒng)中,數(shù)據(jù)規(guī)模單表單月30億。本文帶你全面了解MyCat。
為什么需要MyCat?
雖然云計(jì)算時(shí)代,傳統(tǒng)數(shù)據(jù)庫(kù)存在著先天性的弊端,但是NoSQL數(shù)據(jù)庫(kù)又無(wú)法將其替代。如果傳統(tǒng)數(shù)據(jù)易于擴(kuò)展,可切分,就可以避免單機(jī)(單庫(kù))的性能缺陷。
MyCat的目標(biāo)就是:低成本地將現(xiàn)有的單機(jī)數(shù)據(jù)庫(kù)和應(yīng)用平滑遷移到“云”端,解決數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)規(guī)模迅速增長(zhǎng)情況下的數(shù)據(jù)瓶頸問題。2014年MyCat首次在上海的《中華架構(gòu)師》大會(huì)上對(duì)外宣講引發(fā)圍觀,更多的人參與進(jìn)來(lái),隨后越來(lái)越多的項(xiàng)目采用了MyCat。
MyCat截至到2015年4月,保守估計(jì)已經(jīng)有超過(guò)60個(gè)項(xiàng)目在使用,主要應(yīng)用在電信領(lǐng)域、互聯(lián)網(wǎng)項(xiàng)目,大部分是交易和管理系統(tǒng),少量是信息系統(tǒng)。比較大的系統(tǒng)中,數(shù)據(jù)規(guī)模單表單月30億。
MyCat是什么?
從定義和分類來(lái)看,它是一個(gè)開源的分布式數(shù)據(jù)庫(kù)系統(tǒng),是一個(gè)實(shí)現(xiàn)了MySQL協(xié)議的服務(wù)器,前端用戶可以把它看作是一個(gè)數(shù)據(jù)庫(kù)代理,用MySQL客戶端工具和命令行訪問,而其后端可以用MySQL原生協(xié)議與多個(gè)MySQL服務(wù)器通信,也可以用JDBC協(xié)議與大多數(shù)主流數(shù)據(jù)庫(kù)服務(wù)器通信,其核心功能是分表分庫(kù),即將一個(gè)大表水平分割為N個(gè)小表,存儲(chǔ)在后端MySQL服務(wù)器里或者其他數(shù)據(jù)庫(kù)里。
MyCat發(fā)展到目前的版本,已經(jīng)不是一個(gè)單純的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數(shù)據(jù)庫(kù),也支持MongoDB這種新型NoSQL方式的存儲(chǔ),未來(lái)還會(huì)支持更多類型的存儲(chǔ)。而在最終用戶看來(lái),無(wú)論是那種存儲(chǔ)方式,在MyCat里,都是一個(gè)傳統(tǒng)的數(shù)據(jù)庫(kù)表,支持標(biāo)準(zhǔn)的SQL語(yǔ)句進(jìn)行數(shù)據(jù)的操作,這樣一來(lái),對(duì)前端業(yè)務(wù)系統(tǒng)來(lái)說(shuō),可以大幅降低開發(fā)難度,提升開發(fā)速度
圖1 MyCat架構(gòu)設(shè)計(jì)圖
MyCat解決了哪些問題
1. 連接過(guò)多問題,可以通過(guò)MyCat統(tǒng)一管理所有的數(shù)據(jù)源,后端數(shù)據(jù)庫(kù)集群對(duì)前端應(yīng)用程序透明。使用MyCat之前系統(tǒng)結(jié)構(gòu)如圖2。
圖2 MyCat早前系統(tǒng)架構(gòu)
MyCat引入連接復(fù)用解決多應(yīng)用競(jìng)爭(zhēng)問題,通過(guò)MyCat改造后,如圖3所示。
圖3 改造后的MyCat
2. 獨(dú)創(chuàng)的ER關(guān)系分片,解決E-R分片難處理問題,存在關(guān)聯(lián)關(guān)系的父子表在數(shù)據(jù)插入的過(guò)程中,子表會(huì)被MyCat路由到其相關(guān)父表記錄的節(jié)點(diǎn)上,從而父子表的Join查詢可以下推到各個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)上完成,這是最高效的跨節(jié)點(diǎn)Join處理技術(shù),也是MyCat首創(chuàng)。
圖4 獨(dú)創(chuàng)的ER關(guān)系分片,是MyCat首創(chuàng)
3. 采用全局分片技術(shù),每個(gè)節(jié)點(diǎn)同時(shí)并發(fā)插入和更新數(shù)據(jù),每個(gè)節(jié)點(diǎn)都可以讀取數(shù)據(jù),提升讀性能的同時(shí),也解決跨節(jié)點(diǎn)Join的效率。
圖5 采用全局分片技術(shù)
4. 通過(guò)人工智能的catlet支持跨分片復(fù)雜SQL實(shí)現(xiàn)以及存儲(chǔ)過(guò)程支持等。使用方式主要通過(guò)MyCat注釋的方式來(lái)執(zhí)行,如下:
(1)跨分片聯(lián)合查詢注解支持:
/*!MyCat:catlet=demo.catlets.ShareJoin / select bu. ,sg.* from base_user bu,sam_glucose sg where bu.id_=sg.user_id;
注:sam_glucose是跨分片表。
(2)存儲(chǔ)過(guò)程注解支持:
/*!MyCat: sql=select * from base_user where id_=1;*/ CALL proc_test();
注:目前執(zhí)行存儲(chǔ)過(guò)程通過(guò)MyCat注解的方式執(zhí)行,注意需要把存儲(chǔ)過(guò)程中的sql寫到注解中。
(3)批量插入與ID自增長(zhǎng)結(jié)合的支持:
/*!MyCat:catlet=demo.catlets.BatchInsertSequence */ insert into sam_test(name_) values(‘t1’),(‘t2’);
注:此方式不需要在sql語(yǔ)句中顯示的設(shè)置主鍵字段,程序在后臺(tái)根據(jù)primaryKey配置的主鍵列,自動(dòng)生成主鍵的sequence值并替換原sql中相關(guān)的列和值;
(4)獲取批量sequence值的支持:
/*!MyCat:catlet=demo.catlets.BatchGetSequence */SELECT MyCat_get_seq(‘MyCat_TEST’,100);
注:此方法表示獲取MyCat_TEST表的100個(gè)sequence值,例如當(dāng)前MyCat_TEST表的最大sequence值為5000,則通過(guò)此方式返回的是5001,同時(shí)更新數(shù)據(jù)庫(kù)中的MyCat_TEST表的最大sequence值為5100。
(5)更好地支持?jǐn)?shù)據(jù)庫(kù)讀寫分離與高可用性,MyCat支持基于MySQL主從復(fù)制狀態(tài)的高級(jí)讀寫分離控制機(jī)制(比如Slave_behind_master <100則開啟),而一旦檢測(cè)到主從同步出錯(cuò)或者延時(shí)超過(guò)發(fā)展,則自動(dòng)排除readHost,防止程序讀到很久的舊數(shù)據(jù)。
圖6 Mycat支持基于MySQL主從復(fù)制狀態(tài)的高級(jí)讀寫分離控制機(jī)制
MyCat技術(shù)原理
MyCat技術(shù)原理中最重要的一個(gè)動(dòng)詞是“攔截”,它攔截了用戶發(fā)送過(guò)來(lái)的SQL語(yǔ)句,首先對(duì)SQL語(yǔ)句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,然后將此SQL發(fā)往后端的真實(shí)數(shù)據(jù)庫(kù),并將返回的結(jié)果做適當(dāng)?shù)奶幚?,最終再返回給用戶。
圖7 Orders被分為三個(gè)分片datanode
如圖7所示,Orders表被分為三個(gè)分片datanode(簡(jiǎn)稱dn),這三個(gè)分片是分布在兩臺(tái)MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一臺(tái)到N臺(tái)服務(wù)器來(lái)分片,分片規(guī)則為(sharding rule)典型的字符串枚舉分片規(guī)則,一個(gè)規(guī)則的定義是分片字段(sharding column)+分片函數(shù)(rule function),這里的分片字段為prov而分片函數(shù)為字符串枚舉方式。當(dāng)MyCat收到一個(gè)SQL時(shí),會(huì)先解析這個(gè)SQL,查找涉及到的表,然后看此表的定義,如果有分片規(guī)則,則獲取到SQL里分片字段的值,并匹配分片函數(shù),得到該SQL對(duì)應(yīng)的分片列表,然后將SQL發(fā)往這些分片去執(zhí)行,最后收集和處理所有分片返回的結(jié)果數(shù)據(jù),并輸出到客戶端。以select * from Orders where prov=?語(yǔ)句為例,查到prov=wuhan,按照分片函數(shù),wuhan返回dn1,于是SQL就發(fā)給了MySQL1,去取DB1上的查詢結(jié)果,并返回給用戶。如果上述SQL改為select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就會(huì)發(fā)給MySQL1與MySQL2去執(zhí)行,然后結(jié)果集合并后輸出給用戶。但通常業(yè)務(wù)中我們的SQL會(huì)有Order By以及Limit翻頁(yè)語(yǔ)法,此時(shí)就涉及到結(jié)果集在MyCat端的二次處理,這部分的代碼也比較復(fù)雜,而最復(fù)雜的則屬兩個(gè)表的Jion問題,為此,MyCat提出了創(chuàng)新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet等。
MyCat下一步規(guī)劃
強(qiáng)化分布式數(shù)據(jù)庫(kù)中間件的面的功能,使之具備豐富的插件、強(qiáng)大的數(shù)據(jù)庫(kù)智能優(yōu)化功能、全面的系統(tǒng)監(jiān)控能力、以及方便的數(shù)據(jù)運(yùn)維工具,實(shí)現(xiàn)在線數(shù)據(jù)擴(kuò)容、遷移等高級(jí)功能。
進(jìn)一步挺進(jìn)大數(shù)據(jù)計(jì)算領(lǐng)域,深度結(jié)合Spark Stream和Storm等分布式實(shí)時(shí)流引擎,能夠完成快速的巨表關(guān)聯(lián)、排序、分組聚合等OLAP方向的能力,并集成一些熱門常用的實(shí)時(shí)分析算法,讓工程師以及DBA們更容易用MyCat實(shí)現(xiàn)一些高級(jí)數(shù)據(jù)分析處理功能。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。