自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL冗余數(shù)據(jù)的三種方案

開發(fā) 開發(fā)工具
互聯(lián)網(wǎng)數(shù)據(jù)量很大的業(yè)務(wù)場景,往往數(shù)據(jù)庫需要進(jìn)行水平切分來降低單庫數(shù)據(jù)量。此時常見的架構(gòu)設(shè)計(jì)方案,是使用數(shù)據(jù)冗余這種反范式設(shè)計(jì)來滿足分庫后不同維度的查詢需求。

一、為什么要冗余數(shù)據(jù)

互聯(lián)網(wǎng)數(shù)據(jù)量很大的業(yè)務(wù)場景,往往數(shù)據(jù)庫需要進(jìn)行水平切分來降低單庫數(shù)據(jù)量。

水平切分會有一個patition key,通過patition key的查詢能夠直接定位到庫,但是非patition key上的查詢可能就需要掃描多個庫了。

此時常見的架構(gòu)設(shè)計(jì)方案,是使用數(shù)據(jù)冗余這種反范式設(shè)計(jì)來滿足分庫后不同維度的查詢需求。

例如:訂單業(yè)務(wù),對用戶和商家都有訂單查詢需求:

  1. Order(oid, info_detail); 
  2. T(buyer_id, seller_id, oid); 
  • 如果用buyer_id來分庫,seller_id的查詢就需要掃描多庫。
  • 如果用seller_id來分庫,buyer_id的查詢就需要掃描多庫。

此時可以使用數(shù)據(jù)冗余來分別滿足buyer_id和seller_id上的查詢需求:

  1. T1(buyer_id, seller_id, oid) 
  2. T2(seller_id, buyer_id, oid) 

同一個數(shù)據(jù),冗余兩份,一份以buyer_id來分庫,滿足買家的查詢需求;一份以seller_id來分庫,滿足賣家的查詢需求。

如何實(shí)施數(shù)據(jù)的冗余,是今天將要討論的內(nèi)容。

二、服務(wù)同步雙寫

服務(wù)同步雙寫

顧名思義,由服務(wù)層同步寫冗余數(shù)據(jù),如上圖1-4流程:

  • 業(yè)務(wù)方調(diào)用服務(wù),新增數(shù)據(jù)
  • 服務(wù)先插入T1數(shù)據(jù)
  • 服務(wù)再插入T2數(shù)據(jù)
  • 服務(wù)返回業(yè)務(wù)方新增數(shù)據(jù)成功

優(yōu)點(diǎn):

  • 不復(fù)雜,服務(wù)層由單次寫,變兩次寫
  • 數(shù)據(jù)一致性相對較高(因?yàn)殡p寫成功才返回)

缺點(diǎn):

  • 請求的處理時間增加(要插入兩次,時間加倍)
  • 數(shù)據(jù)仍可能不一致,例如第二步寫入T1完成后服務(wù)重啟,則數(shù)據(jù)不會寫入T2

如果系統(tǒng)對處理時間比較敏感,引出常用的第二種方案。

三、服務(wù)異步雙寫

服務(wù)異步雙寫

數(shù)據(jù)的雙寫并不再由服務(wù)來完成,服務(wù)層異步發(fā)出一個消息,通過消息總線發(fā)送給一個專門的數(shù)據(jù)復(fù)制服務(wù)來寫入冗余數(shù)據(jù),如上圖1-6流程:

  • 業(yè)務(wù)方調(diào)用服務(wù),新增數(shù)據(jù)
  • 服務(wù)先插入T1數(shù)據(jù)
  • 服務(wù)向消息總線發(fā)送一個異步消息(發(fā)出即可,不用等返回,通常很快就能完成)
  • 服務(wù)返回業(yè)務(wù)方新增數(shù)據(jù)成功
  • 消息總線將消息投遞給數(shù)據(jù)同步中心
  • 數(shù)據(jù)同步中心插入T2數(shù)據(jù)

優(yōu)點(diǎn):

  • 請求處理時間短(只插入1次)

