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