分表

分庫分表在項目中只是用到了分表。。。html

前序mysql


1、中間件TDDL

TDDL(Taobao Distributed Data Layer)框架,主要用於解決分庫分表場景下的訪問路由(持久層與數據訪問層的配合)以及異構數據庫之間的數據同步,它是一個基於集中式配置的JDBC DataSource實現,具備分庫分表、Master/Salve、動態數據源配置等功能。
算法


TDDL的體系架構:TDDL其實主要能夠劃分爲3層架構,分別是Matrix層、Group層和Atom層。Matrix層用於實現分庫分表邏輯,底層持有多個Group實例。而Group層和Atom共同組成了動態數據源,Group層實現了數據庫的Master/Salve模式的寫分離邏輯,底層持有多個Atom實例。最後Atom層(TAtomDataSource)實現數據庫ip,port,password,connectionProperties 等信息的動態推送,以及持有原子的數據源分離的JBOSS數據源)。
sql



2、TDDL層次結構


tddl是JDBC或者持久框架層與底層JDBC驅動交互的橋樑,或者也能夠稱之爲中轉站數據庫

一、matrix層 :Matrix 分庫分表。包括SQL解釋、優化和執行等

分庫分錶帶來的最直接的影響是數據訪問的路由。
路由算法有如下幾種:a)固定哈希算法 b)一致性哈希算法 c)虛擬節點
  • 核心是規則引擎架構

  • 實現分庫分表併發

  • 主要路徑:sql解析 => 規則引擎計算(路由):轉發 => 執行 => 合併結果oracle

二、group層 :Group 層是通過讀寫分離和主備切換纔會出現最底層

  • 讀寫分離框架

  • 權重計算性能

  • 寫HA切換

  • 讀HA切換

  • 動態新增slave(atom)節點

三、atom層 :Atom 模塊真正和物理數據庫交互,提供數據庫配置動態修改能力

Atom 層,它面對的是實實在在的每個數據庫,更多的工做在與對數據庫的鏈接管理,好比說當數據庫的 IP 地址發生改變時,Atom 層要動態感知,以避免鏈接找不到地址。
  • 單個數據庫的抽象;

  • ip /port /user /passwd /connection 動態修改,動態化jboss數據源

  • thread count(線程計數):try catch模式,保護業務處理線程

  • 動態阻止某些sql的執行

  • 執行次數的統計和限制



3、整個執行過程

1、執行流程


2、TDDL的工做流程相似上圖,client發送一條SQL的執行語句,會優先傳遞給Matrix層。由Martix 解釋 SQL語句,優化,並根據查詢條件路由到各個group,轉發sql進行查詢,各個group根據權重選擇其中一個Atom進行查詢,各個Atom再將結果返回給Matrix,Matrix將結果合併返回給client。

具體的工做流程的能夠拆分紅以下圖:


整個SQL執行過程

  • BEGIN(sql+args),輸入是sql和參數

  • sql解析

  • 規則計算

  • 表名替換

  • 選擇groupDS執行sql

  • 根據權重選擇atomDS

  • 具有重試策略的在atomDS執行sql

  • 讀寫控制,併發控制,執行sql,返回結果

  • 合併結果集

  • END(ResultSet),輸出是結果集

3、

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端。

2)路由與擴容(固定哈希算法爲例)

a)數據庫水平拆分路由


四,TDDL其餘特性

  • 支持oracle和mysql

  • 支持主備動態切換

  • 支持帶權重的讀寫分離

  • 支持分庫分表

  • 支持主鍵生成:oracle用sequence來生成,mysql則須要創建一個用於生成id的表

  • 支持單庫事務,不支持誇庫事務

  • 支持多庫多表分頁查詢,但會隨着翻頁,性能下降

相關文章
相關標籤/搜索