資料庫中介軟體TDDL調研筆記
轉自:https://mp.weixin.qq.com/s/dVGSvUR9UCA-dIYVtr_G_w 架構師之路
前篇:
13年底負責資料庫中介軟體設計時的調研筆記,拿出來和大家分享,輕拍。
一,TDDL是什麼
-
TDDL是Taobao Distribute Data Layer的簡稱
-
淘寶一個基於客戶端的資料庫中介軟體產品
-
基於JDBC規範,沒有server,以client-jar的形式存在
畫外音:資料庫中介軟體有基於服務端的,也有基於客戶端的,TDDL屬於後者;而cobar是一箇中間層服務,使用mysql協議,屬於前者。
二,TDDL不支援什麼SQL
-
不支援各類join
-
不支援多表查詢
-
不支援between/and
-
不支援not(除了支援not like)
-
不支援comment,即註釋
-
不支援for update
-
不支援group by中having後面出現集函式
-
不支援force index
-
不支援mysql獨有的大部分函式
畫外音:分散式資料庫中介軟體,join都是很難支援的,cobar號稱的對join的支援即有限,又低效。
三,TDDL支援什麼SQL
-
支援CURD基本語法
-
支援as
-
支援表名限定,即"table_name.column"
-
支援like/not like
-
支援limit,即mysql的分頁語法
-
支援in
-
支援巢狀查詢,由於不支援多表,只支援單表的巢狀查詢
畫外音:分散式資料庫中介軟體,支援的語法都很有限,但對於與聯網的大資料/高併發應用,足夠了,服務層應該做更多的事情。
四,TDDL其他特性
-
支援oracle和mysql
-
支援主備動態切換
-
支援帶權重的讀寫分離
-
支援分庫分表
-
支援主鍵生成:oracle用sequence來生成,mysql則需要建立一個用於生成id的表
-
支援單庫事務,不支援誇庫事務
-
支援多庫多表分頁查詢,但會隨著翻頁,效能降低
畫外音:可以看到,其實TDDL很多東西都不支援,那麼為什麼它還如此流行呢?它解決的根本痛點是“分散式”“分庫分表”等。
加入瞭解決“分散式”“分庫分表”的中介軟體後,SQL功能必然受限,但是,我們應該考慮到:MYSQL的CPU和MEM都是非常珍貴的,我們應該將MYSQL從複雜的計算(事務,JOIN,自查詢,儲存過程,檢視,使用者自定義函式,,,)中釋放解脫出來,將這些計算遷移到服務層。
當然,有些後臺系統或者支撐系統,資料量小或者請求量小,沒有“分散式”的需求,為了簡化業務邏輯,寫了一些複雜的SQL語句,利用了MYSQL的功能,這類系統並不是分散式資料庫中介軟體的潛在使用者,也不可能強行讓這些系統放棄便利,使用中介軟體。
五,TDDL層次結構
對應上面圖例:matrix資料水平分為了兩個group,每個group有主備atom組成。
matrix層
-
核心是規則引擎
-
實現分庫分表
-
主要路徑:sql解析 => 規則引擎計算(路由) => 執行 => 合併結果
group層
-
讀寫分離
-
權重計算
-
寫HA切換
-
讀HA切換
-
動態新增slave(atom)節點
atom層
-
單個數據庫的抽象;
-
ip /port /user /passwd /connection 動態修改,動態化jboss資料來源
-
thread count(執行緒計數):try catch模式,保護業務處理執行緒
-
動態阻止某些sql的執行
-
執行次數的統計和限制
整個SQL執行過程
-
BEGIN(sql+args),輸入是sql和引數
-
sql解析
-
規則計算
-
表名替換
-
選擇groupDS執行sql
-
根據權重選擇atomDS
-
具備重試策略的在atomDS執行sql
-
讀寫控制,併發控制,執行sql,返回結果
-
合併結果集
-
END(ResultSet),輸出是結果集
畫外音:感覺難點在SQL的解析上。
六,TDDL最佳實踐
-
儘可能使用1對多規則中的1進行資料切分(patition key),例如“使用者”就是一個簡單好用的緯度
-
買家賣家的多對多問題,使用資料增量複製的方式冗餘資料,進行查詢
-
利用表結構的冗餘,減少走網路的次數,買家賣家都儲存全部的資料
畫外音:這裡我展開一下這個使用場景。
以電商的買家賣家為例,業務方既有基於買家的查詢需求,又有基於賣家的查詢需求,但通常只能以一個緯度進行資料的分庫(patition),假設以買家分庫, 那賣家的查詢需求如何實現呢?
如上圖所示:查詢買家所有買到的訂單及商品可以直接定位到某一個分庫,但要查詢賣家所有賣出的商品,業務方就必須遍歷所有的買家庫,然後對結果集進行合併,才能滿足需求。
所謂的“資料增量複製”“表結構冗餘”“減少網路次數”,是指所有的資料以買家賣家兩個緯度冗餘儲存兩份,如下圖:
採用一個非同步的訊息佇列機制,將資料以另一個緯度增量複製一份,在查詢的時候,可以直接以賣家直接定位到相應的分庫。
這種方式有潛在的資料不一致問題。
繼續tddl最佳實踐:
-
利用單機資源:單機事務,單機join
-
儲存模型儘量做到以下幾點:
- 儘可能走記憶體
- 儘可能將業務要查詢的資料物理上放在一起
- 通過資料冗餘,減少網路次數
- 合理並行,提升響應時間
- 讀瓶頸通過增加slave(atom)解決
- 寫瓶頸通過切分+路由解決
畫外音:相比資料庫中介軟體核心,最佳實踐與儲存模型,對我們有更大的借鑑意義。
七、TDDL的未來?
-
kv是一切資料存取最基本的組成部分
-
儲存節點少做一點,業務程式碼就要多做一點
-
想提升查詢速度,只有冗餘資料一條路可走
-
類結構化查詢語言,對查詢來說非常方便
畫外音:潛臺詞是,在大資料量高併發下,SQL不是大勢所趨,no-sql和定製化的協議+儲存才是未來方向?
13年底的調研筆記,文中的“畫外音”是我當時的批註,希望能讓大家對TDDL能有一個初步的認識,有疑問之處,歡迎交流。
相關文章: