一,TDDL是什么
-
Taobao Distributed Data Layer,即淘寶分布式數(shù)據(jù)層,簡(jiǎn)稱TDDL 。它是一套分布式數(shù)據(jù)訪問(wèn)引擎
-
淘寶一個(gè)基于客戶端的數(shù)據(jù)庫(kù)中間件產(chǎn)品
-
基于JDBC規(guī)范,沒(méi)有server,以client-jar的形式存在
TDDL是一套分布式數(shù)據(jù)訪問(wèn)引擎,主要解決三個(gè)問(wèn)題:
- 數(shù)據(jù)訪問(wèn)路由,將數(shù)據(jù)的讀寫請(qǐng)求發(fā)送到最合適的地方;
- 數(shù)據(jù)的多向非對(duì)稱復(fù)制,一次寫入,多點(diǎn)讀?。?
- 數(shù)據(jù)存儲(chǔ)的自由擴(kuò)展,不再受限于單臺(tái)機(jī)器的容量瓶頸與速度瓶頸,平滑遷移。它遵守JDBC規(guī)范,支持mysql和oracle,具有分庫(kù)分表、主備切換、讀寫分離、動(dòng)態(tài)數(shù)據(jù)源配置等功能。
三層架構(gòu)(可獨(dú)立使用):
- Matrix(TDataSource)實(shí)現(xiàn)分庫(kù)分表邏輯,持有多個(gè)Group實(shí)例;
- Group(TGroupDataSource)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的主備切換,讀寫分離邏輯,持有多個(gè)Atom實(shí)例;
- Atom(TAtomDataSource)實(shí)現(xiàn)數(shù)據(jù)庫(kù)ip,port,password,connectionProperties等信息的動(dòng)態(tài)推送,持有原子的數(shù)據(jù)源(分離的Jboss數(shù)據(jù)源)。
其它結(jié)構(gòu)
- tddl-client:應(yīng)用啟動(dòng)時(shí)初始化配置信息(規(guī)則信息,各層數(shù)據(jù)源拓?fù)浣Y(jié)構(gòu),初始化是自上而下的Matrix的dsMap,Group的GroupDs,AtomDs),runtime
- tddl-rule:分庫(kù)分表規(guī)則解析
- tddl-sequence:統(tǒng)一管理和分配全局唯一sequence(序列號(hào))
- tddl-druid-datasource:數(shù)據(jù)庫(kù)連接池(高效,可擴(kuò)展性好),類dbcp、c3p0
二,TDDL不支持什么SQL
畫外音:分布式數(shù)據(jù)庫(kù)中間件,join都是很難支持的,cobar號(hào)稱的對(duì)join的支持即有限,又低效。
三,TDDL支持什么SQL
-
支持CURD基本語(yǔ)法
-
支持as
-
支持表名限定,即"table_name.column"
-
支持like/not like
-
支持limit,即mysql的分頁(yè)語(yǔ)法
-
支持in
-
支持嵌套查詢,由于不支持多表,只支持單表的嵌套查詢
畫外音:分布式數(shù)據(jù)庫(kù)中間件,支持的語(yǔ)法都很有限,但對(duì)于與聯(lián)網(wǎng)的大數(shù)據(jù)/高并發(fā)應(yīng)用,足夠了,服務(wù)層應(yīng)該做更多的事情。
四,TDDL其他特性
-
支持oracle和mysql
-
支持主備動(dòng)態(tài)切換
-
支持帶權(quán)重的讀寫分離
-
支持分庫(kù)分表
-
支持主鍵生成:oracle用sequence來(lái)生成,mysql則需要建立一個(gè)用于生成id的表
-
支持單庫(kù)事務(wù),不支持跨庫(kù)事務(wù)
-
支持多庫(kù)多表分頁(yè)查詢,但會(huì)隨著翻頁(yè),性能降低
畫外音:可以看到,其實(shí)TDDL很多東西都不支持,那么為什么它還如此流行呢?它解決的根本痛點(diǎn)是“分布式”“分庫(kù)分表”等。
加入了解決“分布式”“分庫(kù)分表”的中間件后,SQL功能必然受限,但是,我們應(yīng)該考慮到:MYSQL的CPU和MEM都是非常珍貴的,我們應(yīng)該將MYSQL從復(fù)雜的計(jì)算(事務(wù),JOIN,自查詢,存儲(chǔ)過(guò)程,視圖,用戶自定義函數(shù),,,)中釋放解脫出來(lái),將這些計(jì)算遷移到服務(wù)層。
當(dāng)然,有些后臺(tái)系統(tǒng)或者支撐系統(tǒng),數(shù)據(jù)量小或者請(qǐng)求量小,沒(méi)有“分布式”的需求,為了簡(jiǎn)化業(yè)務(wù)邏輯,寫了一些復(fù)雜的SQL語(yǔ)句,利用了MYSQL的功能,這類系統(tǒng)并不是分布式數(shù)據(jù)庫(kù)中間件的潛在用戶,也不可能強(qiáng)行讓這些系統(tǒng)放棄便利,使用中間件。
五,TDDL層次結(jié)構(gòu)
TDDL是一個(gè)客戶端jar,它的結(jié)構(gòu)分為三層:
層次
|
說(shuō)明
|
其他
|
matrix
|
可以理解為數(shù)據(jù)源的全部,它由多個(gè)group組成
|
|
group
|
可以理解為一個(gè)分組,它由多個(gè)atom組成
|
|
atom
|
可以理解為一個(gè)數(shù)據(jù)庫(kù),可能是讀庫(kù),也可能是寫庫(kù)
|
|
matrix層
group層
atom層
-
單個(gè)數(shù)據(jù)庫(kù)的抽象;
-
ip /port /user /passwd /connection 動(dòng)態(tài)修改,動(dòng)態(tài)化jboss數(shù)據(jù)源
-
thread count(線程計(jì)數(shù)):try catch模式,保護(hù)業(yè)務(wù)處理線程
-
動(dòng)態(tài)阻止某些sql的執(zhí)行
-
執(zhí)行次數(shù)的統(tǒng)計(jì)和限制
整個(gè)SQL執(zhí)行過(guò)程
六,TDDL最佳實(shí)踐
-
盡可能使用1對(duì)多規(guī)則中的1進(jìn)行數(shù)據(jù)切分(patition key),例如“用戶”就是一個(gè)簡(jiǎn)單好用的緯度
-
買家賣家的多對(duì)多問(wèn)題,使用數(shù)據(jù)增量復(fù)制的方式冗余數(shù)據(jù),進(jìn)行查詢
-
利用表結(jié)構(gòu)的冗余,減少走網(wǎng)絡(luò)的次數(shù),買家賣家都存儲(chǔ)全部的數(shù)據(jù)
畫外音:這里我展開(kāi)一下這個(gè)使用場(chǎng)景。
以電商的買家賣家為例,業(yè)務(wù)方既有基于買家的查詢需求,又有基于賣家的查詢需求,但通常只能以一個(gè)緯度進(jìn)行數(shù)據(jù)的分庫(kù)(patition),假設(shè)以買家分庫(kù), 那賣家的查詢需求如何實(shí)現(xiàn)呢?
如上圖所示:查詢買家所有買到的訂單及商品可以直接定位到某一個(gè)分庫(kù),但要查詢賣家所有賣出的商品,業(yè)務(wù)方就必須遍歷所有的買家?guī)欤缓髮?duì)結(jié)果集進(jìn)行合并,才能滿足需求。
所謂的“數(shù)據(jù)增量復(fù)制”“表結(jié)構(gòu)冗余”“減少網(wǎng)絡(luò)次數(shù)”,是指所有的數(shù)據(jù)以買家賣家兩個(gè)緯度冗余存儲(chǔ)兩份,如下圖:
采用一個(gè)異步的消息隊(duì)列機(jī)制,將數(shù)據(jù)以另一個(gè)緯度增量復(fù)制一份,在查詢的時(shí)候,可以直接以賣家直接定位到相應(yīng)的分庫(kù)。
這種方式有潛在的數(shù)據(jù)不一致問(wèn)題。
繼續(xù)tddl最佳實(shí)踐:
-
利用單機(jī)資源:?jiǎn)螜C(jī)事務(wù),單機(jī)join
-
存儲(chǔ)模型盡量做到以下幾點(diǎn):
- 盡可能走內(nèi)存
- 盡可能將業(yè)務(wù)要查詢的數(shù)據(jù)物理上放在一起
- 通過(guò)數(shù)據(jù)冗余,減少網(wǎng)絡(luò)次數(shù)
- 合理并行,提升響應(yīng)時(shí)間
- 讀瓶頸通過(guò)增加slave(atom)解決
- 寫瓶頸通過(guò)切分+路由解決
畫外音:相比數(shù)據(jù)庫(kù)中間件內(nèi)核,最佳實(shí)踐與存儲(chǔ)模型,對(duì)我們有更大的借鑒意義。
七、TDDL的未來(lái)?
-
kv是一切數(shù)據(jù)存取最基本的組成部分
-
存儲(chǔ)節(jié)點(diǎn)少做一點(diǎn),業(yè)務(wù)代碼就要多做一點(diǎn)
-
想提升查詢速度,只有冗余數(shù)據(jù)一條路可走
-
類結(jié)構(gòu)化查詢語(yǔ)言,對(duì)查詢來(lái)說(shuō)非常方便
畫外音:潛臺(tái)詞是,在大數(shù)據(jù)量高并發(fā)下,SQL不是大勢(shì)所趨,no-sql和定制化的協(xié)議+存儲(chǔ)才是未來(lái)方向?
|