一為什么要做分布式數(shù)據(jù)庫(kù)架構(gòu)改造?
云計(jì)算大數(shù)據(jù)時(shí)代,傳統(tǒng)的數(shù)據(jù)庫(kù)架構(gòu)已經(jīng)無(wú)法支撐企業(yè)高容量的數(shù)據(jù)增長(zhǎng),滿足高并發(fā)的業(yè)務(wù)需求。對(duì)企業(yè)數(shù)據(jù)庫(kù)進(jìn)行分布式架構(gòu)設(shè)計(jì),打破了數(shù)據(jù)庫(kù)資源不夠用的天花板的同時(shí),還能根據(jù)企業(yè)業(yè)務(wù)發(fā)展?fàn)顩r,隨時(shí)平滑擴(kuò)容。
二分布式數(shù)據(jù)庫(kù)架構(gòu)改造,如何做?
數(shù)據(jù)庫(kù)分布式改造要遵循“循序漸進(jìn)”的拆分原則
拆分方式有垂直拆分和水平拆分兩種,選擇拆分方式要根據(jù)企業(yè)自身業(yè)務(wù)發(fā)展需要。
一般來(lái)說(shuō),是先做垂直拆分,再做水平拆分。
在單一數(shù)據(jù)節(jié)點(diǎn)無(wú)法滿足業(yè)務(wù)和用戶增長(zhǎng)需求的情況下,需要做一個(gè)服務(wù)化,對(duì)業(yè)務(wù)進(jìn)行垂直梳理,后面的數(shù)據(jù)節(jié)點(diǎn)可以放在不同的資源節(jié)點(diǎn)上,以提高數(shù)據(jù)服務(wù)的整體性能。
比如一個(gè)App的業(yè)務(wù)數(shù)據(jù),在業(yè)務(wù)初期階段,是全部放在一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)中,在業(yè)務(wù)量和數(shù)據(jù)量快速增長(zhǎng)的中期階段,需要進(jìn)行垂直梳理,根據(jù)業(yè)務(wù)邏輯,拆分成商品、交易、用戶,并分別放在不同的數(shù)據(jù)庫(kù)。
如果其中的一個(gè)服務(wù)已經(jīng)拆的很細(xì)了,但還是有性能瓶頸,無(wú)法支撐我們的業(yè)務(wù)增長(zhǎng),數(shù)據(jù)庫(kù)這塊才需要再做水平拆分。
水平拆分就是將數(shù)據(jù)(比如圖中APP的交易數(shù)據(jù))拆成多片,放到不同的資源上,用一個(gè)集群來(lái)支撐更高的業(yè)務(wù)增長(zhǎng)。
在拆分時(shí),要謹(jǐn)慎,因?yàn)椴鸱謺?huì)引入復(fù)雜性,能不做就不做,最優(yōu)先是做業(yè)務(wù)和架構(gòu)上的優(yōu)化,最終才是做數(shù)據(jù)庫(kù)拆分。
在拆分的過(guò)程中,不要做過(guò)度的設(shè)計(jì),或者直接從初級(jí)跳到高級(jí),這樣做其實(shí)非常浪費(fèi)資源,投入產(chǎn)出比也不好。
三水平拆分的難點(diǎn)及解決方案
對(duì)企業(yè)數(shù)據(jù)庫(kù)進(jìn)行分布式改造,需要理解客戶的業(yè)務(wù)邏輯、豐富的拆分經(jīng)驗(yàn)積累。尤其是水平拆分,有系統(tǒng)復(fù)雜度高、技術(shù)挑戰(zhàn)性強(qiáng)、穩(wěn)定性控制難、具有一定局限性四大難點(diǎn)。
針對(duì)這些問(wèn)題,宏翊給我們提供了兩種解決方案。
1.客戶端實(shí)現(xiàn)數(shù)據(jù)路由
此方案不會(huì)引入額外的組件,架構(gòu)上比較輕量,簡(jiǎn)單場(chǎng)景使用尚可,但稍復(fù)雜的場(chǎng)景會(huì)放大它的劣勢(shì),比如配置管理復(fù)雜等。
2.數(shù)據(jù)庫(kù)中間件
中間件的使用最大限度地屏蔽了分布式數(shù)據(jù)庫(kù)所引入的復(fù)雜性,極大降低了研發(fā)的門檻。最重要的是,有了數(shù)據(jù)庫(kù)中間件,應(yīng)用看到的還是單一的數(shù)據(jù)庫(kù)。
四水平切分原理及設(shè)計(jì)原則
要對(duì)一個(gè)表做拆分,選擇一個(gè)拆分字段,通過(guò)一個(gè)路由算法確定數(shù)據(jù)存放在哪個(gè)底層庫(kù)。
比如下列數(shù)據(jù)選擇MEMBE_ID作為拆分鍵,通過(guò)路由算法計(jì)算后得出’test1234‘相關(guān)的數(shù)據(jù)應(yīng)該落在庫(kù)1上,DRDS會(huì)把所有MEMBE_ID=‘test1234’相關(guān)的請(qǐng)求全都路由到庫(kù)1。其他數(shù)據(jù)請(qǐng)求亦落到相應(yīng)的底層庫(kù)。
接下來(lái),當(dāng)數(shù)據(jù)已經(jīng)放下去了,應(yīng)該如何去查詢、訪問(wèn)和變更?
比如要查詢一條記錄,member_id=‘test1234’
它怎么去執(zhí)行的呢?
首先計(jì)算一個(gè)hash值,當(dāng)值等于某一個(gè)值,它會(huì)知道這個(gè)數(shù)據(jù)存儲(chǔ)在哪一個(gè)庫(kù)上,所以會(huì)直接路由到底層這個(gè)庫(kù),從這個(gè)庫(kù)查詢,返回結(jié)果。
中間件扮演的就是這個(gè)路由和計(jì)算的角色,性能非常強(qiáng)大。拆分后,各底層數(shù)據(jù)庫(kù)數(shù)據(jù)量比較小,查詢返回比較快;二是可以支持更高的并發(fā),整體并發(fā)基本等于兩個(gè)底層數(shù)據(jù)庫(kù)實(shí)例并發(fā)之和。
五來(lái)自阿里云的數(shù)據(jù)庫(kù)中間件產(chǎn)品:DRDS
數(shù)據(jù)庫(kù)中間件產(chǎn)品中,有平民軟件OneProxy等商業(yè)軟件;也有MyCat等開(kāi)源產(chǎn)品,宏翊為大家則介紹了一款廣泛使用的成熟商業(yè)產(chǎn)品DRDS,并講解了DRDS如何解決對(duì)數(shù)據(jù)庫(kù)進(jìn)行拆分時(shí)遇到的難點(diǎn)。
DRDS,英文名Distributed Relational Database Service
是阿里巴巴自主研發(fā)致力于解決單機(jī)數(shù)據(jù)庫(kù)服務(wù)瓶頸問(wèn)題而推出的分布式數(shù)據(jù)庫(kù)產(chǎn)品。 DRDS 高度兼容 MySQL 協(xié)議和語(yǔ)法、支持自動(dòng)化水平拆分、平滑擴(kuò)容、彈性擴(kuò)展、透明讀寫分離、分布式事務(wù)、具備分布式數(shù)據(jù)庫(kù)全生命周期的運(yùn)維管控能力。DRDS前身為淘寶TDDL,是近千核心應(yīng)用首選組件,已穩(wěn)定服務(wù)8年以上。
DRDS五大核心功能
分庫(kù)分表
分庫(kù)分表是DRDS的核心功能,DRDS 在后端將數(shù)據(jù)量較大的數(shù)據(jù)表水平拆分到后端的每個(gè) RDS 數(shù)據(jù)庫(kù)中,這些拆分到 RDS 中的數(shù)據(jù)庫(kù)被稱為分庫(kù),分庫(kù)中的表稱為分表。拆分后,每個(gè)分庫(kù)負(fù)責(zé)每一份數(shù)據(jù)的讀寫操作,從而有效的分散了整體訪問(wèn)壓力。在系統(tǒng)擴(kuò)容時(shí),只需要水平增加分庫(kù)的數(shù)量,并且遷移相關(guān)數(shù)據(jù),就可以提高 DRDS 系統(tǒng)的總體容量。DRDS 支持庫(kù)級(jí)拆分,表級(jí)拆分和分庫(kù)分表拆分,通過(guò) DRDS DDL 語(yǔ)句指定。
讀寫分離
在主實(shí)例的讀請(qǐng)求較多、讀壓力比較大的時(shí)候,可以通過(guò) DRDS 讀寫分離功能對(duì)讀流量進(jìn)行分流,減輕 RDS 主實(shí)例的讀壓力。
DRDS 的讀寫分離功能是對(duì)應(yīng)用透明的設(shè)計(jì)。應(yīng)用在不修改任何代碼的情況下,只需要在 DRDS 控制臺(tái)中調(diào)整讀權(quán)重,即可將讀流量按配置的比例在主 RDS 實(shí)例與多個(gè) RDS 只讀實(shí)例之間進(jìn)行分流;寫流量則全部到主實(shí)例,不做分流。
設(shè)置讀寫分離后,從主 RDS 實(shí)例讀取的是強(qiáng)讀,既實(shí)時(shí)強(qiáng)一致讀,而只讀實(shí)例上的數(shù)據(jù)是從主實(shí)例上異步復(fù)制的,存在毫秒級(jí)的延遲,因此從只讀 RDS 實(shí)例讀取的是弱讀,屬于非強(qiáng)一致性讀。個(gè)別需要實(shí)時(shí)性、強(qiáng)一致性讀的 SQL 可以通過(guò) DRDS Hint 指定到主實(shí)例上執(zhí)行。
全局唯一ID
DRDS 支持分布式全局唯一且有序遞增的數(shù)字序列。滿足業(yè)務(wù)在使用分布式數(shù)據(jù)庫(kù)下對(duì)主鍵或者唯一鍵以及特定場(chǎng)景的需求。
小表廣播
DRDS 將一些數(shù)據(jù)量小且更新頻度不高的數(shù)據(jù)表存儲(chǔ)為單表模式,這些數(shù)據(jù)表稱為小表。通過(guò)數(shù)據(jù)同步將小表復(fù)制到與之 JOIN 的分庫(kù)上進(jìn)而提升 JOIN 效率的解決方案稱為“小表廣播”或者“小表復(fù)制”。支持查詢引擎識(shí)別和下推復(fù)雜查詢,兼容 98% MySQL 語(yǔ)法。
彈性擴(kuò)容
當(dāng)邏輯庫(kù)對(duì)應(yīng)的底層存儲(chǔ)已經(jīng)達(dá)到物理瓶頸,需要進(jìn)行水平擴(kuò)展,比如磁盤余量接近30%,那么可以通過(guò)平滑擴(kuò)容來(lái)改善。平滑擴(kuò)容是一種水平擴(kuò)容方式,既把分庫(kù)平滑遷移到新添加的底層存儲(chǔ)上。在實(shí)現(xiàn)上是通過(guò)增加 RDS 實(shí)例的數(shù)量來(lái)提升總體數(shù)據(jù)存儲(chǔ)容量,將分庫(kù)遷移到新增的 RDS 實(shí)例,從而降低單個(gè) RDS 實(shí)例的處理壓力。
六分布式改造之后——運(yùn)維
進(jìn)行分布式改造之后,如何更省心省力對(duì)數(shù)據(jù)庫(kù)進(jìn)行運(yùn)維?
靠人工?成本高、運(yùn)維人員也難招!
借助數(shù)據(jù)庫(kù)自動(dòng)化管理平臺(tái)EasyDB,企業(yè)數(shù)據(jù)庫(kù)運(yùn)維很簡(jiǎn)單。
EasyDB完全兼容DRDS manager,具有高可用、高性能、易運(yùn)維等特點(diǎn)。從性能、資源、集群、備份、容災(zāi)入手,支持多種數(shù)據(jù)庫(kù)實(shí)例,大規(guī)模量的數(shù)據(jù)庫(kù)運(yùn)維,提供穩(wěn)定準(zhǔn)確的數(shù)據(jù)庫(kù)告警、大盤趨勢(shì)分析預(yù)警、空間跟蹤、SQL跟蹤、巡檢報(bào)告等功能。運(yùn)維管理人員可以輕松應(yīng)對(duì)復(fù)雜的日常管理事務(wù)及突發(fā)性事件,數(shù)據(jù)庫(kù)管理從此變得有規(guī)劃,有效率,有預(yù)見(jiàn)性。