閱讀336 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據庫分布式架構巧設計,水平拆分不再難

在阿裏雲生態日,袋鼠雲首席數據庫架構師趙曉宏分享了《高容量大並發數據庫服務——數據庫分布式架構設計》。他從分布式需求、拆分原則、拆分難點及解決方案、數據庫規範設計、運維相關五個方麵進行了分享。在分享中,他主要介紹了水平拆分的原則以及解決方案,分享了DRDS的架構與實踐。

 

以下內容根據直播視頻整理而成。

 

分布式需求

為什麼要做分布式?首先是因為高並發,分布式應用帶來更大量的數據庫請求;高容量,業務增長,產生大量在線數據,關係型數據庫要支持業務就要支持大數據量的存儲;資源向上擴展存在天花板,無法做到無限製的縱向擴展;支撐業務高速發展,平滑擴容。

拆分原則

051b421049878add9a7e33b37e6148ace02858ca

上圖是數據庫改造的進階。業務初期,客戶量比較少,可能在一個實例上把所有的服務、數據都能存放下來並且支持業務的發展。當客戶量和數據量變大時,數據庫很容易成為一個瓶頸,怎麼去做改造?建議先做服務化的改造,不同的業務模塊做一個垂直的梳理,不同服務的數據庫相互隔離,中間的交互由業務去實現,這樣數據庫就可以分布在不同的實例上,並且可以支持相對較高的並發和容量。再往上發展時,單實例依然是一個瓶頸,此時要考慮做一個水平的拆分,把一個服務的數據分布在不同的實例上。拆分需要循序漸進,先垂直後水平,防止過度設計,緊密結合業務及應用架構設計。

拆分難點及解決方案

水平拆分難點

首先是係統複雜度增大,係統架構設計需要徹底的重構;技術挑戰,應用需要處理複雜的分布式邏輯;穩定性挑戰;分布式的局限性,不支持跨庫join、分布式事務、全局sequence等。

解決方案:客戶端實現數據路由

825db0289a9d5aad234f3c55321eae1f3c48052d

該方案的優點是不需要引入中間件,直接在客戶端配置,程序把控力強,簡單場景方便使用。缺點是對代碼侵入性強,因為代碼端要去管理路由;配置管理複雜,如果配置錯誤,數據可能完全亂掉,修複也會比較複雜。

解決方案:數據庫中間件

b53e3666f239a0fc291edc0163b6f65b6dc52825

使用中間件可以實現自動的分庫分表,對應用透明,使用類似於單實例;使用門檻低,應用隻需要考慮分布式事務,跨庫join,而不用考慮數據的路由;方便水平擴容。使用了中間件之後,應用看到的還是單實例數據庫,不需要考慮分布式的情況,對開發來說是比較有優勢的。

水平切分原理及設計原則

3146548d78dd526e230b1d3c5226d130382ba703

數據庫拆分都是用字段hash把數據分配到不同的底層庫。選擇的原則是拆分盡量均勻並且一次查詢盡量落到單實例庫上,這樣能夠更快的返回,而且有更大的並發。那麼,中間件怎麼實現數據庫的分布式?如上圖所示,選擇了MEMBE_ID字段,將字段值做一個hash分類到不同庫中。比如發出查詢test1234的請求,就會直接轉到庫1裏。

數據訪問——SQL轉發

8d9bceb8987f9a62044ea888c33c56e115017fc2

當我們輸入一個SQL語句:select * from tb1 where member_id =‘test1234’,APP輸入請求會轉到中間件,中間件會對這條SQL語句進行解析,按照路由規則把這條請求分發到底層的數據庫,庫2還有一個請求是查詢MEMBE_ID是1234的數據。最終的查詢結果會返回DRDS層做一個聚合,速度也比較快。

DRDS

阿裏雲的DRDS是淘寶積累多年的產品。DRDS具有五大功能:分庫分表,DRDS的核心功能,支持數據的多維度切分和路由訪問;內建讀寫分離功能,可以靈活配置訪問權重;自帶全局唯一ID組件,DRDS層維護全局的sequence;小表廣播,查詢引擎識別和下推複雜查詢,兼容98% MySQL語法;彈性擴容組件實現自動化在線水平擴容。

3a759a8a5907a06c4b9f5453992cafae93016431

DRDS框架如上圖所示。網絡層完全兼容MySQL協議,可以做SQL解析、執行計劃,實現路由功能來決定SQL分配到一個庫還是多個庫。結果集處理包括排序、聚合等動作,此外還支持一些管理工作。底層依賴MySQL協議和底層物理庫通信。

8bf0dbbec7453c9d30605f8e509b9a238d5dd252

DRDS物理層框架上層是應用服務器,連接DRDS的一個集群。DRDS是集群式的,不是主備,保證了可擴展和高可用性。集群連接的是底層的MySQL。

7d19e61da0f0d6737ebfa7f2abe64d2ed5cd21ac

主庫和讀庫是使用數據庫的原生複製實現的,數據是強一致的。DRDS會自動判斷請求,然後做一個分發,事務型的操作會全部路由到一個主庫上。

f6058e129dcf175f9d276ca93b14190bfc653a70

下推join是指把join從DRDS層往下,在MySQL層實現join。所以,在業務設計上要避免跨庫join,比如有兩張表join,則必須保證有相同的拆分原則,上圖中table1和table2都是根據ID做拆分,相同的ID分配到相同的數據庫。

4da74954cf9a50cd6e24065a9080bf189d2ed590

廣播表也是避免跨庫join的一個方法。上圖中,table1已經做過拆分,table2沒有做過拆分,它是一個小表,我們可以把它的數據完全冗餘到每一個庫裏麵,那麼任何一個跟table2做join的查詢都能在一個庫去實現。最後,把結果在DRDS層做聚合。

數據庫規範設計:最佳實踐

查詢應盡可能帶上分庫條件,如果說一個表拆分到底層10個庫,每次查詢如果都帶上分庫條件的話DRDS很輕易把這個請求路由到底層庫上,如果沒有分庫條件,DRDS不知道數據到底存放在哪裏,這樣的話會分別從10個庫取數據,然後在DRDS層做聚合,網絡、計算的開銷比較大。Join有幾種解決方案:盡可能參與Join的每張表都帶上相同的分庫條件,這樣就還會限定在一個庫裏麵;分庫鍵=分庫鍵的Join;廣播表Join。單庫事務盡量限製在單庫範圍內,避免引入分布式事務。

運維相關

cc0a3c09e4ce243441cb6aa2fc97b3c18b0c3913

DRDS支持直接實例的創建、釋放以及拆分庫的創建、建表的接入。數據運維支持導入、擴容、小表複製(即小表廣播,DRDS層自己實現數據的複製)、規格升級(縱向的升級)。數據服務包括分庫分表、讀寫分離、異構索引(從不同的維度在大表中查詢,如何選擇拆分?異構索引底層也是做數據冗餘,根據不同的拆分情況做查詢)、DRDS指令。

b290b92d16b387b8fda542d0fcfc5362ff18f094

EasyDB是數據庫的自動化管理平台,支持Oracle和MySQL、Redis,能夠實現基本的監控、審計、備份、高可用、一鍵切換、資源管理。

最後更新:2017-06-16 02:06:49

  上一篇:go  中國智造進軍海外
  下一篇:go  Aliware-MQ消息隊列技術架構與最佳實踐