我們在了解分布式選舉演算法之前,我們需要這樣一種演算法產生的背景。在乙個分布式系統中,因為各種意外的因素,有的伺服器可能會崩潰或變得不可靠,它就不能和其他伺服器達成一致狀態。因而這樣就需要一種consensus協議,來確保伺服器的容錯性,也就是說即使系統中有一兩個伺服器節點crash,也不會影響其處理過程。為了讓容錯方式達成一致,我們不可能要求所有的伺服器節點100%都達成consensus狀態,只要超過半數的大多數伺服器節點consensus即可,假設有n臺伺服器節點,(n/2)+1 就超過半數,即可代表大多數了。那麼,今天筆者給大家分享的就是raft分布式選舉演算法。
raft為了實現consensus這個目標,這個過程如果選舉一樣,參選者需要說服大多數伺服器節點投票給他,一旦選定後就跟隨其操作。在raft中,任何時候乙個伺服器節點可以扮演下面角色之一:
leader:處理所有客戶端互動,日誌複製等操作,一般一次只有乙個leader。
follower:類似選民,處於被動狀態。
candidate:類似proposer,可以被選為乙個新的leader。
任何乙個伺服器節點都可以成為乙個candidate,它向其他伺服器節點follower發出要求選舉自己的請求,如下圖所示:
其他伺服器應答同意,發出ok。如下圖所示:
需要注意的是,如果在這個過程當中,有乙個followercrash掉,沒有收到請求選舉的要求,因此候選者可以自己選舉自己,只要達到 (n/2)+1 的大多數票,候選人還是可以成為leader的。
在候選者成為leader後,它可以向其他follower節點傳送指令,比如進行日誌複製,如下圖所示:
之後,通過心跳進行日誌複製等通知,如下所示:
在執行的過程當中,一旦該集群的leader當場crash了,那麼follower中有乙個成為候選者,發出投票選舉邀請,如下圖所示:
在follower同意後,其成為leader,繼續承擔日誌複製等操作動作,如下圖所示:
這裡需要注意的是,在整個選舉過程當中是有乙個時間限制的,如下圖所示:
出現在split note的情況,是因為如果同時有兩個候選人向其他節點發出投票邀請,這時通過類似的加時賽來解決,兩個候選者在一段timeout,比如100ms互相不服氣的等待後,因為雙方得到的票數是一樣的,一半對一半,那麼在100ms後,再由這兩個候選者發出投票邀請,這時同時的概率大大降低,那麼首先發出邀請投票的候選者得到大多數同意票後,成為leader,而另外的乙個候選者後來發出投票邀請,那些follower選民已經投票給了第乙個候選者,此時不能再投票給它,它就成為落選者了,最後這個落選者也就成為一名普通的follower了。
下面通過以日誌複製為例子來說明raft分布式選舉演算法,假設這裡leader已經選出,這時候客戶端發出乙個新增的請求,比如日誌內容是"smartloli",如下所圖所示:
在leader傳送的指令下,follower需要遵循它的指令,都將這個新的日誌內容追加到他們各自的日誌中:
大多數follower伺服器節點日誌寫入磁碟檔案後,確認追加成功,發出commited ok,如下圖所示:
再下乙個心跳heartbeats中,leader會通知所有的follower更新commited。對於每個新的日誌記錄,重複上述操作過程。如果在這個過程當中,發生了網路通訊故障,使得leader不能訪問大多數followers了,那麼leader只能正常更新它能訪問的那些follower伺服器節點,而大多數的伺服器follower因為沒有了leader,他們重新選擇乙個候選者作為leader,然後這個新的leader作為代表與外界進行互動,如果外界傳送新的請求操作,比如新增新的日誌,這個新的leader就按照上述步驟通知大多數followers伺服器節點,如果這時網路故障修復了,那麼原先的leader就要降級成為follower,在失聯階段這個老leader的任何更新都不能算commit,都要roll back,接受新的leader的新的更新操作。
****:
twitter:
qq群(hadoop - 交流社群1):
424769183
分布式系統選舉演算法剖析
我們在了解分布式選舉演算法之前,我們需要這樣一種演算法產生的背景。在乙個分布式系統中,因為各種意外的因素,有的伺服器可能會崩潰或變得不可靠,它就不能和其他伺服器達成一致狀態。因而這樣就需要一種consensus協議,來確保伺服器的容錯性,也就是說即使系統中有一兩個伺服器節點crash,也不會影響其處...
分布式系統選舉演算法剖析
我們在了解分布式選舉演算法之前,我們需要這樣一種演算法產生的背景。在乙個分布式系統中,因為各種意外的因素,有的伺服器可能會崩潰或變得不可靠,它就不能和其他伺服器達成一致狀態。因而這樣就需要一種consensus協議,來確保伺服器的容錯性,也就是說即使系統中有一兩個伺服器節點crash,也不會影響其處...
分布式選舉演算法
主節點,在乙個分布式集群中負責對其他節點的協調和管理,也就是說,其他節點都必須聽從主節點的安排。主節點的存在,就可以保證其他節點的有序執行,以及資料庫集群中的寫入資料在每個節點上的一致性。這裡的一致性是指,資料在每個集群節點中都是一樣的,不存在不同的情況。下面介紹集中選舉演算法。bully 演算法在...