【轉載】細聊冗余表數據一致性(架構師之路)

本文主要討論四個問題:

(1)為什么會有冗余表的需求

(2)如何實現冗余表

(3)正反冗余表誰先執行

(4)冗余表如何保證數據的一致性

?

一、需求緣起

互聯網很多業務場景的數據量很大,此時數據庫架構要進行水平切分,水平切分會有一個patition key,通過patition key的查詢能夠直接定位到庫,但是非patition key上的查詢可能就需要掃描多個庫了。

例如訂單表,業務上對用戶和商家都有訂單查詢需求:

Order(oid, info_detail)

T(buyer_id, seller_id, oid)

如果用buyer_id來分庫,seller_id的查詢就需要掃描多庫。

如果用seller_id來分庫,buyer_id的查詢就需要掃描多庫。

這類需求,為了做到高吞吐量低延時的查詢,往往使用“數據冗余”的方式來實現,就是文章標題里說的“冗余表”

T1(buyer_id, seller_id, oid)

T2(seller_id, buyer_id, oid)

同一個數據,冗余兩份,一份以buyer_id來分庫,滿足買家的查詢需求;

一份以seller_id來分庫,滿足賣家的查詢需求。

?

二、冗余表的實現方案

【方法一:服務同步寫】

24a6e9839da29bcb35d0baa58e9c8a59
顧名思義,由服務層同步寫冗余數據,如上圖1-4流程:

(1)業務方調用服務,新增數據

(2)服務先插入T1數據

(3)服務再插入T2數據

(4)服務返回業務方新增數據成功

優點

(1)不復雜,服務層由單次寫,變兩次寫

(2)數據一致性相對較高(因為雙寫成功才返回)

缺點

(1)請求的處理時間增加(要插入次,時間加倍)

(2)數據仍可能不一致,例如第二步寫入T1完成后服務重啟,則數據不會寫入T2

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

【方法二:服務異步寫】

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

(1)業務方調用服務,新增數據

(2)服務先插入T1數據

(3)服務向消息總線發送一個異步消息(發出即可,不用等返回,通常很快就能完成)

(4)服務返回業務方新增數據成功

(5)消息總線將消息投遞給數據同步中心

(6)數據同步中心插入T2數據

優點

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

缺點

(1)系統的復雜性增加了,多引入了一個組件(消息總線)和一個服務(專用的數據復制服務)

(2)因為返回業務線數據插入成功時,數據還不一定插入到T2中,因此數據有一個不一致時間窗口(這個窗口很短,最終是一致的)

(3)在消息總線丟失消息時,冗余表數據會不一致

如果想解除“數據冗余”對系統的耦合,引出常用的第三種方案

【方法三:線下異步寫】

e79918ae2ee508a6a7ee378c37b70180
數據的雙寫不再由服務層來完成,而是由線下的一個服務或者任務來完成,如上圖1-6流程:

(1)業務方調用服務,新增數據

(2)服務先插入T1數據

(3)服務返回業務方新增數據成功

(4)數據會被寫入到數據庫的log中

(5)線下服務或者任務讀取數據庫的log

(6)線下服務或者任務插入T2數據

優點

(1)數據雙寫與業務完全解耦

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

缺點

(1)返回業務線數據插入成功時,數據還不一定插入到T2中,因此數據有一個不一致時間窗口(這個窗口很短,最終是一致的)

(2)數據的一致性依賴于線下服務或者任務的可靠性

上述三種方案各有優缺點,但不管哪種方案,都會面臨“究竟先寫T1還是先寫T2”的問題?這該怎么辦呢?

?

三、究竟先寫正表還是反表

對于一個不能保證事務性的操作,一定涉及“哪個任務先做,哪個任務后做”的問題,解決這個問題的方向是:

【如果出現不一致】,誰先做對業務的影響較小,就誰先執行。

以上文的訂單生成業務為例,buyer和seller冗余表都需要插入數據:

T1(buyer_id, seller_id, oid)

T2(seller_id, buyer_id, oid)

用戶下單時,如果“先插入buyer表T1,再插入seller冗余表T2”,當第一步成功、第二步失敗時,出現的業務影響是“買家能看到自己的訂單,賣家看不到推送的訂單”

相反,如果“先插入seller表T2,再插入buyer冗余表T1”,當第一步成功、第二步失敗時,出現的業務影響是“賣家能看到推送的訂單,賣家看不到自己的訂單”

由于這個生成訂單的動作是買家發起的,買家如果看不到訂單,會覺得非常奇怪,并且無法支付以推動訂單狀態的流轉,此時即使賣家看到有人下單也是沒有意義的。

因此,在此例中,應該先插入buyer表T1,再插入seller表T2。

however,記住結論:如果出現不一致】,誰先做對業務的影響較小,就誰先執行。

四、如何保證數據的一致性

從二節和第三節的討論可以看到,不管哪種方案,因為兩步操作不能保證原子性,總有出現數據不一致的可能,那如何解決呢?

【方法一:線下掃面正反冗余表全部數據】

