數據庫分布式架構巧設計,水平拆分不再難
在阿裏雲生態日,袋鼠雲首席數據庫架構師趙曉宏分享了《高容量大並發數據庫服務——數據庫分布式架構設計》。他從分布式需求、拆分原則、拆分難點及解決方案、數據庫規範設計、運維相關五個方麵進行了分享。在分享中,他主要介紹了水平拆分的原則以及解決方案,分享了DRDS的架構與實踐。
以下內容根據直播視頻整理而成。
分布式需求
為什麼要做分布式?首先是因為高並發,分布式應用帶來更大量的數據庫請求;高容量,業務增長,產生大量在線數據,關係型數據庫要支持業務就要支持大數據量的存儲;資源向上擴展存在天花板,無法做到無限製的縱向擴展;支撐業務高速發展,平滑擴容。
拆分原則
上圖是數據庫改造的進階。業務初期,客戶量比較少,可能在一個實例上把所有的服務、數據都能存放下來並且支持業務的發展。當客戶量和數據量變大時,數據庫很容易成為一個瓶頸,怎麼去做改造?建議先做服務化的改造,不同的業務模塊做一個垂直的梳理,不同服務的數據庫相互隔離,中間的交互由業務去實現,這樣數據庫就可以分布在不同的實例上,並且可以支持相對較高的並發和容量。再往上發展時,單實例依然是一個瓶頸,此時要考慮做一個水平的拆分,把一個服務的數據分布在不同的實例上。拆分需要循序漸進,先垂直後水平,防止過度設計,緊密結合業務及應用架構設計。
拆分難點及解決方案
水平拆分難點
首先是係統複雜度增大,係統架構設計需要徹底的重構;技術挑戰,應用需要處理複雜的分布式邏輯;穩定性挑戰;分布式的局限性,不支持跨庫join、分布式事務、全局sequence等。
解決方案:客戶端實現數據路由
該方案的優點是不需要引入中間件,直接在客戶端配置,程序把控力強,簡單場景方便使用。缺點是對代碼侵入性強,因為代碼端要去管理路由;配置管理複雜,如果配置錯誤,數據可能完全亂掉,修複也會比較複雜。
解決方案:數據庫中間件
使用中間件可以實現自動的分庫分表,對應用透明,使用類似於單實例;使用門檻低,應用隻需要考慮分布式事務,跨庫join,而不用考慮數據的路由;方便水平擴容。使用了中間件之後,應用看到的還是單實例數據庫,不需要考慮分布式的情況,對開發來說是比較有優勢的。
水平切分原理及設計原則
數據庫拆分都是用字段hash把數據分配到不同的底層庫。選擇的原則是拆分盡量均勻並且一次查詢盡量落到單實例庫上,這樣能夠更快的返回,而且有更大的並發。那麼,中間件怎麼實現數據庫的分布式?如上圖所示,選擇了MEMBE_ID字段,將字段值做一個hash分類到不同庫中。比如發出查詢test1234的請求,就會直接轉到庫1裏。
數據訪問——SQL轉發
當我們輸入一個SQL語句:select * from tb1 where member_id =‘test1234’,APP輸入請求會轉到中間件,中間件會對這條SQL語句進行解析,按照路由規則把這條請求分發到底層的數據庫,庫2還有一個請求是查詢MEMBE_ID是1234的數據。最終的查詢結果會返回DRDS層做一個聚合,速度也比較快。
DRDS
阿裏雲的DRDS是淘寶積累多年的產品。DRDS具有五大功能:分庫分表,DRDS的核心功能,支持數據的多維度切分和路由訪問;內建讀寫分離功能,可以靈活配置訪問權重;自帶全局唯一ID組件,DRDS層維護全局的sequence;小表廣播,查詢引擎識別和下推複雜查詢,兼容98% MySQL語法;彈性擴容組件實現自動化在線水平擴容。
DRDS框架如上圖所示。網絡層完全兼容MySQL協議,可以做SQL解析、執行計劃,實現路由功能來決定SQL分配到一個庫還是多個庫。結果集處理包括排序、聚合等動作,此外還支持一些管理工作。底層依賴MySQL協議和底層物理庫通信。
DRDS物理層框架上層是應用服務器,連接DRDS的一個集群。DRDS是集群式的,不是主備,保證了可擴展和高可用性。集群連接的是底層的MySQL。
主庫和讀庫是使用數據庫的原生複製實現的,數據是強一致的。DRDS會自動判斷請求,然後做一個分發,事務型的操作會全部路由到一個主庫上。
下推join是指把join從DRDS層往下,在MySQL層實現join。所以,在業務設計上要避免跨庫join,比如有兩張表join,則必須保證有相同的拆分原則,上圖中table1和table2都是根據ID做拆分,相同的ID分配到相同的數據庫。
廣播表也是避免跨庫join的一個方法。上圖中,table1已經做過拆分,table2沒有做過拆分,它是一個小表,我們可以把它的數據完全冗餘到每一個庫裏麵,那麼任何一個跟table2做join的查詢都能在一個庫去實現。最後,把結果在DRDS層做聚合。
數據庫規範設計:最佳實踐
查詢應盡可能帶上分庫條件,如果說一個表拆分到底層10個庫,每次查詢如果都帶上分庫條件的話DRDS很輕易把這個請求路由到底層庫上,如果沒有分庫條件,DRDS不知道數據到底存放在哪裏,這樣的話會分別從10個庫取數據,然後在DRDS層做聚合,網絡、計算的開銷比較大。Join有幾種解決方案:盡可能參與Join的每張表都帶上相同的分庫條件,這樣就還會限定在一個庫裏麵;分庫鍵=分庫鍵的Join;廣播表Join。單庫事務盡量限製在單庫範圍內,避免引入分布式事務。
運維相關
DRDS支持直接實例的創建、釋放以及拆分庫的創建、建表的接入。數據運維支持導入、擴容、小表複製(即小表廣播,DRDS層自己實現數據的複製)、規格升級(縱向的升級)。數據服務包括分庫分表、讀寫分離、異構索引(從不同的維度在大表中查詢,如何選擇拆分?異構索引底層也是做數據冗餘,根據不同的拆分情況做查詢)、DRDS指令。
最後更新:2017-06-16 02:06:49
上一篇:
中國智造進軍海外
下一篇:
Aliware-MQ消息隊列技術架構與最佳實踐
關於CountDownLatch類Demo代碼
如何解決EnterLib異常處理框架最大的局限——基於異常"類型"的異常處理策略
使用 badIPs.com 保護你的服務器,並通過 Fail2ban 報告惡意 IP
今夜貓晚秀的這些黑科技,將顛覆傳統娛樂行業
RTP 協議
Updating Maven Project". Unsupported IClasspathEntry kind=4錯誤解
雲棲大會馬雲與李健合唱《傳奇》,網友:說的比唱的好聽
geohash vs PostGIS
護航企業成長每一步,阿裏雲適應性網絡初體驗
Android[第三方or官方]高質量實用【組件&開源項目&框架】集合貼