全量遷移的方案相對簡單,使用DDB自帶工具按照特定分區(qū)策略dump和load即可。對增量遷移,DDB實(shí)現(xiàn)了一套獨(dú)立的遷移工具h(yuǎn)amal來訂閱各個(gè)數(shù)據(jù)節(jié)點(diǎn)的增量更新,hamal內(nèi)部又依賴DBI模塊將增量更新apply到新庫新表,如下圖所示:
數(shù)據(jù)遷移工具h(yuǎn)amal
Hamal作為獨(dú)立服務(wù),與Proxy一樣由DDB統(tǒng)一配置和管理,每個(gè)hamal進(jìn)程負(fù)責(zé)一個(gè)數(shù)據(jù)節(jié)點(diǎn)的增量遷移,啟動(dòng)時(shí)模擬slave向原庫拉取binlog存儲本地,之后實(shí)時(shí)的通過DBI模塊apply到新庫新表,除了基本的遷移功能外,Hamal具備以下兩個(gè)特性:
- 并行復(fù)制:hamal的并行復(fù)制組件,通過在增量事件之間建立有向無環(huán)圖,實(shí)時(shí)判斷哪些事件可以并行執(zhí)行,hamal的并行復(fù)制與MySQL的并行復(fù)制相比快10倍以上。
- 斷點(diǎn)續(xù)傳:hamal的增量apply具有冪等性,在網(wǎng)絡(luò)中斷或進(jìn)程重啟之后可以斷點(diǎn)續(xù)傳
全局表
考慮一種場景:city表記錄了國內(nèi)所有城市信息,應(yīng)用中有很多業(yè)務(wù)表需要與city做聯(lián)表查詢,如按照城市分組統(tǒng)計(jì)一些業(yè)務(wù)信息。假設(shè)city的主鍵和分區(qū)鍵都是cityId,若連接操作發(fā)生在中間件層,代價(jià)較高,為了將連接操作下發(fā)數(shù)據(jù)節(jié)點(diǎn),需要讓聯(lián)接的業(yè)務(wù)表同樣按照cityId分區(qū),而大多數(shù)業(yè)務(wù)表往往不能滿足這個(gè)條件。
聯(lián)接直接下發(fā)需要滿足兩個(gè)條件,數(shù)據(jù)分布相同和分區(qū)鍵上聯(lián)接,除此之外,其實(shí)還有一種解法,可以把city表冗余到所有數(shù)據(jù)節(jié)點(diǎn)中,這樣各個(gè)數(shù)據(jù)節(jié)點(diǎn)本地聯(lián)接的集合,便是所求結(jié)果。DDB將這種類型的表稱之為全局表。
全局表的特點(diǎn)是更新極少,通過2PC保障各個(gè)節(jié)點(diǎn)冗余表的一致性。可以通過在建表語句添加相關(guān) hint指定全局表類型,在應(yīng)用使用DDB過程中,全局表的概念對應(yīng)用不可見。
未來——獨(dú)立平臺,與云共舞
DDB作為網(wǎng)易濃縮了10年技術(shù)經(jīng)驗(yàn)與精華的分庫分表數(shù)據(jù)庫,近一兩年除了滿足內(nèi)部產(chǎn)品使用外,也漸漸開始幫助外部企業(yè)客戶解決海量結(jié)構(gòu)化數(shù)據(jù)存儲的難題。隨著公有云技術(shù)的大力發(fā)展和日趨成熟,各種IaaS和PaaS平臺如雨后春筍層出不窮,如網(wǎng)易蜂巢的推出,為應(yīng)用開發(fā),部署和運(yùn)維提供了極大便利,而隨著IaaS層和PaaS平臺的普及,各種SaaS服務(wù)也會慢慢為廣大開發(fā)者所接納,未來DDB也將重點(diǎn)為網(wǎng)易蜂巢客戶打包DDB的SaaS服務(wù),與蜂巢一同構(gòu)建一套更加豐富的數(shù)據(jù)存儲生態(tài)系統(tǒng)。
我們對DDB的SaaS服務(wù)化無比堅(jiān)定,同時(shí)DDB的公有云之路絕非私有云的生搬硬套,在與蜂巢一同幫助企業(yè)客戶解決分庫分表難題的同時(shí),未來我們也會更加注重平臺獨(dú)立,首先要做的是將DDB的SaaS層與底層PaaS和IaaS層解耦,實(shí)現(xiàn)將DDB平臺所依賴的PaaS和IaaS以插件方式注入。這樣一來可以為客戶提供更靈活的服務(wù)方式,二來可以極大程度降低DDB平臺本身的開發(fā)和運(yùn)維成本:一套平臺管理工具,適用所有內(nèi)外部DDB用戶,這是我們正在進(jìn)行并將持續(xù)優(yōu)化的目標(biāo)。