一文徹底理解Multi-Paxos
- 前言
- 什么是Multi-Paxos
- Chubby 是如何實作multi-paxos的
- 寫請求
- 讀請求
前言
?之前寫了篇Basic Paxos的文章,大家閱讀了后應該就知道了Basic Paxos只能就單個值(Value)達成共識,當需要對一系列值達成共識的時候,Basic Paxos就不管用了,雖然可以通過每收到一個值時,就執行一次Basic Paxos演算法的方式,
什么是Multi-Paxos
?其實Multi-Paxos只是一種思想,不是演算法,它是指基于Multi-Paxos思想,通過多個Basic Paxos實體來實作一系列值的共識演算法(比如著名的Raft演算法等),
?Basic Paxos是通過兩階段提交來達成共識的,在第一階段,準備階段的時候,只有接收到大多數準備回應的提議者,才能發起接受請求進入接受階段,如下圖所示:

?現在,如果直接通過多次執行basic paxos實體,來實作一系列值的共識,就會存在以下幾個問題:
- 多個提議者同時提交議案,可能會出現因為議案編號沖突,導致在準備階段沒有提議者接收到很多的準備回應,造成協商失敗,需要重新協商,比如,一個擁有3個節點的集群,如果2個節點作為提議者同時議案,就可能發生因為沒有提議者接收大多數回應而準備失敗,需要重新協商,
- 準備階段和接受階段實際上是兩輪RPC通信,在往返訊息多的情況下,有可能造成大量延遲,
?為了解決上述問題,考慮引入了一個新的角色節點,領導者(Leader),把它作為唯一提議者,這樣就不存議案提交沖突的問題了,

?而領導者的選舉,是需要自己來實作的,接下來,就該考慮如何優化Basic Paxos,一般考慮省掉準備階段,直接進入接受階段,這樣,領導者的節點,命令是最新的,不再需要通過準備請求來發現之前被大多數節點通過的議案,領導者可以獨立地指定議案中的值,這樣就可以直接進入接受階段了,

?從上圖可以看出,Multi-Paxos 引入領導者節點之后,因為只有領導者節點一個提議者,所以不存在議案沖突,當領導者節點進入穩定狀態時,就可以直接進入接受階段,很大程度上減少了往返的訊息數量,從而提升了性能,降低了延遲,下面我們通過一個例子來看一下,
Chubby 是如何實作multi-paxos的
?Chubby是一種松耦合式的分布式系統的鎖服務,GFS和Big-Table都是通過它來解決分布式協作、master節點選舉、元資料存盤等一系列同分布式鎖相關的問題,Chubby提供了粗粒度分布式鎖服務,它的整個系統結構主要由服務端和客戶端兩部分組成,客戶端通過RPC呼叫和服務端進行通信,
? Chubby中的master是唯一的提議者,這樣就不會出現多個提議者同時提交議案從而造成議案沖突的情況,
? 那么,master節點是如何產生的呢?在Chubby集群(Chubby cell中,服務器節點采用basix paxos協議來進行投票選舉出,獲得半數票以上的服務器將作為master,也就是multi-paxos的領導節點,這樣就省掉了準備階段,一旦選舉出了master,Chubby就會在一段時間內不再將其他服務器作為master節點了,這段時間一般稱為租期(Lease),在運行程序中,master節點會通過不斷續租的方式來延長租期,比如,幾天內都是同一個節點作為master節點,如果master節點故障了,那么會在租期到期后, 其他節點又發起新一輪投票選舉出新的master節點,新master節點將執行新的租期,
?Chubby的客戶端首先過向記錄有Chubby服務端機器串列的DNS來請求獲取所有的Chubby服務器串列,然后逐一發起請求詢問該服務器是否是Master,在這個詢問程序中,那些非Master的服務器,則會將當前Master所在的服務器標志反饋給客戶端,這樣客戶端就能很快速的定位到Master服務器了,
? 只要該Master服務器正常運行,那么客戶端就會將所有的請求都發送到該Master服務器上,所有的讀請求和寫請求都是由master來處理,
寫請求
? 當master從客戶端接收到寫請求后,作為提議者會采用basic paxos協議將該寫請求廣播給所有節點后,并且在過半的節點接受寫請求之后,再回應給客戶端寫請求成功,
讀請求
? 當master接收到讀請求后,主節點只需要查詢本地資料,然后回傳給客戶端就可以了,為了減少客戶端和服務端頻繁的讀請求造成服務端的壓力,會在客戶端對檔案內容和元資料進行快取,雖然通過快取提升了性能,但是也帶來了一致性的問題,Chubby采取租期機制來保證資料的一致性,每個客戶端的快取同master租期關聯,可以理解為客戶端快取都有一個租期,一旦租期到期,客戶端就需要向master續訂租期以繼續維持快取的有效性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/231488.html
標籤:區塊鏈
上一篇:Flutter 介面回呼callback 具體實作案例
下一篇:成功解決:chaincode argument error: json: cannot unmarshal xxx into Go struct field .Args of type string
