一,為什麼要冗餘資料
網際網路資料量很大的業務場景,往往資料庫需要進行水平切分來降低單庫資料量。
水平切分會有乙個patition key,通過patition key的查詢能夠直接定位到庫,但是非patition key上的查詢可能就需要掃瞄多個庫了。
此時常見的架構設計方案,是使用資料冗餘這種反正規化設計來滿足分庫後不同維度的查詢需求。
例如:訂單業務,對使用者和商家都有查詢需求:
order(oid, info_detail);
t(buyer_id, seller_id, oid);
如果用buyer_id來分庫,seller_id的查詢就需要掃瞄多庫。
如果用seller_id來分庫,buyer_id的查詢就需要掃瞄多庫。
此時可以使用資料冗餘來分別滿足buyer_id和seller_id上的查詢需求:
t1(buyer_id, seller_id, oid)
t2(seller_id, buyer_id, oid)
同乙個資料,冗餘兩份,乙份以buyer_id來分庫,滿足買家的查詢需求;乙份以seller_id來分庫,滿足賣家的查詢需求。
如何實施資料的冗餘,以及如何保證資料的一致性,是今天將要討論的內容。
二,如何進行資料冗餘
(1)服務同步雙寫
顧名思義,由服務層同步寫冗餘資料,如上圖1-4流程:
優點:
缺點:
如果系統對處理時間比較敏感,引出常用的第二種方案。
(2)服務非同步雙寫
資料的雙寫並不再由服務來完成,服務層非同步發出乙個訊息,通過訊息匯流排傳送給乙個專門的資料復**務來寫入冗餘資料,如上圖1-6流程:
優點:
缺點:
不管是服務同步雙寫,還是服務非同步雙寫,服務都需要關注「冗餘資料」帶來的複雜性。如果想解除「資料冗餘」對系統的耦合,引出常用的第三種方案。
(3)線下非同步雙寫
為了遮蔽「冗餘資料」對服務帶來的複雜性,資料的雙寫不再由服務層來完成,而是由線下的乙個服務或者任務來完成,如上圖1-6流程:
優點:
缺點:
不管哪種方案,畢竟不是分布式事務,萬一出現資料不一致,怎麼辦呢?
高併發的情況下,實時一致性很難,方**是:最終一致性。
實現方式是:非同步檢測,非同步修復。
三,如何保證資料的一致性
(1)線下掃瞄全量資料法
如上圖所示,線下啟動乙個離線的掃瞄工具,不停的比對正表t1和反表t2,如果發現資料不一致,就進行補償修復。
優點:
缺點:
有沒有只掃瞄「可能存在不一致可能性」的資料,而不是每次掃瞄全部資料,以提高效率的優化方法呢?
(2)線下掃瞄增量資料法
每次只掃瞄增量的日誌資料,就能夠極大提高效率,縮短資料不一致的時間視窗,如上圖1-4流程所示:
當然,我們還是需要乙個離線的掃瞄工具,不停的比對日誌log1和日誌log2,如果發現資料不一致,就進行補償修復
優點:
缺點:
有沒有實時檢測一致性並進行修復的方法呢?
(3)線上實時檢測「訊息對」法
這次不是寫日誌了,而是向訊息匯流排傳送訊息,如上圖1-4流程所示:
這次不是需要乙個週期掃瞄的離線工具了,而是乙個實時訂閱訊息的服務不停的收訊息。
假設正常情況下,msg1和msg2的接收時間應該在3s以內,如果檢測服務在收到msg1後沒有收到msg2,就嘗試檢測資料的一致性,不一致時進行補償修復。
優點:
缺點:
however,技術方案本身就是乙個投入產出比的折衷,可以根據業務對一致性的需求程度決定使用哪一種方法。我曾經做過im系統,好友關係鏈上億,好友資料正反表的資料冗餘,使用的就是方法二。
四,總結
網際網路資料量大的業務場景,常常:
(1)服務同步雙寫法能夠很容易的實現資料冗餘
(2)為了降低時延,可以優化為服務非同步雙寫法
(3)為了遮蔽「冗餘資料」對服務帶來的複雜性,可以優化為線下非同步雙寫法
(1)最簡單的方式,線下指令碼掃全量資料比對
(2)提高效率的方式,線下指令碼掃增量資料比對
(3)最實時的方式,線上檢測「訊息對」
session一致性架構設計
什麼是session?由於http協議是無狀態的協議,因此它不會去記住上一次瀏覽器訪問伺服器時的資訊。同乙個使用者的兩次操作,與兩個不同使用者的操作,對它來說是一樣的。這樣雖然滿足了網際網路web應用的海量訪問的需求,但是對於現今類似電商的應用來說,是需要實現登入以及身份驗證需求的,但是無狀態的ht...
強一致性 弱一致性 最終一致性
這種方式在es等分布式系統中也有體現,可以設定主shard提交即返回成功,或者需要replica shard提交成功再返回。提到分布式架構就一定繞不開 一致性 問題,而 一致性 其實又包含了資料一致性和事務一致性兩種情況,本文主要討論資料一致性 事務一致性指acid 複製是導致出現資料一致性問題的唯...
session一致性架構設計實踐
一 緣起 什麼是session?伺服器為每個使用者建立乙個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同乙個上下文。web開發中,web server 可以自動為同乙個瀏覽器的訪問使用者自動建立 session 提供資料儲存功能。最常見的,會把使用者的登入資訊 使用者資訊儲存在 session...