隨著數(shù)據(jù)量不斷增大考榨,傳統(tǒng)的架構(gòu)模式難以解決業(yè)務(wù)量不斷增長(zhǎng)所帶來的問題号显,特別是在業(yè)務(wù)成線性臭猜、甚至指數(shù)級(jí)上升的情況。此時(shí)我們不得不通過水平擴(kuò)展押蚤,把數(shù)據(jù)庫(kù)放到不同服務(wù)器上來解決問題蔑歌,也就是我們說的數(shù)據(jù)庫(kù)中間件。
作為數(shù)據(jù)庫(kù)中間件揽碘,分布式數(shù)據(jù)庫(kù)中間件DDM將底層數(shù)據(jù)庫(kù)存儲(chǔ)引擎以集群方式管理起來次屠,用戶使用非常方便。應(yīng)用程序不需要關(guān)心具體有多少分片雳刺。類似操作單機(jī)數(shù)據(jù)庫(kù)劫灶,用戶通過DDM管理控制臺(tái)進(jìn)行數(shù)據(jù)庫(kù)運(yùn)維,使用JDBC等驅(qū)動(dòng)服務(wù)或SQL客戶端連接數(shù)據(jù)庫(kù)掖桦,進(jìn)行數(shù)據(jù)讀寫本昏。
DDM服務(wù)的業(yè)務(wù)架構(gòu)圖示
分片是解決數(shù)據(jù)庫(kù)存儲(chǔ)容量限制的直接途徑。分片包括垂直分片與水平分片兩種方式枪汪。
垂直分片
垂直分片又叫縱向分割涌穆,即以邏輯表為單位,把原有數(shù)據(jù)庫(kù)切分成多個(gè)數(shù)據(jù)庫(kù)雀久。切分后不同的表存儲(chǔ)在不同的數(shù)據(jù)庫(kù)上宿稀。
垂直分片與業(yè)務(wù)架構(gòu)設(shè)計(jì)有密切的聯(lián)系。比如從業(yè)務(wù)領(lǐng)域?qū)ο到y(tǒng)進(jìn)行架構(gòu)優(yōu)化赖捌,分成多個(gè)子業(yè)務(wù)系統(tǒng)祝沸,各個(gè)子業(yè)務(wù)系統(tǒng)耦合度較低。子業(yè)務(wù)系統(tǒng)間以接口方式進(jìn)行數(shù)據(jù)通信和數(shù)據(jù)交換。垂直拆分后業(yè)務(wù)清晰罩锐,拆分規(guī)則明確奉狈,系統(tǒng)之間容易整合與擴(kuò)展。一般用于數(shù)據(jù)庫(kù)上層架構(gòu)設(shè)計(jì)唯欣。
垂直分片示意圖
水平分片
水平分片又叫橫向分割嘹吨,即以邏輯表中的數(shù)據(jù)行記錄為單位,把原有邏輯數(shù)據(jù)庫(kù)切分成多個(gè)物理數(shù)據(jù)庫(kù)分片境氢,表數(shù)據(jù)記錄分布存儲(chǔ)在各個(gè)分片上蟀拷。
水平分片主要用業(yè)務(wù)架構(gòu)無法繼續(xù)細(xì)分,而數(shù)據(jù)庫(kù)中單張表數(shù)據(jù)量太大萍聊,查詢性能下降的場(chǎng)景问芬。通過水平分片,即解決單庫(kù)容量問題寿桨,同時(shí)提高并發(fā)查詢性能此衅。
水平分片示意圖
DDM實(shí)現(xiàn)了自動(dòng)水平分片,應(yīng)用無需關(guān)心某個(gè)數(shù)據(jù)該存儲(chǔ)在哪一塊分片上亭螟。對(duì)邏輯表水平分片需要依據(jù)一定的分片規(guī)則挡鞍,例如一個(gè)訂單跟蹤系統(tǒng)(見上圖),我們選取訂單號(hào)(OrderId)作為拆分鍵预烙,分別對(duì)“訂單流水表”墨微、“訂單詳情表”以及“物流跟蹤表”進(jìn)行水平拆分,拆分規(guī)則為對(duì)鍵值Hash后求模扁掸,則分片計(jì)算規(guī)則如下:
H(Key(OrderId)) = Hash(Key(OrderId))%N
其中翘县,N表示一共有N個(gè)數(shù)據(jù)分片,H(Key(OrderId))表示該訂單經(jīng)過訂單號(hào)Hash并求模后存儲(chǔ)的分片編號(hào)谴分。
分片后數(shù)據(jù)存儲(chǔ)示意圖
路由分發(fā)
路由分發(fā)與水平分片同為DDM的基礎(chǔ)功能锈麸。在分布式數(shù)據(jù)庫(kù)中,路由的作用即將SQL語句進(jìn)行解析牺蹄,并轉(zhuǎn)發(fā)到正確的分片上忘伞,保證SQL執(zhí)行后得到正確的結(jié)果,并且節(jié)約QPS資源沙兰。例如:訂單支付系統(tǒng)包含了shard0虑省、shard1、shard2三個(gè)分片僧凰,訂單號(hào)2017010112345678的訂單數(shù)據(jù)存儲(chǔ)在shard0分片上,則應(yīng)該將以下語句路由分發(fā)到shard0分片上執(zhí)行熟丸。
select Customer, OrderStatus, CreateDate from Order
where OrderId = '2017010112345678';
如果同時(shí)路由到shard0训措、shard1、shard2三個(gè)分片,會(huì)造成多余的查詢绩鸣,浪費(fèi)資源怀大;如果路由到shard1、shard2分片呀闻,則得不到正確的返回結(jié)果化借。
DDM對(duì)單張表的路由解析流程如下:
單張表的路由解析流程
讀寫分離
數(shù)據(jù)庫(kù)中對(duì)計(jì)算和緩存資源消耗較多的往往是密集或復(fù)雜的SQL查詢。當(dāng)系統(tǒng)資源被查詢語句消耗捡多,反過來會(huì)影響數(shù)據(jù)寫入操作蓖康,進(jìn)而導(dǎo)致數(shù)據(jù)庫(kù)整體性能下降,響應(yīng)緩慢垒手。因此蒜焊,當(dāng)數(shù)據(jù)庫(kù)CPU和內(nèi)存資源占用居高不下,且讀寫比例較高時(shí)科贬,可以為數(shù)據(jù)庫(kù)添加只讀實(shí)例泳梆。
添加只讀實(shí)例的作用有以下:
1、將查詢非事務(wù)性查詢SQL路由到只讀實(shí)例中執(zhí)行榜掌,主實(shí)例上執(zhí)行事務(wù)性SQL优妙,在很大程度上緩解主實(shí)例上的S鎖與X鎖的競(jìng)爭(zhēng)。
2憎账、對(duì)只讀實(shí)例上的表可配置不提供事務(wù)支持的數(shù)據(jù)庫(kù)引擎套硼,進(jìn)而提升查詢效率。
3鼠哥、增加只讀實(shí)例熟菲,也相當(dāng)于數(shù)據(jù)庫(kù)橫向擴(kuò)展,直接增加負(fù)載能力朴恳,同時(shí)增加數(shù)據(jù)冗余抄罕,確保數(shù)據(jù)庫(kù)高可用。
DDM服務(wù)實(shí)現(xiàn)了自動(dòng)讀寫分離于颖,用戶購(gòu)買了RDS只讀實(shí)例后呆贿,將只讀實(shí)例信息同步到DDM中即可,無需再做其他配置森渐。同時(shí)做入,DDM支持用戶在SQL中自定義讀寫分離策略,具體用法請(qǐng)參考如何實(shí)現(xiàn)讀寫分離同衣。
讀寫分離示意圖
平滑擴(kuò)容
隨著業(yè)務(wù)增長(zhǎng)竟块,邏輯庫(kù)存儲(chǔ)空間不足,并發(fā)壓力較大耐齐,此時(shí)可對(duì)DDM實(shí)例邏輯庫(kù)進(jìn)行平滑擴(kuò)容浪秘,通過增加RDS實(shí)例來提高數(shù)據(jù)存儲(chǔ)能力與并發(fā)支持能力蒋情。
平滑擴(kuò)容是一種水平擴(kuò)容方式,通過增加RDS實(shí)例的數(shù)量來提升總體數(shù)據(jù)存儲(chǔ)容量耸携,把分庫(kù)平滑擴(kuò)容到新增加的RDS實(shí)例上棵癣,保證所有的數(shù)據(jù)都是均衡分布在每個(gè)分庫(kù)上,降單個(gè)RDS實(shí)例的處理壓力夺衍。平滑擴(kuò)容原理如下圖所示狈谊。
平滑擴(kuò)容原理
以上就是對(duì)分布式數(shù)據(jù)庫(kù)中間件DDM實(shí)現(xiàn)原理的淺析,目前華為云DDM推出了免費(fèi)體驗(yàn)活動(dòng)沟沙,想要了解更多河劝,歡迎前往分布式數(shù)據(jù)庫(kù)中間件查看。