TDDL動(dòng)態(tài)數(shù)據(jù)源基本說明
總體描述
TDDL動(dòng)態(tài)數(shù)據(jù)源主要分為2層,每一層都實(shí)現(xiàn)了jdbc規(guī)范,以方便地集成到各種orm框架或者直接使用.每一層都各司其職.
整體結(jié)構(gòu)如上圖,TGroupDataSource(tddl group ds)默認(rèn)情況下依賴TAtomDataSource(tddl atom ds),但是可以擴(kuò)展依賴普通數(shù)據(jù)源.這一層主要的職責(zé)是解決讀寫分離以及主備切換的問題,當(dāng)然是在線執(zhí)行這些動(dòng)作,無需重啟.一個(gè)TGroupDataSource底下會(huì)掛多個(gè)TAtomDataSource,每個(gè)TAtomDataSource都有相對(duì)應(yīng)的讀寫權(quán)重.
TAtomDataSource(tddl atom ds)這一層并沒有實(shí)現(xiàn)真正的數(shù)據(jù)源邏輯,而是依賴了一個(gè)近似第三方的包-我們從jboss剝離出來的datasource,這一層的職責(zé)主要是將單個(gè)數(shù)據(jù)源的配置放置到diamond服務(wù)器中,實(shí)現(xiàn)數(shù)據(jù)源配置的集中管理和動(dòng)態(tài)變更.減少運(yùn)維成本. TAtomDataSource實(shí)際對(duì)應(yīng)了一個(gè)真正的數(shù)據(jù)源.
Tddl動(dòng)態(tài)數(shù)據(jù)源暫時(shí)支持mysql和oracle ,但是因?yàn)槊恳粚佣际莏dbc的實(shí)現(xiàn),所以很容易擴(kuò)展支持其他實(shí)現(xiàn)jdbc規(guī)范的數(shù)據(jù)源.
TGroupDataSource
- 基本功能
(1) 主備數(shù)據(jù)庫動(dòng)態(tài)容災(zāi)切換
支持進(jìn)行主備的對(duì)調(diào)切換,狀態(tài)對(duì)調(diào)后備庫變?yōu)橹鲙欤鲙熳優(yōu)閭鋷?/p>
(2) 相同數(shù)據(jù)分片讀寫分離
針對(duì)mysql replication機(jī)制進(jìn)行的數(shù)據(jù)主備復(fù)制,可以直接使用group datasource來支持讀寫分離。讀寫分離支持權(quán)重設(shè)置,允許對(duì)不同庫使用不同的權(quán)重。
(3) 讀重試
一臺(tái)數(shù)據(jù)庫掛掉后,如果是個(gè)fatal exception(有定義),那么會(huì)進(jìn)入讀重試,以確保盡可能多的數(shù)據(jù)訪問可以在正常數(shù)據(jù)庫中訪問。
(4) 數(shù)據(jù)庫掛掉排除,單線程重試
使用try – lock機(jī)制來進(jìn)行線程保護(hù),在第一次捕捉到fatal exception以后,只允許一個(gè)線程進(jìn)入數(shù)據(jù)庫進(jìn)行數(shù)據(jù)訪問,直到數(shù)據(jù)庫可以正常的工作為止
(5) 流量控制,數(shù)據(jù)庫保護(hù)
- 延展性功能
(1) 指定數(shù)據(jù)庫訪問(ThreadLocal)
一組對(duì)等數(shù)據(jù)庫中,寫庫一般只配置一個(gè),其余數(shù)據(jù)庫都為備庫,因?yàn)橥ㄟ^復(fù)制機(jī)制,所以主備主鍵有延遲,對(duì)于各種類型的讀(實(shí)時(shí)讀和延遲讀),可以使用GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(int dataSourceIndex)指定需要訪問的數(shù)據(jù)庫.
(2) 指定數(shù)據(jù)庫訪問(Hint)
這是指定數(shù)據(jù)庫訪問的另外一種方式. 這種方式是在sql之前加注釋,告知tddl動(dòng)態(tài)數(shù)據(jù)源該選擇第幾個(gè)數(shù)據(jù)庫.類似: /*+TDDL_GROUP({groupIndex:0})*/select * from normaltbl_0001 where pk = ? 變幻groupIndex的數(shù)字即可指定具體的第幾個(gè)庫,從0開始.
TAtomDataSource
- 基本功能
(1) 數(shù)據(jù)源配置集中管控
(2) 定期密碼變更
(3) Jboss數(shù)據(jù)源連接池的配置管理和推送
- 延展性功能
(1) 動(dòng)態(tài)創(chuàng)建,添加,減少數(shù)據(jù)源
(2) 數(shù)據(jù)庫R,W,NA狀態(tài)通知,以及讀寫訪問控制,如置為NA則數(shù)據(jù)庫所有訪問會(huì)直接拋出SQLException
(3) 數(shù)據(jù)庫保護(hù)
Diamond中配置說明.
Tddl的動(dòng)態(tài)數(shù)據(jù)源配置都放置在diamond配置中心,而一條diamond配置包括一個(gè)全局唯一的dataId和GROUP, tddl的配置數(shù)據(jù)也不例外,以下主要說明tddl動(dòng)態(tài)數(shù)據(jù)源的dataId拼寫以及每一個(gè)dataId下數(shù)據(jù)的內(nèi)容.(詳細(xì)示例請(qǐng)參考示例使用說明文檔)
- 1. TGroupDataSource的配置
Group中的配置主要是配置一組對(duì)等的數(shù)據(jù)的讀寫權(quán)重
dataId組成規(guī)范:“com.taobao.tddl.jdbc.group_V2.4.1_”+dbGroupKey
配置內(nèi)容(示例):tddl_sample_0:r10w10p0,tddl_sample_0_bac:r10w0p0
其中tddl_sample_0和tddl_sample_0_bak就是下一層需要的dbKey,后面r為讀權(quán)重,w為寫權(quán)重
- 2. TAtomDataSource的配置
atom ds中的配置分為了3部分(global,app,user),配置內(nèi)容全部為java的properties格式
Global
dataId組成規(guī)范: “com.taobao.tddl.atom.global.”+dbKey
配置內(nèi)容:
屬性key | 說明 |
ip | 數(shù)據(jù)實(shí)例的ip |
port | 數(shù)據(jù)實(shí)例的端口 |
dbname | 數(shù)據(jù)庫名稱 |
dbType | MYSQL,ORACLE |
dbStatus | RW,NA |
App
dataId組成規(guī)范: “com.taobao.tddl.atom.app.”+appName+”.”+dbKey
配置內(nèi)容:
屬性key | 說明 |
username | 該應(yīng)用使用的用戶名 |
oracleConType | oci,thin,如果db為mysql,則不用理會(huì) |
minPoolSize | 最小連接池 |
maxPoolSize | 最大連接池 |
idleTimeout | 連接的最大空閑時(shí)間 |
blockingTimeout | 等待連接的最大時(shí)間 |
preparedStatementCacheSize | Oracle專用 |
writeRestrictTimes | 單位timeSliceInMillis寫限制,默認(rèn)空不限制 |
readRestrictTimes | 單位timeSliceInMillis讀限制,默認(rèn)空不限制 |
threadCountRestrict | 并發(fā)線程限制,默認(rèn)空不限制 |
timeSliceInMillis | 限制的時(shí)間單位 |
connectionProperties | 連接參數(shù) |
User
dataId組成規(guī)范: “com.taobao.tddl.atom.passwd.”+dbName+”.”+dbType+”.”+userName
配置內(nèi)容:
屬性key | 說明 |
encPasswd | 密碼 |
encKey | 密鑰 |