MyCat:開源分佈式數據庫中間件

MyCat:開源分佈式數據庫中間件

為什麼需要MyCat?

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

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

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

MyCat是什麼?

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

MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat裡,都是一個傳統的數據庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度

MyCat:開源分佈式數據庫中間件

圖1 MyCat架構設計圖

MyCat解決了哪些問題

1. 連接過多問題,可以通過MyCat統一管理所有的數據源,後端數據庫集群對前端應用程序透明。使用MyCat之前系統結構如圖2。

MyCat:開源分佈式數據庫中間件

圖2 MyCat早前系統架構

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

MyCat:開源分佈式數據庫中間件

圖3 改造後的MyCat

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

MyCat:開源分佈式數據庫中間件

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

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

MyCat:開源分佈式數據庫中間件

圖5 採用全局分片技術

4. 通過人工智能的catlet支持跨分片複雜SQL實現以及存儲過程支持等。

使用方式主要通過MyCat註釋的方式來執行,如下:

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

/*!MyCat:catlet=demo.catlets.ShareJoin / select bu. ,sg.* from base_user bu,sam_glucose sg where bu.id_=sg.user_id;

注:sam_glucose是跨分片表。

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

/*!MyCat: sql=select * from base_user where id_=1;*/ CALL proc_test();

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

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

/*!MyCat:catlet=demo.catlets.BatchInsertSequence */ insert into sam_test(name_) values(‘t1’),(‘t2’);

注:此方式不需要在sql語句中顯示的設置主鍵字段,程序在後臺根據primaryKey配置的主鍵列,自動生成主鍵的sequence值並替換原sql中相關的列和值;

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

/*!MyCat:catlet=demo.catlets.BatchGetSequence */SELECT MyCat_get_seq(‘MyCat_TEST’,100);

注:此方法表示獲取MyCat_TEST表的100個sequence值,例如當前MyCat_TEST表的最大sequence值為5000,則通過此方式返回的是5001,同時更新數據庫中的MyCat_TEST表的最大sequence值為5100。

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

MyCat:開源分佈式數據庫中間件

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

MyCat技術原理

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

MyCat:開源分佈式數據庫中間件

圖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實現一些高級數據分析處理功能。


分享到:


相關文章: