十一选五在线缩水网页:Zdal分庫分表:支付寶是如何在分布式環境下完爆數據庫壓力的?

2018-02-28 17:06:13 ortotra 83

陕陕西福彩快乐十分开奖结果 www.zocum.com Zdal是支付寶自主研發的數據中間件產品,采用標準的JDBC規范,可以在分布式環境下看上去像傳統數據庫一樣提供海量數據服務,是一種通用的分庫分表數據庫訪問框架,解決單庫單表數據庫訪問壓力,Zdal主要提供分庫分表,結果集合并,sql解析,數據庫failover動態切換等功能,提供互聯網金融行業的數據訪問層統一解決方案,目前已經在支付寶的交易,支付,會員,金融等大部分關鍵應用上使用,并且在2013年雙11大促中運行穩定。


▲系統目標

1.數據訪問路由,將針對數據的讀寫請求發送到最合適的地方。

2.數據存儲的自由擴展,不再受限于單臺機器的容量瓶頸和速度瓶頸,平滑遷移。

3.使用zdal組件進行數據庫的拆分,搭建分布式環境下的海量數據訪問平臺。

4.實現mysql,oracle,DB2數據庫訪問能力。


【系統架構和領域模型】

▲系統整體架構



zdal組件主要有5部分組成:

1. Zdal-client:開發編程接口,實現jdbc的Datasource,Connection,Statement,PreparedStatement,ResultSet等接口,實現通用的jdbc-sql訪問,內部還實現讀庫重試,group數據源的選擇器,表名替換,sql執行器等功能。

2. Zdal-parser:支持oracle/mysql/db2等數據庫的sql語句解析,并且緩存。根據規則引擎提供的參數列表,在指定的sql中查找到需要的參數,然后返回拆分字段。

3. Zdal-rule:根據zdal-parser解析后的拆分字段值來確定邏輯庫和物理表名。

4. Zdal-datasource:數據庫連接的管理,支持mysql,oracle,db2數據庫的連接管理。

5. Zdal-common:zdal組件所使用的一些公共組件類。


總體流程



▲Zdal初始化流程


▲分庫分表初始化流程


▲分庫分表sql執行流程



【關鍵技術&第三方框架】

Zdal-client

Zdal-client ??櫓饕峭瓿梢韻錄覆糠止ぷ鰨?/p>

1.加載配置文件進行初始化工作,初始化groovy規則引擎。

2.對jdbc 標準接口的封裝,包括 DataSource、Connection、Statement、PrepareStatment等,并提供一個一對多的管理容器,可以管理多個jdbc建立的資源。

3.SQL執行:根據規則引擎生成的目標庫id和表名,進行表名替換后在目標庫上執行該sql,如果是跨庫跨表的sql,需要進行多個結果集的merge。

4.讀庫重試,即在讀庫發生斷連接問題的時候,Zdal會自動的嘗試從對等的其他讀庫中去查詢這條數據,盡最大努力保證在數據庫還有訪問能力的情況下,保證數據的可訪問性。

5.將傳入的sql 和 參數進行包裝后,調用 zdal-parser 和zdal-rule的 相關接口,進行sql的解析以及計算相應的分庫分表結果。在此??榻崾迪直礱婊壞墓δ?,即將sql的邏輯表名替換成帶后綴的物理表名。

6.動態指定讀庫功能,即可以讓業務根據實際需求指定一組中的某個讀庫進行操作,也可以指定到寫庫讀。

7.聚合函數結果集合并,針對count,sum,max,min等聚合函數在多個數據源的執行結果,進行結果集的合并。



▲Zdal-parser

Parser組件包括如下幾個部分:

1. Lexer 詞法解析。

2.Parser,Parser包括ExprParser,各種StatementParser。

3. AST, Abstract Syntax TreeParse出來的結果就是AST。

4.StatementParser:解析各種sql語句,按照詞法分析和語法分析提煉sql的關鍵字。

5.Visitor:根據StatementParser的解析結果對AST做各種處理,比如FormatOutput,遍歷,tableName,表達式,函數,綁定參數,分頁參數,獲取sql解析的結果。


Zdal-Parser的主要核心類圖如下:


▲Zdal-rule

Zdal-rule 主要是完成規則的計算,包括分庫的計算和分表的計算,相當于是一個二次路由的過程,包括單庫單表、單庫多表以及多庫多表等幾種情況。為了適應規則的靈活配置,目前主要是采用書寫groovy腳本的方式來配置規則,或者在代碼里封裝拆分規則靜態方法,在規則里調用該靜態方法即可。


我們假設分庫規則是 user_id % 9  /  3 分表規則是user_id % 9 % 3