數據庫中間件MyCat學習總結(1)——MyCat入門簡介

爲何須要MyCat?前端

雖然雲計算時代,傳統數據庫存在着先天性的弊端,可是NoSQL數據庫又沒法將其替代。若是傳統數據易於擴展,可切分,就能夠避免單機(單庫)的性能缺陷。node

MyCat的目標就是:低成本地將現有的單機數據庫和應用平滑遷移到「雲」端,解決數據存儲和業務規模迅速增加狀況下的數據瓶頸問題。2014年MyCat首次在上海的《中華架構師》大會上對外宣講引起圍觀,更多的人蔘與進來,隨後愈來愈多的項目採用了MyCat。算法

MyCat截至到2015年4月,保守估計已經有超過60個項目在使用,主要應用在電信領域、互聯網項目,大部分是交易和管理系統,少許是信息系統。比較大的系統中,數據規模單表單月30億。sql

MyCat是什麼?數據庫

從定義和分類來看,它是一個開源的分佈式數據庫系統,是一個實現了MySQL協議的服務器,前端用戶能夠把它看做是一個數據庫代理,用MySQL客戶端工具和命令行訪問,而其後端能夠用MySQL原生協議與多個MySQL服務器通訊,也能夠用JDBC協議與大多數主流數據庫服務器通訊,其核心功能是分表分庫,即將一個大表水平分割爲N個小表,存儲在後端MySQL服務器裏或者其餘數據庫裏。後端

MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端能夠支持MySQL、SQL Server、Oracle、DB二、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,將來還會支持更多類型的存儲。而在最終用戶看來,不管是那種存儲方式,在MyCat裏,都是一個傳統的數據庫表,支持標準的SQL語句進行數據的操做,這樣一來,對前端業務系統來講,能夠大幅下降開發難度,提高開發速度緩存


圖1 MyCat架構設計圖
服務器

MyCat解決了哪些問題架構

1. 鏈接過多問題,能夠經過MyCat統一管理全部的數據源,後端數據庫集羣對前端應用程序透明。使用MyCat以前系統結構如圖2。併發


圖2  MyCat早前系統架構

MyCat引入鏈接複用解決多應用競爭問題,經過MyCat改造後,如圖3所示。


圖3  改造後的MyCat

2. 首創的ER關係分片,解決E-R分片難處理問題,存在關聯關係的父子表在數據插入的過程當中,子表會被MyCat路由到其相關父表記錄的節點上,從而父子表的Join查詢能夠下推到各個數據庫節點上完成,這是最高效的跨節點Join處理技術,也是MyCat獨創。


圖4  首創的ER關係分片,是MyCat獨創

3. 採用全局分片技術,每一個節點同時併發插入和更新數據,每一個節點均可以讀取數據,提高讀性能的同時,也解決跨節點Join的效率。


圖5 採用全局分片技術

4. 經過人工智能的catlet支持跨分片複雜SQL實現以及存儲過程支持等。使用方式主要經過MyCat註釋的方式來執行,以下:

(1)跨分片聯合查詢註解支持:

<span style="font-family:Courier New;font-size:18px;color:#ff0000;"><strong style="background-color: rgb(255, 255, 255);">/*!MyCat:catlet=demo.catlets.ShareJoin / select bu. ,sg.* from base_user bu,sam_glucose sg where bu.id_=sg.user_id;</strong></span>

注:sam_glucose是跨分片表。

(2)存儲過程註解支持:

<span style="font-family:Courier New;font-size:18px;color:#ff0000;"><strong style="background-color: rgb(255, 255, 255);">/*!MyCat: sql=select * from base_user where id_=1;*/ CALL proc_test();</strong></span>

注:目前執行存儲過程經過MyCat註解的方式執行,注意須要把存儲過程當中的sql寫到註解中。

(3)批量插入與ID自增加結合的支持:

<span style="font-family:Courier New;font-size:18px;color:#ff0000;"><strong style="background-color: rgb(255, 255, 255);">/*!MyCat:catlet=demo.catlets.BatchInsertSequence */ insert into sam_test(name_) values(‘t1’),(‘t2’);</strong></span>
注:此方式不須要在sql語句中顯示的設置主鍵字段,程序在後臺根據primaryKey配置的主鍵列,自動生成主鍵的sequence值並替換原sql中相關的列和值;

(4)獲取批量sequence值的支持:

<span style="font-family:Courier New;font-size:18px;color:#ff0000;"><strong style="background-color: rgb(255, 255, 255);">/*!MyCat:catlet=demo.catlets.BatchGetSequence */SELECT MyCat_get_seq(‘MyCat_TEST’,100);</strong></span>
注:此方法表示獲取MyCat_TEST表的100個sequence值,例如當前MyCat_TEST表的最大sequence值爲5000,則經過此方式返回的是5001,同時更新數據庫中的MyCat_TEST表的最大sequence值爲5100。

(5)更好地支持數據庫讀寫分離與高可用性,MyCat支持基於MySQL主從複製狀態的高級讀寫分離控制機制(好比Slave_behind_master <100則開啓),而一旦檢測到主從同步出錯或者延時超過發展,則自動排除readHost,防止程序讀到好久的舊數據。


圖6  Mycat支持基於MySQL主從複製狀態的高級讀寫分離控制機制

MyCat技術原理

MyCat技術原理中最重要的一個動詞是「攔截」,它攔截了用戶發送過來的SQL語句,首先對SQL語句作了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,而後將此SQL發日後端的真實數據庫,並將返回的結果作適當的處理,最終再返回給用戶。


圖7  Orders被分爲三個分片datanode

如圖7所示,Orders表被分爲三個分片datanode(簡稱dn),這三個分片是分佈在兩臺MySQL Server上(DataHost),即datanode=database@datahost方式,所以你能夠用一臺到N臺服務器來分片,分片規則爲(sharding rule)典型的字符串枚舉分片規則,一個規則的定義是分片字段(sharding column)+分片函數(rule function),這裏的分片字段爲prov而分片函數爲字符串枚舉方式。當MyCat收到一個SQL時,會先解析這個SQL,查找涉及到的表,而後看此表的定義,若是有分片規則,則獲取到SQL裏分片字段的值,並匹配分片函數,獲得該SQL對應的分片列表,而後將SQL發往這些分片去執行,最後收集和處理全部分片返回的結果數據,並輸出到客戶端。以select * from Orders where prov=?語句爲例,查到prov=wuhan,按照分片函數,wuhan返回dn1,因而SQL就發給了MySQL1,去取DB1上的查詢結果,並返回給用戶。若是上述SQL改成select * from Orders where prov in (‘wuhan’,‘beijing’),那麼,SQL就會發給MySQL1與MySQL2去執行,而後結果集合並後輸出給用戶。但一般業務中咱們的SQL會有Order By以及Limit翻頁語法,此時就涉及到結果集在MyCat端的二次處理,這部分的代碼也比較複雜,而最複雜的則屬兩個表的Jion問題,爲此,MyCat提出了創新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet等。

MyCat下一步規劃

強化分佈式數據庫中間件的面的功能,使之具有豐富的插件、強大的數據庫智能優化功能、全面的系統監控能力、以及方便的數據運維工具,實如今線數據擴容、遷移等高級功能。

進一步挺進大數據計算領域,深度結合Spark Stream和Storm等分佈式實時流引擎,可以完成快速的巨表關聯、排序、分組聚合等OLAP方向的能力,並集成一些熱門經常使用的實時分析算法,讓工程師以及DBA們更容易用MyCat實現一些高級數據分析處理功能。

相關文章
相關標籤/搜索