互聯(lián)網(wǎng)時代,也是關(guān)系型數(shù)據(jù)庫獨領(lǐng)風(fēng)騷的時代,從早期的oracle獨步天下,到現(xiàn)在MySQL蒸蒸日上,關(guān)系型數(shù)據(jù)庫是大多數(shù)互聯(lián)網(wǎng)應(yīng)用在數(shù)據(jù)可靠性存儲上的“命脈”。
隨著互聯(lián)網(wǎng)產(chǎn)品在體量和規(guī)模上的日益膨脹,無論是oracle還是mysql,都會第一時間面臨來自磁盤,CPU以及內(nèi)存等單機瓶頸,為此,產(chǎn)品方除了需要不斷購買成本難以控制的高規(guī)格服務(wù)器,還要面臨不斷迭代的在線數(shù)據(jù)遷移。在這種情況下,無論是海量的結(jié)構(gòu)化數(shù)據(jù)還是快速成長的業(yè)務(wù)規(guī)模,都迫切需要一種水平擴展的方法將存儲成本分?jǐn)偟匠杀究煽氐纳逃梅?wù)器上,同時,也希望通過線性擴容降低全量數(shù)據(jù)遷移對線上服務(wù)帶來的影響,分庫分表方案便應(yīng)運而生。
分庫分表的原理是將數(shù)據(jù)按照一定的分區(qū)規(guī)則sharding到不同的關(guān)系型數(shù)據(jù)庫中,應(yīng)用再通過中間件的方式訪問各個shard中的數(shù)據(jù)。分庫分表的中間件,隱藏了數(shù)據(jù)sharding和路由訪問的各項細(xì)節(jié),使應(yīng)用大多數(shù)場景下可以像使用單機數(shù)據(jù)庫一樣使用分庫分表后的分布式數(shù)據(jù)庫。業(yè)界中,網(wǎng)易DDB,阿里TDDL,corbar,mycat以及hotdb等系統(tǒng)都是分庫分表中間件中的佼佼者。
背景——十年一劍
DDB(全稱Distributed database)是網(wǎng)易杭研院立項最早,應(yīng)用最為廣泛的后臺產(chǎn)品之一,也是國內(nèi)最早出現(xiàn)的數(shù)據(jù)庫分庫分表中間件。
最早可以追溯到2006年,網(wǎng)易杭研成立之初,為了應(yīng)對網(wǎng)易博客這個日活超過800W的大體量應(yīng)用,由現(xiàn)任杭研院院長的汪源帶隊主導(dǎo)開發(fā)了DDB這套分庫分表數(shù)據(jù)庫,伴隨著博客的成長,DDB集群也從最早的20+節(jié)點,到40+節(jié)點,最后到現(xiàn)在云端100+個RDS實例。除了博客外,十年來DDB也見證了很多其他的大體量應(yīng)用,如易信,云音樂,云閱讀,考拉等。在大家耳熟能詳?shù)木W(wǎng)易互聯(lián)網(wǎng)產(chǎn)品中,幾乎都可以看到DDB的身影。
經(jīng)過10年的發(fā)展和演變,DDB的產(chǎn)品形態(tài)已全面趨于成熟,功能和性能得到了眾多產(chǎn)品的充分驗證,下面羅列一些大家比較關(guān)注的功能特性:
- 與SQL92標(biāo)準(zhǔn)的兼容度達90%以上
- 支持跨庫join和跨庫事務(wù),支持大部分標(biāo)量函數(shù)
- 支持count,sum,avg,max,concat等常用聚合函數(shù)
- 支持與MySQL高度一致的用戶管理
- 支持讀寫分離和數(shù)據(jù)節(jié)點高可用
- 支持?jǐn)?shù)據(jù)節(jié)點在線擴縮容,在線更改表分布
- 提供有完善的數(shù)據(jù)庫管理工具,WEB工具以及命令行工具
- 數(shù)據(jù)節(jié)點支持oracle和mysql
目前DDB在網(wǎng)易內(nèi)部有近50個產(chǎn)品使用,最大集群過百數(shù)據(jù)節(jié)點,大部分部署在云端,為應(yīng)用提供透明,無侵入,MySQL標(biāo)準(zhǔn)協(xié)議的分庫分表服務(wù)。
DDB演變之路
十年來,DDB經(jīng)歷了三次服務(wù)模式的重大更迭,從最早的Driver模式,到后來的Proxy模式,再到近幾年的云模式,DDB服務(wù)模式的成長也深刻反映著互聯(lián)網(wǎng)流行架構(gòu)的變遷。
Driver模式
Driver模式的特點在于應(yīng)用通過DDB提供的JDBC Driver來訪問DDB,類似與通過MySQL的JDBC驅(qū)動訪問MySQL。而對于MySQL的驅(qū)動connector/J,只需要實現(xiàn)將SQL按照特定協(xié)議編碼和轉(zhuǎn)碼即可。而DDB的驅(qū)動為了實現(xiàn)透明的分庫分表,需要做很多額外的工作,如下圖所示:
DBI Driver內(nèi)部模塊簡圖
當(dāng)DDB D]river執(zhí)行一條SQL時,會經(jīng)歷以下幾個步驟:
- 由語法解析器解析SQL,生成抽象語法樹parsed tree,并根據(jù)是否PreparedStatement決定是否進入PTC(parsed tree cache),PTC保存了SQL模式到語法樹的映射,對PreparedStatement SQL,會優(yōu)先進入PTC中查詢語法樹
- 根據(jù)語法樹和啟發(fā)式規(guī)則生成分布式執(zhí)行計劃,這個過程中會涉及到多個步驟的SQL轉(zhuǎn)換和優(yōu)化,如條件合并,join拆分,limit轉(zhuǎn)化等
- 由SQL執(zhí)行器按照執(zhí)行計劃和語法樹生成下發(fā)給每個數(shù)據(jù)節(jié)點的真實SQL,然后通過標(biāo)準(zhǔn)數(shù)據(jù)庫驅(qū)動將SQL下發(fā)給各個數(shù)據(jù)節(jié)點,這個過程為并發(fā)執(zhí)行。
- 將各個數(shù)據(jù)節(jié)點返回的結(jié)果按照執(zhí)行計劃進行合并,并返回上層。具體的合并操作可能在應(yīng)用調(diào)用結(jié)果時動態(tài)執(zhí)行。
DBI模塊作為DDB提供給應(yīng)用的JDBC 驅(qū)動,包含了完整的透明分庫分表邏輯,是DDB最為核心的組件,除此之外,DDB中還有用于元數(shù)據(jù)管理和同步的master組件,數(shù)據(jù)庫管理工具dbadmin,以及命令行工具isql,DDB的Driver模式整體架構(gòu)如下圖所示: