Leader Election 選舉算法

今天講一講分佈式系統中必不可少的選舉算法。
leader 就是一堆服務器中的協調者,某一個時刻只能有一個leader且全部服務器都認可這個leader. leader election就是在一組進程中,選舉一個leader且讓該組的進程都贊成這個leader.算法

假設有N個process, 每一個process都有個能夠比較的ID,能夠提出選舉。
leader election算法要知足兩點:apache

  • safety: 每個進程要麼不知道結果,要麼知道正確的結果(不會選錯leader)。
  • liveness: 選舉算法總會結束,每個進程都知道告終果。

Ring leader election 環算法

processes組成了一個環,第i個 process p_i 能夠和 p_(i+1)modN通訊。服務器

若是進程i發現原來的leader掛了,它就會發起選舉,發送一個包含本身ID a_i 「Election」的信息。而後當某個進程j收到了這個信息的時候,會將這個a_i與本身的ID a_j比,若是a_i>a_j, 繼續轉發這條消息,若是a_i<a_j且它以前沒有轉發過消息,就把a_i取代掉而後把消息發送出去。若是發現收到的標識符和本身的同樣,表明本身成爲leader,而後把本身當選的信息發送出去。分佈式

最壞狀況分析:一個進程發起選舉,若是它的上一個進程具備最大標識符,則選舉消息到達上一個進程須要(N—1)次傳遞,而後消息又要N次才能宣佈它當選,最後須要N個消息告訴你們它當選了,因此須要(3N-1)個消息。最好狀況就是發起選舉的進程就是leader,只須要(2N)個消息。若是有多個進程同時發起選舉,那麼只有具備最大ID的進程會完成選舉。google

可是環算法實用價值不多,由於在選舉過程當中若是有進程崩潰,選舉就沒法完成,不符合liveness的要求。orm

實際生產中的Leader Election

用Paxos-like (Paxos是解決一致性問題的一種方法) 來選舉。進程

Google Chubby

A system for locking同步

每一個process最多選舉一次,獲得最多選票且大於某一數值的process當選。it

Apache Zookeeper

Centralized service for maintaining configuration informationio

Paxos的變種Zab(Zookeeper Atomic Broadcast)。必須始終保持有leader。

每一個進程都向ZK文件系統中寫入本身的ID,只要保證寫入是原子性的,就把最大ID的進程選爲leader.

每一個進程都監視着正比如本身ID高的進程,若是那個進程是leader而後掛掉了,那麼它就成爲新的leader.

Bully Algorithm 霸道算法

假設系統是同步的,全部進程均可以互相通訊。當某一進程發現leader掛掉,若是本身ID最大,就宣佈本身是leader,不然向ID比本身高的進程發起選舉。發起選舉若是沒有收到迴應,就宣佈本身是leader,收到了迴應就等待比本身ID大的進程宣佈結果。
當一個進程收到從ID比本身低的進程發來的選舉消息時,就向更高的進程發起選舉。

最壞時間複雜度分析:只需5個消息傳遞時間

  1. 最小ID進程發起選舉
  2. 第二大ID進程迴應
  3. 第二大ID進程向最大ID進程發起選舉
  4. 最大ID進程無迴應,timtout
  5. 第二大ID進程宣佈當選
相關文章
相關標籤/搜索