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