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語句進行數據的操作,這樣一來,對前端業務系統來 說,可以大幅降低開發難度,提升開發速度
圖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)跨分片聯合查詢注解支持:
/*!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,防止程序讀到很久的舊數據。
圖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實現一些高級數據分析處理功能。
作者: 王金劍
簡介: CSDN博客認證專家,開源數據庫中間件Mycat核心開發成員。從事軟件工作10年。現在天獅集團擔任高級DBA工程師,負責公司電子商務網站數據庫設計與優化、數據庫架構規劃及部署規范制定、核心應用的軟件設計與開發等工作。