91417dd4bc3463ee6dd1d791cb9d38bf
如上圖所示,線下啟動一個離線的掃描工具,不停的比對正表T1和反表T2,如果發現數據不一致,就進行補償修復。

優點

(1)比較簡單,開發代價小

(2)線上服務無需修改,修復工具與線上服務解耦

缺點

(1)掃描效率低,會掃描大量的“已經能夠保證一致”的數據

(2)由于掃描的數據量大,掃描一輪的時間比較長,即數據如果不一致,不一致的時間窗口比較長

有沒有只掃描“可能存在不一致可能性”的數據,而不是每次掃描全部數據,以提高效率的優化方法呢?

【方法二:線下掃描增量數據】

9b8a4e73fd2426d511f9c266f803c25d
每次只掃描增量的日志數據,就能夠極大提高效率,縮短數據不一致的時間窗口,如上圖1-4流程所示:

(1)寫入正表T1

(2)第一步成功后,寫入日志log1

(3)寫入反表T2

(4)第二步成功后,寫入日志log2

當然,我們還是需要一個離線的掃描工具,不停的比對日志log1和日志log2,如果發現數據不一致,就進行補償修復

優點

(1)雖比方法一復雜,但仍然是比較簡單的

(2)數據掃描效率高,只掃描增量數據

缺點

(1)線上服務略有修改(代價不高,多寫了2條日志)

(2)雖然比方法一更實時,但時效性還是不高,不一致窗口取決于掃描的周期

有沒有實時檢測一致性并進行修復的方法呢?

【方法三:實時線上“消息對”檢測】

14dafce4ce22db72057d011e26dfdbc2
這次不是寫日志了,而是向消息總線發送消息,如上圖1-4流程所示:

(1)寫入正表T1

(2)第一步成功后,發送消息msg1

(3)寫入反表T2

(4)第二步成功后,發送消息msg2

這次不是需要一個周期掃描的離線工具了,而是一個實時訂閱消息的服務不停的收消息。

假設正常情況下,msg1和msg2的接收時間應該在3s以內,如果檢測服務在收到msg1后沒有收到msg2,就嘗試檢測數據的一致性,不一致時進行補償修復

優點

(1)效率高

(2)實時性高

缺點

(1)方案比較復雜,上線引入了消息總線這個組件

(2)線下多了一個訂閱總線的檢測服務

however,技術方案本身就是一個投入產出比的折衷,可以根據業務對一致性的需求程度決定使用哪一種方法。我這邊有過好友數據正反表的業務,使用的就是方法二。

==【完】==

?

【轉自】58沈劍 架構師之路

轉載于:https://www.cnblogs.com/bad-man/p/7866312.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540128.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ethtool如何讓接口閃燈_如何解決專業家庭影院與卡拉OK的聲學問題?

現在越來越多的專業家庭影院走進人們的家中,享受體驗娛樂氛圍的空間。在實際的生活中,許多人都把這個空間設計為多功能的影音娛樂室,集看電影、聽音樂、卡拉OK、游戲娛樂等于一體,在這其中看電影與卡拉OK將這兩個功能組合在同一個…

tensorflow學習筆記(1):sess.run()

原址:https://www.2cto.com/kf/201610/559887.html session.run() session.run([fetch1, fetch2]) import tensorflow as tf state tf.Variable(0.0,dtypetf.float32) one tf.constant(1.0,dtypetf.float32) new_val tf.add(state, one) update tf.assign(st…

關于MapReduce單詞統計的例子:

要統計的文件的文件名為hello hello中的內容如下 hello  you hello  me 通過MapReduce程序統計出文件中的各個單詞出現了幾次.(兩個單詞之間通過tab鍵進行的分割) 1 import java.io.IOException;2 3 import mapreduce.WordCountApp.WordCountMapper.WordCountReducer;4 5 i…

朵朵糖故事機器人怎么更新_“故事販賣機”專欄創始人溫酒的新作,奇幻世界的暖心物語很治愈...

我有酒,你有故事嗎?2015年,知乎上一個叫“故事販賣機”的專欄橫空出世,憑著一個個腦洞大開的故事,這個溫吞而又溫暖的專欄很快得到了讀者的認可。而其中的創始人兼主打寫手溫酒,更是被粉絲們親切地稱呼為“…

python3 通過百度地圖API獲取城市POI點并存于CSV格式

原文信息: 作者:WenWu_Both 出處:http://blog.csdn.net/wenwu_both/article/ 版權:本文版權歸作者和CSDN博客共有 轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中…

使用dropwizard(3)-加入DI-dagger2

前言 習慣了Spring全家桶,對spring的容器愛不釋手。使用dropwizard,看起來確實很輕,然而,真正使用的時候不得不面臨一個問題。我們不可能一個resource就能把所有的業務邏輯囊括!那么,必然就要有負責處理邏輯…

日歷對象導哪個包_微信新表情瞬間炸裂,文物表情包永恒萌呆!

