Leader Election 選舉演算法

2021-08-13 18:27:42 字數 1368 閱讀 7820

今天講一講分布式系統中必不可少的選舉演算法。

leader 就是一堆伺服器中的協調者,某乙個時刻只能有乙個leader且所有伺服器都承認這個leader. leader election就是在一組程序中,選舉乙個leader且讓該組的程序都同意這個leader.

假設有n個process, 每個process都有個可以比較的id,可以提出選舉。

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最壞情況分析:乙個程序發起選舉,如果它的上乙個程序具有最大識別符號,則選舉訊息到達上乙個程序需要(n—1)次傳遞,然後訊息又要n次才能宣布它當選,最後需要n個訊息告訴大家它當選了,所以需要(3n-1)個訊息。最好情況就是發起選舉的程序就是leader,只需要(2n)個訊息。如果有多個程序同時發起選舉,那麼只有具有最大id的程序會完成選舉。

但是環演算法實用價值很少,因為在選舉過程中如果有程序崩潰,選舉就無法完成,不符合liveness的要求。

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

google chubby

a system for locking

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

apache zookeeper

centralized service for maintaining configuration information

paxos的變種zab(zookeeper atomic broadcast)。必須始終保持有leader。

每個程序都向zk檔案系統中寫入自己的id,只要保證寫入是原子性的,就把最大id的程序選為leader.

每個程序都監視著正好比自己id高的程序,如果那個程序是leader然後掛掉了,那麼它就成為新的leader.

假設系統是同步的,所有程序都可以互相通訊。當某一程序發現leader掛掉,如果自己id最大,就宣布自己是leader,否則向id比自己高的程序發起選舉。發起選舉如果沒有收到回應,就宣布自己是leader,收到了回應就等待比自己id大的程序宣布結果。

當乙個程序收到從id比自己低的程序發來的選舉訊息時,就向更高的程序發起選舉。

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

最小id程序發起選舉

第二大id程序回應

第二大id程序向最大id程序發起選舉

最大id程序無回應,timtout

第二大id程序宣布當選

選羊選車問題

有三個門,兩個羊乙個車。嘉賓選擇乙個門後,主持人開啟另外兩個門中的乙個,門裡是羊。嘉賓改選或者不改選。門後有車就中大獎。否則什麼都沒有。記得當年做這個題目的時候就與小李子和瘋子爭論的不休。當時時至今日仍然不能完全確定這是個概率問題。其實這個不完全是概率問題 因為概率中只是考慮了出現結果的可能性。但是...

九選六 九選三

駕照考試的一種方法,九選六 九個科目必須選六個科目參加考試。九選三 九個科目必須選三個科目參加考試 1 百公尺加減擋 考試目的 考核駕駛人對車輛擋位的熟練掌握。考試要求 車輛由百公尺起點線處起步,在百公尺內完成從最低擋逐級到最高擋的加速,以及再從最高擋逐級到二擋的減速過程。2 起伏路駕駛 考試目的 ...

TYVJ1579(選選位址)

演算法 最短路 其實這道題就是一道簡單的最短路 列舉,用floyd求出每兩個點之間的距離,最後列舉一遍設定城市的點,選乙個最小值即可。不知道當時考試的時候為什麼錯了 難道是沒開無向圖?program p1579 const maxn 200 var n,min,p longint a array 0...