從網路開始談Paxos演算法
一、 背景
paxos是大名鼎鼎的分散式一致性演算法, 但是它解決了什麼問題, 怎麼解決這些問題, 本文和大家一起探討。
二、舉例子
現在我們有四臺機器, 每個機器都有資料要資料要儲存,分別為v = a, v = b, v = c, v = d。
2. 1 假設我們只部署了一個memcache去儲存, 資料肯定一致性。 最終值肯定為a, b, c, d中的一位, 且每次讀取都會是同樣的值, 不會存在不一樣的值。
2.2 為了高可用,現在我們把memcache改成3個, 做資料備份。 每個memcache收到的資料序列(a, b, c, d), (c, d, a, b), (c, d, b, a), 讀者這裡肯定有疑問, 採用tcp傳輸不就有序了嗎? 注意這裡是因為四個機器分別傳輸過來, 跟tcp沒有關係,在不同memcache上接收順序完全可能不一樣。如果我們不採取任何策略處理, 會發現3個memcache的最終資料d, b, a。從不同的memcache取得的資料完全不一樣。怎麼辦? 讓資料有序起來。 a, b, c, d分別給個編號1,2,3,4. 編號越大代表值越新。新的可以覆蓋舊的,舊的不能覆蓋新的。 這樣所有的memcache都儲存了d值啦。
2.3 故事完了嗎? 沒有。 還有個問題, 在這個過程中, 中間某個時間點幾個memcahe可能收到的資料是這樣的(a, b, c), (c), (c)。 這時候可以認為一致了選擇了c。 如果c向網路廣播儲存的是我的值, 後面d又向網路廣播我的值才被儲存了, 估計整個網路都不知道到底存的誰的值。這個問題很重要, paxos演算法裡關係到誰才是真正的master。那怎麼辦呢? 加一輪檢查, 對比儲存的值和自己是否一致就知道是不是被選擇了(可以認為是master了)。
三、總結
解決無序性--通過編號有序
確認誰到底是master問題--通過第二步確認
四、paxos,zab, raft區別
第一輪能不能選出主, 選出主的資料是否完整。