阿里P8架構(gòu)師談:數(shù)據(jù)庫(kù)中間件的功能、適用場(chǎng)景、淘寶TDDL詳解
什么需要數(shù)據(jù)庫(kù)中間件
傳統(tǒng)的架構(gòu)模式就是應(yīng)用連接數(shù)據(jù)庫(kù)直接對(duì)數(shù)據(jù)進(jìn)行訪問(wèn),這種架構(gòu)特點(diǎn)就是簡(jiǎn)單方便。
但是隨著目前數(shù)據(jù)量不斷的增大我們就遇到了問(wèn)題:
- 單個(gè)表數(shù)據(jù)量太大
- 單個(gè)庫(kù)數(shù)據(jù)量太大
- 單臺(tái)數(shù)據(jù)量服務(wù)器壓力很大
- 讀寫(xiě)速度遇到瓶頸
當(dāng)面臨以上問(wèn)題時(shí),我們會(huì)想到的第一種解決方式就是 向上擴(kuò)展(scale up) 簡(jiǎn)單來(lái)說(shuō)就是不斷增加硬件性能。這種方式只能暫時(shí)解決問(wèn)題,當(dāng)業(yè)務(wù)量不斷增長(zhǎng)時(shí)還是解決不了問(wèn)題。特別是淘寶,facebook,youtube這種業(yè)務(wù)成線性,甚至指數(shù)級(jí)上升的情況。
此時(shí)我們不得不依賴于第二種方式: 水平擴(kuò)展 ,除了增加應(yīng)用服務(wù)器外,還會(huì)涉及到數(shù)據(jù)庫(kù)的垂直以及分庫(kù)分表,數(shù)據(jù)庫(kù)讀寫(xiě)分離等,這個(gè)時(shí)候就需要用到數(shù)據(jù)庫(kù)中間件。
數(shù)據(jù)庫(kù)中間件的功能
1.通用的數(shù)據(jù)庫(kù)中間件會(huì)支持多種數(shù)據(jù)庫(kù)的協(xié)議。
連接數(shù)據(jù)庫(kù)中間件用的是標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)協(xié)議如jdbc,而數(shù)據(jù)庫(kù)中間件在與各種數(shù)據(jù)庫(kù)通訊時(shí)用的是各數(shù)據(jù)庫(kù)的協(xié)議。這樣在應(yīng)用程序中就可以透明化的使用數(shù)據(jù)庫(kù),減少開(kāi)發(fā)成本,與適配數(shù)據(jù)庫(kù)所帶來(lái)開(kāi)發(fā)成本,如圖:
2.讀寫(xiě)分離:讀、寫(xiě)分離的原理是將事務(wù)型操作(增、刪、改)與非事務(wù)弄操作(讀)分發(fā)到不同數(shù)據(jù)庫(kù)實(shí)例上去執(zhí)行。數(shù)據(jù)庫(kù)實(shí)例之間要進(jìn)行數(shù)據(jù)的主、從同步,往往寫(xiě)數(shù)據(jù)庫(kù)實(shí)例為主數(shù)據(jù)庫(kù);讀數(shù)據(jù)庫(kù)實(shí)例為從數(shù)據(jù)庫(kù)。如下圖所示:
上面的圖可以看出,黃線代表寫(xiě)請(qǐng)求,綠線代表讀請(qǐng)求,藍(lán)色數(shù)據(jù)同步,這就是一個(gè)簡(jiǎn)單的讀寫(xiě)分離。
3. 分庫(kù)分表:分庫(kù)、分表是為了將不同的業(yè)務(wù)數(shù)據(jù)存儲(chǔ)于不同數(shù)據(jù)庫(kù)實(shí)例上,從而達(dá)到減少數(shù)據(jù)庫(kù)實(shí)例表的基礎(chǔ)數(shù)據(jù)量和業(yè)務(wù)的分布式處理。
上面這幅圖就可以看出數(shù)據(jù)庫(kù)中間件作用,比如下面的這個(gè)SQL:
- select from table_name where id = 1
按照中間件分庫(kù)分表算法,此SQL將發(fā)送到DB1節(jié)點(diǎn),由DB1這個(gè)MySQL負(fù)責(zé)解析和獲取id=1的數(shù)據(jù),并通過(guò)中間件返回給客戶端。
MySQL主流中間件:Atlas,cobar,TDDL等
目前市面上中間件種類很多種 :
Cobar:
阿里巴巴B2B開(kāi)發(fā)的關(guān)系型分布式系統(tǒng),管理將近3000個(gè)MySQL實(shí)例。 在阿里經(jīng)受住了考驗(yàn),后面由于作者的走開(kāi)的原因cobar沒(méi)有人維護(hù) 了,阿里也開(kāi)發(fā)了tddl替代cobar。
MyCAT:
社區(qū)愛(ài)好者在阿里cobar基礎(chǔ)上進(jìn)行二次開(kāi)發(fā),解決了cobar當(dāng)時(shí)存 在的一些問(wèn)題,并且加入了許多新的功能在其中。目前MyCAT社區(qū)活 躍度很高,目前已經(jīng)有一些公司在使用MyCAT。總體來(lái)說(shuō)支持度比 較高,也會(huì)一直維護(hù)下去,
Atlas:
360團(tuán)隊(duì)基于mysql proxy 把lua用C改寫(xiě)。原有版本是支持分表, 目前已經(jīng)放出了分庫(kù)分表版本。在網(wǎng)上看到一些朋友經(jīng)常說(shuō)在高并 發(fā)下會(huì)經(jīng)常掛掉,如果大家要使用需要提前做好測(cè)試。
淘寶TDDL
淘寶根據(jù)自己的業(yè)務(wù)特點(diǎn)開(kāi)發(fā)了TDDL(Taobao Distributed Data Layer 框架,主要解決了分庫(kù)分表對(duì)應(yīng)用的透明化以及異構(gòu)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)復(fù)制,它是一個(gè)基于集中式配置的 jdbc datasource實(shí)現(xiàn),具有主備,讀寫(xiě)分離,動(dòng)態(tài)數(shù)據(jù)庫(kù)配置等功能。
TDDL所處的位置(tddl通用數(shù)據(jù)訪問(wèn)層,部署在客戶端的jar包,用于將用戶的SQL路由到指定的數(shù)據(jù)庫(kù)中):
淘寶很早就對(duì)數(shù)據(jù)進(jìn)行過(guò)分庫(kù)的處理, 上層系統(tǒng)連接多個(gè)數(shù)據(jù)庫(kù),中間有一個(gè)叫做DBRoute的路由來(lái)對(duì)數(shù)據(jù)進(jìn)行統(tǒng)一訪問(wèn)。DBRoute對(duì)數(shù)據(jù)進(jìn)行多庫(kù)的操作、數(shù)據(jù)的整合,讓上層系統(tǒng)像操作一個(gè)數(shù)據(jù)庫(kù)一樣操作多個(gè)庫(kù)。
下圖展示了一個(gè)簡(jiǎn)單的分庫(kù)分表數(shù)據(jù)查詢策略:
主要優(yōu)點(diǎn):
1.數(shù)據(jù)庫(kù)主備和動(dòng)態(tài)切換
2.帶權(quán)重的讀寫(xiě)分離
3.單線程讀重試
4.集中式數(shù)據(jù)源信息管理和動(dòng)態(tài)變更
5.剝離的穩(wěn)定jboss數(shù)據(jù)源
6.支持mysql和oracle數(shù)據(jù)庫(kù)
7.基于jdbc規(guī)范,很容易擴(kuò)展支持實(shí)現(xiàn)jdbc規(guī)范的數(shù)據(jù)源
8.無(wú)server,client-jar形式存在,應(yīng)用直連數(shù)據(jù)庫(kù)
9.讀寫(xiě)次數(shù),并發(fā)度流程控制,動(dòng)態(tài)變更
10.可分析的日志打印,日志流控,動(dòng)態(tài)變更