新聞中心
一、為什么要冗余數(shù)據(jù)

創(chuàng)新互聯(lián)公司提供成都網(wǎng)站制作、做網(wǎng)站、網(wǎng)頁設計,高端網(wǎng)站設計,廣告投放平臺等致力于企業(yè)網(wǎng)站建設與公司網(wǎng)站制作,十余年的網(wǎng)站開發(fā)和建站經(jīng)驗,助力企業(yè)信息化建設,成功案例突破成百上千,是您實現(xiàn)網(wǎng)站建設的好選擇.
互聯(lián)網(wǎng)數(shù)據(jù)量很大的業(yè)務場景,往往數(shù)據(jù)庫需要進行水平切分來降低單庫數(shù)據(jù)量。
水平切分會有一個patition key,通過patition key的查詢能夠直接定位到庫,但是非patition key上的查詢可能就需要掃描多個庫了。
此時常見的架構設計方案,是使用數(shù)據(jù)冗余這種反范式設計來滿足分庫后不同維度的查詢需求。
例如:訂單業(yè)務,對用戶和商家都有訂單查詢需求:
- Order(oid, info_detail);
- T(buyer_id, seller_id, oid);
- 如果用buyer_id來分庫,seller_id的查詢就需要掃描多庫。
- 如果用seller_id來分庫,buyer_id的查詢就需要掃描多庫。
此時可以使用數(shù)據(jù)冗余來分別滿足buyer_id和seller_id上的查詢需求:
- T1(buyer_id, seller_id, oid)
- T2(seller_id, buyer_id, oid)
同一個數(shù)據(jù),冗余兩份,一份以buyer_id來分庫,滿足買家的查詢需求;一份以seller_id來分庫,滿足賣家的查詢需求。
如何實施數(shù)據(jù)的冗余,是今天將要討論的內(nèi)容。
二、服務同步雙寫
顧名思義,由服務層同步寫冗余數(shù)據(jù),如上圖1-4流程:
- 業(yè)務方調(diào)用服務,新增數(shù)據(jù)
- 服務先插入T1數(shù)據(jù)
- 服務再插入T2數(shù)據(jù)
- 服務返回業(yè)務方新增數(shù)據(jù)成功
優(yōu)點:
- 不復雜,服務層由單次寫,變兩次寫
- 數(shù)據(jù)一致性相對較高(因為雙寫成功才返回)
缺點:
- 請求的處理時間增加(要插入兩次,時間加倍)
- 數(shù)據(jù)仍可能不一致,例如第二步寫入T1完成后服務重啟,則數(shù)據(jù)不會寫入T2
如果系統(tǒng)對處理時間比較敏感,引出常用的第二種方案。
三、服務異步雙寫
數(shù)據(jù)的雙寫并不再由服務來完成,服務層異步發(fā)出一個消息,通過消息總線發(fā)送給一個專門的數(shù)據(jù)復制服務來寫入冗余數(shù)據(jù),如上圖1-6流程:
- 業(yè)務方調(diào)用服務,新增數(shù)據(jù)
- 服務先插入T1數(shù)據(jù)
- 服務向消息總線發(fā)送一個異步消息(發(fā)出即可,不用等返回,通常很快就能完成)
- 服務返回業(yè)務方新增數(shù)據(jù)成功
- 消息總線將消息投遞給數(shù)據(jù)同步中心
- 數(shù)據(jù)同步中心插入T2數(shù)據(jù)
優(yōu)點:
- 請求處理時間短(只插入1次)
缺點:
- 系統(tǒng)的復雜性增加了,多引入了一個組件(消息總線)和一個服務(專用的數(shù)據(jù)復制服務)
- 因為返回業(yè)務線數(shù)據(jù)插入成功時,數(shù)據(jù)還不一定插入到T2中,因此數(shù)據(jù)有一個不一致時間窗口(這個窗口很短,最終是一致的)
- 在消息總線丟失消息時,冗余表數(shù)據(jù)會不一致
不管是服務同步雙寫,還是服務異步雙寫,服務都需要關注“冗余數(shù)據(jù)”帶來的復雜性。如果想解除“數(shù)據(jù)冗余”對系統(tǒng)的耦合,引出常用的第三種方案。
四、線下異步雙寫
為了屏蔽“冗余數(shù)據(jù)”對服務帶來的復雜性,數(shù)據(jù)的雙寫不再由服務層來完成,而是由線下的一個服務或者任務來完成,如上圖1-6流程:
- 業(yè)務方調(diào)用服務,新增數(shù)據(jù)
- 服務先插入T1數(shù)據(jù)
- 服務返回業(yè)務方新增數(shù)據(jù)成功
- 數(shù)據(jù)會被寫入到數(shù)據(jù)庫的log中
- 線下服務或者任務讀取數(shù)據(jù)庫的log
- 線下服務或者任務插入T2數(shù)據(jù)
優(yōu)點:
- 數(shù)據(jù)雙寫與業(yè)務完全解耦
- 請求處理時間短(只插入1次)
缺點:
- 返回業(yè)務線數(shù)據(jù)插入成功時,數(shù)據(jù)還不一定插入到T2中,因此數(shù)據(jù)有一個不一致時間窗口(這個窗口很短,最終是一致的)
- 數(shù)據(jù)的一致性依賴于線下服務或者任務的可靠性
五、總結
互聯(lián)網(wǎng)數(shù)據(jù)量大的業(yè)務場景,常常:
- 使用水平切分來降低單庫數(shù)據(jù)量
- 使用數(shù)據(jù)冗余的反范式設計來滿足不同維度的查詢需求
- 使用服務同步雙寫法能夠很容易的實現(xiàn)數(shù)據(jù)冗余
- 為了降低時延,可以優(yōu)化為服務異步雙寫法
- 為了屏蔽“冗余數(shù)據(jù)”對服務帶來的復雜性,可以優(yōu)化為線下異步雙寫法
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉載請聯(lián)系原作者】
網(wǎng)頁題目:MySQL冗余數(shù)據(jù)的三種方案
分享網(wǎng)址:http://m.fisionsoft.com.cn/article/coddihd.html


咨詢
建站咨詢
