關於分布式系統的資料一致性問題 一

2021-08-22 06:10:27 字數 1777 閱讀 7959

關於分布式系統的資料一致性問題(一)

最近寫了乙個關於 鐵道部購票系統的若干文章 

鐵道部新客票系統的設計(一)

鐵道部新客票系統的設計(二)

鐵道部新客票系統的設計(三)

正好遇到乙個博友,諮詢了乙個問題,這個問題正好可以作為分布式系統的資料一致性的簡單例子,當然,這個只是比較簡單的情況

現在先丟擲問題,假設有乙個主資料中心在北京m,然後有成都a,上海b兩個地方資料中心,現在的問題是,假設成都上海各自的資料中心有記錄變更,需要先同步到主資料中心,主資料中心更新完成之後,在把最新的資料分發到上海,成都的地方資料中心a,地方資料中心更新資料,保持和主資料中心一致性(資料庫結構完全一致)。資料更新的訊息是通過一台中心的mq進行**。

先把問題簡單化處理,假設a增加一條記錄message_a,傳送到m,b增加一條記錄 message_b傳送到m,都是通過mq伺服器進行**,那麼m系統接收到條訊息,增加兩條資料,那麼m在把增加的訊息**給a,b,a和b找到自己缺失的資料,更新資料庫。這樣就完成了乙個資料的同步。

從正常情況下來看,都沒有問題,邏輯完全合理,但是請考慮以下三個問題

1 如何保證a->m的訊息,m一定接收到了,同樣,如何保證m->a的訊息,m一定接收到了

2 如果資料需要一致性更新,比如a傳送了三條訊息給m,m要麼全部儲存,要麼全部不儲存,不能夠只儲存其中的幾條記錄。我們假設更新的資料是一條條傳送的。

3 假設同時a傳送了多條更新請求,如何保證順序性要求?

這兩個問題就是分布式環境下資料一致性的問題

我們的思路可以從這個上面出發,在簡化一下,就乙個請求,乙個應答。

簡單的通訊模型是這樣的

a->m : 你收到我的一條訊息沒有,訊息的id是12345

m->a:  我收到了你的一條訊息資料,訊息資料是id;12345

這樣就乙個請求,乙個應答,就完成了一次可靠性的傳輸。如果a一致沒有收到m的應答,就不斷的重試。這個時候m就必須保證冪等性。不能重複的處理訊息。那麼最極端的情況是,怎麼也收不到m的應答,這個時候是系統故障。自己檢查一下吧。

這麼設計就要求,a在傳送訊息的時候持久化這個訊息的資料內容,然後不斷的重試,一旦接收到m的應答,就刪除這條訊息。同樣,m端也是一樣的。不要相信mq的持久化機制,不是很靠譜的。

那麼m給a傳送訊息也採取類似的原理就可以了。

首先a傳送一條訊息給m:我要傳送一批訊息資料給你,批次號是10000,資料是5條。

m傳送一條訊息給a:ok,我準備好了,批次號是10000,傳送方你a

接著a傳送5條訊息給m,訊息id分別為1,2,3,4,5 ,批次號是10000,

緊接著,a傳送乙個資訊給m:我已經完成5小訊息的傳送,你要提交資料更新了

接下來可能傳送兩種情況

1 那麼m傳送訊息給a:ok,我收到了5條訊息,開始提交資料

2 那麼m也可以傳送給a:我收到了5條訊息,但是還缺少,請你重新傳送,那麼a就繼續傳送,直到a收到m成功的應答。

整個過程相當複雜。這個也就是資料一旦分布了,帶來最大的問題就是資料一致性的問題。這個成本非常高。

這個最核心的問題就是訊息的順序性,我們只能在每個訊息發乙個訊息的序列號,但是還是沒有最好解決這個問題的辦法。因為訊息接收方不知道順序。因為即使給他了序列號,也沒有辦法告訴他,這個應該何時處理。最好的辦法是在第二種方式的基礎作為乙個批次來更新。

這個只是以最簡單的例子來說明一下分布式系統的要保證資料一致性是一件代價很大的事情。當然有的博主會說,這個何必這麼複雜,直接資料庫同步不就可以了。這個例子當然是沒有問題的,萬一這個幾個庫的模型都不一樣,我傳送訊息要處理的事情不一樣的。怎麼辦?

關於分布式系統的資料一致性問題(一)

關於分布式系統的資料一致性問題 三

在我的博文裡面關於分布式系統的資料一致性問題 二 裡面主要介紹了資料分布的情況下保證一致性的情況,在第二篇文章裡面,我這裡提出了三個問題 訂單系統呼叫支付系統支付訂單,支付成功,但是返回給訂單系統資料超時,訂單還是 i 初始狀態 但是此時會員帳戶餘額 100,會員肯定會馬上找京東罵京東,為啥不給老子...

關於分布式系統的資料一致性問題 三

本文轉至 為方便日後查閱 在我的博文裡面 關於分布式系統的資料一致性問題 二 裡面主要介紹了資料分布的情況下保證一致性的情況,在第二篇文章裡面,我這裡提出了三個問題 訂單系統呼叫支付系統支付訂單,支付成功,但是返回給訂單系統資料超時,訂單還是i 初始狀態 但是此時會員帳戶餘額100,會員肯定會馬上找...

關於分布式系統的資料一致性問題 三

在我的博文裡面關於分布式系統的資料一致性問題 二 裡面主要介紹了資料分布的情況下保證一致性的情況,在第二篇文章裡面,我這裡提出了三個問題 訂單系統呼叫支付系統支付訂單,支付成功,但是返回給訂單系統資料超時,訂單還是i 初始狀態 但是此時會員帳戶餘額100,會員肯定會馬上找京東罵京東,為啥不給老子發貨...