從PC客戶端開發轉項目經理已經有一段時間了,感覺還不錯,平安這邊的項目經理還需要對外,所以部門其他項目經理經常需要出差去見客戶,我專門對內,部門所有的開發和測試每天做什么、接下來做什么我都必須了解,部門所有的項目在項目經理在公司或不在公司(他們經常不在)時,我都需要去跟進及協調,也算漸漸找到管理的感覺了。
說的有點遠了,這段時間專門看了下部門Java后台的其他幾個技術棧,可以合並為一個,那就是TDDL(Taobao Distributed Data Layer,淘寶分布式數據層)。
出現背景
當代互聯網項目的數據都是海量的,當數據達到一定水平時,無法通過單個數據庫服務器來實現,然后就出現了垂直分區(分庫),根據業務不同對數據進行拆散,存儲到不同的數據庫中。但當數據繼續增加時,單個數據庫任然會因為數據量過大而導致性能下降,這時就可以采用水平分區(分表),將一個業務表拆成多個子表,比如user_table0、user_table1、user_table2,用N張表來維護同一個業務的數據。子表之間通過某種契約關聯在一起,每一張子表均按段位進行數據存儲,比如user_table0存儲1-10000的數據,而user_table1存儲10001-20000的數據,最后user_table3存儲20001-30000的數據。經過水平分區設置后的業務表,必然能夠將原本一張表維護的海量數據分配給N個子表進行存儲和維護,這樣的設計在國內一流的互聯網企業比較常見,如下圖
TDDL原型
淘寶根據自身業務需求研發了TDDL(Taobao Distributed Data Layer)框架,主要用於解決分庫分表場景下的訪問路由(持久層與數據訪問層的配合)以及異構數據庫之間的數據同步,它是一個基於集中式配置的JDBC DataSource實現,具有分庫分表、Master/Salve、動態數據源配置等功能。
TDDL其實主要可以划分為3層架構,分別是Matrix層、Group層和Atom層。
- Matrix(TDataSource)實現分庫分表邏輯,持有多個Group實例;
- Group(TGroupDataSource)實現數據庫的主備切換,讀寫分離邏輯,持有多個Atom實例;
- Atom(TAtomDataSource)實現數據庫ip,port,password,connectionProperties等信息的動態推送,持有原子的數據源(分離的Jboss數據源)。
SQL執行過程
TDDL的工作流程類似上圖,client發送一條SQL的執行語句,會優先傳遞給Matrix層。由Martix 解釋 SQL語句,優化,並根據查詢條件路由到各個group,轉發sql進行查詢,各個group根據權重選擇其中一個Atom進行查詢,各個Atom再將結果返回給Matrix,Matrix將結果合並返回給client。具體的工作流程的可以拆分成如下圖:
Matrix層會先執行以下四個過程:
a)Sql的解析。首先將Sql語句解析成一顆抽象語法樹(Abstract Syntax Tree),解析成我們比較好處理的一個結構
b)規則的匹配與計算。基於上一步創建的語法樹查找匹配的規則,再根據規則去確定分庫分表的結果。這里有一個概念就是規則,規則這里可以簡單的看做就是定義數據庫怎么進行分庫分表,要分成幾張庫幾張表,庫名和表名的命名是怎么樣的。規則的匹配就是根據SQL的語句確定,具體查詢的子表是哪幾張。
c)表名替換。對於開發人員來說,它查詢的表直接就是select * from A.B limit 10(A為數據庫名,B為數據表名)。但底層其實會把這些表名替換成類似select * from A_000.B_001,select * from A_000.B_002,select * from A_001.TABLE_001這樣的形式。表名替換就是把總表的名稱替換為這些子表的名字。
d)Sql的轉發。將上一步生成的各個sql語句轉發到對應的Group進行執行。這里如上圖,我查詢的條件是where id = 2 or 3。那么轉發給Group0的查詢為where id=3,轉發給group1的查詢為where id =2 。查詢的條件也會發生一定修改。
這樣四個步驟可以在Matrix層就實現了分庫分表的功能,對原始的Sql進行分解,將原本單庫單表的查詢語句,底層轉發到多庫多表並行的進行執行,提高了數據庫讀寫的性能。
接下來由Group執行兩個過程:
e)根據權重選擇AtomDs。通常會在主節點和副節點上讀取數據,只在主節點上寫入數據。
f)具有重試的策略地在AtomDs上執行SQL。這個可以防止單個的AtomDs發生故障,那么會進入讀重試,以確保盡可能多的數據訪問可以在正常數據庫中訪問。
然后是Atom層執行兩個過程:
g)讀寫數控制、線程並發數控制 。同時會統計線程數、執行次數等信息。
h)執行sql,返回結果集。Atom底層利用druid進行連接池的管理,具體查詢還是對JDBC做了一定封裝。執行完Sql后對將結果返回給Matrix。
最后Matrix執行最后一個過程:
i)結果集合並。Matrix將Atom層的返回的各個結果集進行合並Merge,返回給Client端。
主要特征
1.數據庫主備和動態切換
2.帶權重的讀寫分離
3.單線程讀重試
4.集中式數據源信息管理和動態變更
5.剝離的穩定jboss數據源
6.支持mysql和oracle數據庫
7.基於jdbc規范,很容易擴展支持實現jdbc規范的數據源
8.無server,client-jar形式存在,應用直連數據庫
9.讀寫次數,並發度流控,動態變更
10.可分析的日志打印,日志流控,動態變更
最后因為TDDL依賴於diamond配置管理中心,這里推薦一篇博客https://blog.csdn.net/kevinlynx/article/details/40017109