11月18日晚微信上架了6個全新表情瞬間炸裂網友一天時間閱讀達16.2億,討論15.8萬次#微信新表情#話題翻白眼、666、讓我看看嘆氣、苦澀、裂開微信新表情雖然666但文物表情包的呆萌也能讓人瞬間裂開更能完全詮釋我的各(bu)種(wen ding)情緒先對比一下最新的6個表情[翻白…

Tensorflow一些常用基本概念與函數(1)

文章轉至 作者:林海山波出處:https://me.csdn.net/lenbow版權:本文版權歸作者和CSDN博客共有 寫這篇博客只為自己學習路上做個筆記,方便自己學習記憶,大家如果想看詳細文章可以去原作者主頁去看,同時他…

Lineageos14 20180525更新

一、ROM注意事項 拒絕任何無意義二次打包! C大停止更新Lineageos14,我來接力。 二、ROM更新日志 20180525更新: 1、常規更新 2、安全補丁2018年5月5日 20180406更新: 1、增加通話錄音,常規更新 2、安全補丁2018年3月…

藍牙連接不上車要hfp_如何正確使用車載藍牙播放器呢?

車載藍牙是以無線藍牙技術為基礎而設計研發的車內無線免提系統。可以連接我們設計進行聽歌和打電話十分方便,下面諾金小編帶大家一起來看看!下面諾金小編帶大家一起來看看一、首先是把手機和車載藍牙播放器打開,搜索車載藍牙播放器“809”&am…

使用Eclipse+PyDev創建Django項目一windows下

開發條件:eclipsepydev插件django editor插件 關于eclipse安裝小編就不多做介紹,我自己用的版本如下 1.安裝pydev插件 啟動Eclipse, 點擊Help->Install New Software 彈出如下框 點擊add 分別在 Name中填:Pydev, Location中填http://pydev.org/up…

如何避免踩坑--初創技術團隊組建風險預估

閑來無事翻翻微信,發現有不少朋友公司在招技術負責人,跟他們聊了幾句,發現大多數認知都是技術部門的效率與進度達不到要求,機緣巧合下,有幸到了Y公司跟其Boss會面,得知其技術團隊效率低下,總是不…

查詢空缺_攜程旅行2021校招開啟,9大類職位,1000+崗位空缺,本科及以上學歷...

攜程旅行2021秋季校招正式開啟!攜程集團(納斯達克股票代碼:TCOM)是一家領先的在線旅游服務提供商,旗下品牌包括攜程、Trip.com、天巡和去哪兒。攜程集團能夠整合復雜的旅游相關信息并通過其先進的移動端App、網站以及24小時無間斷的免費客戶服…

Django web開發筆記

一、Django開發環境搭建: 1.安裝python:django可運行于版本python 2.7、3.x 2.安裝相應的IDE 3.安裝pip:sudo apt-get install python-pip(linux為例) 4.安裝django:1)pip安裝:sudo pip ins…

android 前置攝像頭預覽時 鏡像翻轉_全面屏時代,原來手機前置攝像頭都隱藏著一些缺點,你發現了嗎?...

隨著真全面屏時代的到來,人們已經不再滿足于劉海屏、水滴屏以及挖孔屏等,越來越多的手機廠商和消費者開始追求"100%全面屏"。于是如何解決手機前置攝像頭便成了最大的難題,畢竟只要在屏幕上放置攝像頭必然會影響屏占比,…

Java 調用 Python 方法學習筆記

文章轉載自: 作者:IT_xiao_bai 來源:CSDN 原文:https://blog.csdn.net/IT_xiao_bai/article/details/79074988 前一陣自剛好用python做了一個sae的算法模型,結果公…

catia怎么將特征參數化_VSLAM中特征點的參數化表示

VSLAM中特征點的參數化表示有很多,最直接的是用三維坐標XYZ來表示,但通常大家更喜歡用逆深度表示,因為逆深度優勢在于能夠建模無窮遠點。Open VINS文檔中給出了五種特征參數化表示:Global XYZ,Global Inverse Depth&am…

【廣州】Web前端工程師

互聯網公司找人咯~ 我們公司:道樂科技(Dollar Tech)成立于2013年11月,是一家致力于為資產管理和財富管理行業提供技術、產品和運營服務的科技金融企業。三年來,道樂人始終堅持“以客戶為中心,為客戶提供高品…

Java 調用 Python 方法學習筆記---之---java調用python深度學習模型運算并返回運算結果給前端(2)

上一章寫到Java 調用 Python 方法學習的三種方法,這里強調第三種方法。第三種方法本質上和第二種方法是一樣的,都是應用到 Runtime.getRuntime().exec() 去執行文件。要深度理解這種方法,首先要先理解一下Runtime.getRuntime().exec() 。 R…

tbslog亂碼轉換_日文游戲亂碼怎么辦 亂碼轉換工具LocaleEmulator

by Nicho Feb.23,2017許多日文游戲有諸多地區限制,在 win7、win8、win10 上玩時候會經常遇到日文游戲亂碼的情況,這時候就得用到亂碼轉換工具了,下面我們就來詳細說明下使用方法。常用的有 microsoft locale、applocale、NTLEA 等&…