如何實現高容量大併發數據庫服務

軟件 MySQL 雲計算 廣播 雲棲社區 2017-05-06

更多深度文章,請關注雲計算頻道:https://yq.aliyun.com/cloud

在2017運維俠客行·杭州站上,主辦方優雲軟件特意邀請了來自袋鼠雲的首席數據庫架構師宏翊給大家帶來了如何實現高容量大併發數據庫服務。為什麼數據庫需要做分佈式架構設計?在對數據庫進行拆分設計和實施時,會遇到哪些坑?又該如何避免踩坑?一起來了解下吧。

如何實現高容量大併發數據庫服務

▍摘要

數據庫拆分要根據業務現狀、模式,選擇合適的拆分方式,緊密結合業務及應用架構設計,謹慎拆分,防止過度設計。

▍正文

一 為什麼要做分佈式數據庫架構改造?

雲計算大數據時代,傳統的數據庫架構已經無法支撐企業高容量的數據增長,滿足高併發的業務需求。對企業數據庫進行分佈式架構設計,打破了數據庫資源不夠用的天花板的同時,還能根據企業業務發展狀況,隨時平滑擴容。

二 分佈式數據庫架構改造,如何做?

數據庫分佈式改造要遵循“循序漸進”的拆分原則

拆分方式有垂直拆分和水平拆分兩種,選擇拆分方式要根據企業自身業務發展需要。

如何實現高容量大併發數據庫服務

一般來說,是先做垂直拆分,再做水平拆分。

在單一數據節點無法滿足業務和用戶增長需求的情況下,需要做一個服務化,對業務進行垂直梳理,後面的數據節點可以放在不同的資源節點上,以提高數據服務的整體性能。

比如一個APP的業務數據,在業務初期階段,是全部放在一個數據庫節點中,在業務量和數據量快速增長的中期階段,需要進行垂直梳理,根據業務邏輯,拆分成商品、交易、用戶,並分別放在不同的數據庫。

如果其中的一個服務已經拆的很細了,但還是有性能瓶頸,無法支撐我們的業務增長,數據庫這塊才需要再做水平拆分。

水平拆分就是將數據(比如圖中APP的交易數據)拆成多片,放到不同的資源上,用一個集群來支撐更高的業務增長。

在拆分時,要謹慎,因為拆分會引入複雜性,能不做就不做,最優先是做業務和架構上的優化,最終才是做數據庫拆分。

在拆分的過程中,不要做過度的設計,或者直接從初級跳到高級,這樣做其實非常浪費資源,投入產出比也不好。

三 水平拆分的難點及解決方案

對企業數據庫進行分佈式改造,需要理解客戶的業務邏輯、豐富的拆分經驗積累。尤其是水平拆分,有系統複雜度高、技術挑戰性強、穩定性控制難、具有一定侷限性四大難點。

針對這些問題,宏翊給我們提供了兩種解決方案。

1.客戶端實現數據路由

此方案不會引入額外的組件,架構上比較輕量,簡單場景使用尚可,但稍複雜的場景會放大它的劣勢,比如配置管理複雜等。

如何實現高容量大併發數據庫服務

2.數據庫中間件

中間件的使用最大限度地屏蔽了分佈式數據庫所引入的複雜性,極大降低了研發的門檻。最重要的是,有了數據庫中間件,應用看到的還是單一的數據庫。

如何實現高容量大併發數據庫服務

四 水平切分原理及設計原則

要對一個表做拆分,選擇一個拆分字段,通過一個路由算法確定數據存放在哪個底層庫。

比如下列數據選擇MEMBE_ID作為拆分鍵,通過路由算法計算後得出’test1234‘相關的數據應該落在庫1上,DRDS會把所有MEMBE_ID=‘test1234’相關的請求全都路由到庫1。其他數據請求亦落到相應的底層庫。

如何實現高容量大併發數據庫服務

接下來,當數據已經放下去了,應該如何去查詢、訪問和變更?

