DDB Driver模式架構(gòu)
管理操作以建表為例:
DBA通過DBAdmin的窗口創(chuàng)建表,或者用isql執(zhí)行建表語句之后,向master發(fā)起實(shí)際的建表請(qǐng)求,master完成用戶認(rèn)證和合法性校驗(yàn)之后,先在各個(gè)數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建新表,然后將新表元數(shù)據(jù)記錄在系統(tǒng)庫(kù)中,最后由master將新表元數(shù)據(jù)同步給各個(gè)DBI模塊。
對(duì)于建表語句中DDB特有的語法,會(huì)由isql或dbadmin在解析DDL時(shí)完成相應(yīng)處理,如自增ID的設(shè)置。
在DDB中,master用于元數(shù)據(jù)管理,同步以及報(bào)警監(jiān)控。在DBI模塊啟動(dòng)時(shí),會(huì)第一時(shí)間向master注冊(cè),并拉取元數(shù)據(jù),之后master對(duì)元數(shù)據(jù)的同步保障了DBI模塊元數(shù)據(jù)的更新。在DBI執(zhí)行SQL,以及創(chuàng)建DB連接的過程中,不會(huì)涉及到與master的交互。
在分庫(kù)分表中間件中,與DDB Driver模式同樣類型的還有阿里TDDL,優(yōu)勢(shì)是部署簡(jiǎn)單,成本較低,容易理解和上手。劣勢(shì)也非常明顯:只支持JAVA客戶端,版本難以管理,問題難以追蹤,DB連接難以歸斂等,另外一點(diǎn)是,中間件與應(yīng)用綁定在一起,對(duì)應(yīng)用本身是個(gè)巨大侵入,而且分庫(kù)分表的過程是比較耗費(fèi)CPU資源的,所以在Driver模式下,無論是運(yùn)維還是性能開銷上都存在不可控的因素。
Proxy模式
相比于Driver模式在多語言,版本管理,運(yùn)維風(fēng)險(xiǎn)上存在的問題,Proxy模式很好地彌補(bǔ)了這些缺陷。所謂Proxy,就是在DDB中搭建了一組代理服務(wù)器來提供標(biāo)準(zhǔn)的MySQL服務(wù),在代理服務(wù)器內(nèi)部實(shí)現(xiàn)分庫(kù)分表的邏輯。本質(zhì)上說,DDB Proxy作為一組獨(dú)立服務(wù),實(shí)現(xiàn)了MySQL標(biāo)準(zhǔn)通信協(xié)議,任何語言的MySQL驅(qū)動(dòng)都可以訪問,而在Proxy內(nèi)部,依賴DBI組件實(shí)現(xiàn)分庫(kù)分表,Proxy與DBI的關(guān)系如下所示:
DDB Proxy模塊簡(jiǎn)圖
應(yīng)用通過標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)驅(qū)動(dòng)訪問DDB Proxy,Proxy內(nèi)部通過MySQL解碼器將請(qǐng)求還原為SQL,并由DDB Driver,也就是DBI模塊執(zhí)行得到結(jié)果,最后通過MySQL編碼器返回給應(yīng)用。
從上圖可以看出,Proxy在DBI上架設(shè)了MySQL編解碼模塊,從而形成獨(dú)立標(biāo)準(zhǔn)的MySQL服務(wù),而在MySQL編解碼模塊之上,DDB Proxy也提供了很多特色命令支持,例如:
- show processlist:查看Proxy所有連接狀態(tài),與MySQL相關(guān)命令高度一致
- show connection_pool:查詢Proxy到數(shù)據(jù)節(jié)點(diǎn)的連接池狀態(tài)
- show topsql..:查詢按照SQL模式聚合的各項(xiàng)統(tǒng)計(jì)結(jié)果,如執(zhí)行次數(shù),平均執(zhí)行時(shí)間
- . from..:查詢過去各個(gè)時(shí)間段內(nèi)的吞吐量
此外,DDB Proxy內(nèi)還提供了slow log等輔助功能,給運(yùn)維帶來很大的便利。
DDB Proxy模式完整架構(gòu)如下所示:
DDB Proxy模式架構(gòu)
與Driver模式架構(gòu)相比,除了QS(DDBProxy的內(nèi)部稱謂,下同)取代了DBI的位置,還在多個(gè)QS節(jié)點(diǎn)之上部署了LVS或haproxy + keepalived的組合做負(fù)載均衡,從而實(shí)現(xiàn)多個(gè)DDBProxy節(jié)點(diǎn)的熱備,由于DDBProxy無狀態(tài),或者說狀態(tài)統(tǒng)一由Master同步,在數(shù)據(jù)庫(kù)節(jié)點(diǎn)沒有達(dá)到瓶頸時(shí),可以通過簡(jiǎn)單地增設(shè)QS服務(wù)器實(shí)現(xiàn)服務(wù)線性擴(kuò)展。
私有云模式
在網(wǎng)易私有云項(xiàng)目啟動(dòng)之前,DDB一直以一個(gè)個(gè)獨(dú)立集群為不同業(yè)務(wù)提供服務(wù),不同DDB各自為政毫不相干,這樣的好處是業(yè)務(wù)之間完全隔離,互不影響,不好之處在于隨著使用DDB的產(chǎn)品數(shù)目不斷增多,一個(gè)DBA往往同時(shí)運(yùn)維數(shù)個(gè)甚至數(shù)十個(gè)DDB集群,而之前我們一直缺乏一個(gè)平臺(tái)化的管理系統(tǒng),在DBA在各個(gè)集群之間應(yīng)接不暇時(shí),我們沒有平臺(tái)化的統(tǒng)籌運(yùn)維幫助應(yīng)用及早發(fā)現(xiàn)問題,或是優(yōu)化一些使用方法。例如版本管理,2013年我們?cè)谝粋€(gè)大版本中做了個(gè)hotfix,并通知所有DBA將相關(guān)的版本進(jìn)行升級(jí),但是最后由于管理疏漏,有個(gè)別集群沒有及時(shí)上線,為業(yè)務(wù)帶來了損失。當(dāng)時(shí)如果我們有平臺(tái)化的管理方案,可以提供一些運(yùn)維手段幫助和提醒運(yùn)維人員及時(shí)更新所有有問題集群,另外,平臺(tái)化的管理工具也可以定制一些自動(dòng)化功能,如自動(dòng)備份,報(bào)警組等。