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