比如要查詢一條記錄,member_id=‘test1234’

它怎麼去執行的呢?

首先計算一個hash值,當值等於某一個值,它會知道這個數據存儲在哪一個庫上,所以會直接路由到底層這個庫,從這個庫查詢,返回結果。

中間件扮演的就是這個路由和計算的角色,性能非常強大。拆分後,各底層數據庫數據量比較小,查詢返回比較快;二是可以支持更高的併發,整體併發基本等於兩個底層數據庫實例併發之和。

如何實現高容量大併發數據庫服務

五 來自阿里雲的數據庫中間件產品:DRDS

數據庫中間件產品中,有平民軟件OneProxy等商業軟件;也有MyCat等開源產品,宏翊為大家則介紹了一款廣泛使用的成熟商業產品DRDS,並講解了DRDS如何解決對數據庫進行拆分時遇到的難點。

DRDS,英文名Distributed Relational Database Service

是阿里巴巴自主研發致力於解決單機數據庫服務瓶頸問題而推出的分佈式數據庫產品。 DRDS 高度兼容 MySQL 協議和語法、支持自動化水平拆分、平滑擴容、彈性擴展、透明讀寫分離、分佈式事務、具備分佈式數據庫全生命週期的運維管控能力。DRDS前身為淘寶TDDL,是近千核心應用首選組件,已穩定服務8年以上。

DRDS五大核心功能

分庫分表

分庫分表是DRDS的核心功能,DRDS 在後端將數據量較大的數據表水平拆分到後端的每個 RDS 數據庫中,這些拆分到 RDS 中的數據庫被稱為分庫,分庫中的表稱為分表。拆分後,每個分庫負責每一份數據的讀寫操作,從而有效的分散了整體訪問壓力。在系統擴容時,只需要水平增加分庫的數量,並且遷移相關數據,就可以提高 DRDS 系統的總體容量。DRDS 支持庫級拆分,表級拆分和分庫分表拆分,通過 DRDS DDL 語句指定。

讀寫分離

在主實例的讀請求較多、讀壓力比較大的時候,可以通過 DRDS 讀寫分離功能對讀流量進行分流,減輕 RDS 主實例的讀壓力。

DRDS 的讀寫分離功能是對應用透明的設計。應用在不修改任何代碼的情況下,只需要在 DRDS 控制檯中調整讀權重,即可將讀流量按配置的比例在主 RDS 實例與多個 RDS 只讀實例之間進行分流;寫流量則全部到主實例,不做分流。

設置讀寫分離後,從主 RDS 實例讀取的是強讀,既實時強一致讀,而只讀實例上的數據是從主實例上異步複製的,存在毫秒級的延遲,因此從只讀 RDS 實例讀取的是弱讀,屬於非強一致性讀。個別需要實時性、強一致性讀的 SQL 可以通過 DRDS Hint 指定到主實例上執行。

全局唯一ID

DRDS 支持分佈式全局唯一且有序遞增的數字序列。滿足業務在使用分佈式數據庫下對主鍵或者唯一鍵以及特定場景的需求。

小表廣播

DRDS 將一些數據量小且更新頻度不高的數據表存儲為單表模式,這些數據表稱為小表。通過數據同步將小表複製到與之 JOIN 的分庫上進而提升 JOIN 效率的解決方案稱為“小表廣播”或者“小表複製”。支持查詢引擎識別和下推複雜查詢,兼容 98% MySQL 語法。

彈性擴容

當邏輯庫對應的底層存儲已經達到物理瓶頸,需要進行水平擴展,比如磁盤餘量接近30%,那麼可以通過平滑擴容來改善。平滑擴容是一種水平擴容方式,既把分庫平滑遷移到新添加的底層存儲上。在實現上是通過增加 RDS 實例的數量來提升總體數據存儲容量,將分庫遷移到新增的 RDS 實例,從而降低單個 RDS 實例的處理壓力。

相關推薦

推薦中...