分布式一致性 冪等

2021-09-02 06:43:00 字數 1881 閱讀 5003

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

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

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

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

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

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

現在先丟擲問題,假設有乙個主資料中心在北京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傳送了多條更新請求,如何保證順序性要求?

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

對於第乙個問題,比較好解決,我們先看看乙個tcp/ip協議鏈結建立的過程

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

簡單的通訊模型是這樣的

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

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

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

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

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

下面在看看第二個問題,如何保持資料的一致性更新,這個還是可以參考tcp/ip的協議。

首先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成功的應答。

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

對於第三個問題,這個就比較複雜了

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

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

[url]

分布式一致性

分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...

分布式一致性

分布式系統的乙個重要問題是資料的複製。對資料的複製一般有兩個原因 資料複製的主要難題是保持各個副本的一致性。即在更新乙個副本時,必須確保同時更新其他的副本,否則資料的各個副本將不再相同。一致性模型實質上是程序和資料儲存之間的乙個約定。正常情況下,乙個資料項上執行讀操作時,它期待該操作返回的是該資料在...

分布式一致性方案

首先,先說一下。老外提出了乙個快取更新套路,名為 cache aside pattern 其中就指出 不是的。假設這會有兩個請求,乙個請求a做查詢操作,乙個請求b做更新操作,那麼會有如下情形產生 快取剛好失效 請求a查詢資料庫,得乙個舊值 請求b將新值寫入資料庫 請求b刪除快取 請求a將查到的舊值寫...