缺點(diǎn):

  • 系統(tǒng)的復(fù)雜性增加了,多引入了一個組件(消息總線)和一個服務(wù)(專用的數(shù)據(jù)復(fù)制服務(wù))
  • 因?yàn)榉祷貥I(yè)務(wù)線數(shù)據(jù)插入成功時,數(shù)據(jù)還不一定插入到T2中,因此數(shù)據(jù)有一個不一致時間窗口(這個窗口很短,最終是一致的)
  • 在消息總線丟失消息時,冗余表數(shù)據(jù)會不一致

不管是服務(wù)同步雙寫,還是服務(wù)異步雙寫,服務(wù)都需要關(guān)注“冗余數(shù)據(jù)”帶來的復(fù)雜性。如果想解除“數(shù)據(jù)冗余”對系統(tǒng)的耦合,引出常用的第三種方案。

四、線下異步雙寫

為了屏蔽“冗余數(shù)據(jù)”對服務(wù)帶來的復(fù)雜性,數(shù)據(jù)的雙寫不再由服務(wù)層來完成,而是由線下的一個服務(wù)或者任務(wù)來完成,如上圖1-6流程:

  • 業(yè)務(wù)方調(diào)用服務(wù),新增數(shù)據(jù)
  • 服務(wù)先插入T1數(shù)據(jù)
  • 服務(wù)返回業(yè)務(wù)方新增數(shù)據(jù)成功
  • 數(shù)據(jù)會被寫入到數(shù)據(jù)庫的log中
  • 線下服務(wù)或者任務(wù)讀取數(shù)據(jù)庫的log
  • 線下服務(wù)或者任務(wù)插入T2數(shù)據(jù)

優(yōu)點(diǎn):

  • 數(shù)據(jù)雙寫與業(yè)務(wù)完全解耦
  • 請求處理時間短(只插入1次)

缺點(diǎn):

  • 返回業(yè)務(wù)線數(shù)據(jù)插入成功時,數(shù)據(jù)還不一定插入到T2中,因此數(shù)據(jù)有一個不一致時間窗口(這個窗口很短,最終是一致的)
  • 數(shù)據(jù)的一致性依賴于線下服務(wù)或者任務(wù)的可靠性

五、總結(jié)

互聯(lián)網(wǎng)數(shù)據(jù)量大的業(yè)務(wù)場景,常常:

  • 使用水平切分來降低單庫數(shù)據(jù)量
  • 使用數(shù)據(jù)冗余的反范式設(shè)計(jì)來滿足不同維度的查詢需求
  • 使用服務(wù)同步雙寫法能夠很容易的實(shí)現(xiàn)數(shù)據(jù)冗余
  • 為了降低時延,可以優(yōu)化為服務(wù)異步雙寫法
  • 為了屏蔽“冗余數(shù)據(jù)”對服務(wù)帶來的復(fù)雜性,可以優(yōu)化為線下異步雙寫法

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2011-05-05 15:22:16

深信服碼流數(shù)據(jù)流

2022-03-22 10:24:48

Linux開源Elasticsea

2010-09-01 16:14:21

SQL刪除數(shù)據(jù)

2010-05-25 18:50:22

MySQL安裝

2024-10-10 10:07:07

2024-08-07 08:21:05

2024-11-26 07:47:41

2010-09-30 14:40:45

2022-07-22 20:00:01

高可用路由

2017-12-29 08:26:28

存儲引擎MySQL

2010-10-13 11:19:11

MySQL數(shù)據(jù)文件

2019-09-05 09:15:50

數(shù)據(jù)容器Docker

2010-08-31 11:14:32

2011-01-18 15:35:59

jQueryJavaScriptweb

2010-07-07 09:14:35

SQL Server數(shù)

2010-08-13 15:08:55

Flex數(shù)據(jù)訪問

2010-05-24 11:00:18

2024-01-31 12:06:32

PostgreSQL遞歸函數(shù)查詢

2018-07-10 08:42:45

Oracle高可用集群

2020-11-24 10:13:02

Redis集群數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號