1. 程式人生 > >如何實現高容量大併發資料庫服務 | 資料庫分散式架構設計 ?

如何實現高容量大併發資料庫服務 | 資料庫分散式架構設計 ?

摘要

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

正文

一為什麼要做分散式資料庫架構改造?

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

二分散式資料庫架構改造,如何做?

資料庫分散式改造要遵循“循序漸進”的拆分原則

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

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

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

比如一個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 例項的處理壓力。

六分散式改造之後——運維

進行分散式改造之後,如何更省心省力對資料庫進行運維?

靠人工?成本高、運維人員也難招!

藉助袋鼠雲開發的資料庫自動化管理平臺EasyDB,企業資料庫運維很簡單。

EasyDB完全相容DRDS manager,具有高可用、高效能、易運維等特點。從效能、資源、叢集、備份、容災入手,支援多種資料庫例項,大規模量的資料庫運維,提供穩定準確的資料庫告警、大盤趨勢分析預警、空間跟蹤、SQL跟蹤、巡檢報告等功能。運維管理人員可以輕鬆應對複雜的日常管理事務及突發性事件,資料庫管理從此變得有規劃,有效率,有預見性。