關(guān)于leader選舉會分為兩個過程:
1.啟動時(shí)leader的選舉
2.leader崩潰時(shí)的選舉
一
在每個節(jié)點(diǎn)剛啟動的時(shí)候,狀態(tài)都是Locking狀態(tài),然后就會開始選舉的流程,因?yàn)閘eader選舉至少需要兩臺服務(wù)器,所以一般會選舉三臺組成服務(wù)器集群。當(dāng)?shù)谝慌_服務(wù)器剛啟動的時(shí)候,它自己是無法進(jìn)行和完成leader選舉的,等待第二臺服務(wù)器啟動的時(shí)候,兩臺機(jī)器才可以相互通信。每臺機(jī)器都試圖找到leader,就進(jìn)入leader的選舉過程。
1.每一個服務(wù)器都會發(fā)起一個投票,由于剛開始第一輪啟動,所以都會選擇自己。然后生成一個(myid,Zxid.epoch)消息,epoch為0,zxid也為0.此時(shí)假設(shè)服務(wù)器A先啟動,則消息為(1,0),服務(wù)器B生成的消息為(2,0),然后將投票發(fā)給急群中的其他機(jī)器
2.接收來自其他各個服務(wù)器上的投票。集群中各個服務(wù)器接收到投票后,會先判斷該投票的有效性,先檢查版本是否本輪投票、是否來自Lock狀態(tài)的服務(wù)器。
3.處理該投票。先比較其他服務(wù)器的投票與自己的,比較順序?yàn)?
1.優(yōu)先檢查 ZXID。ZXID 比較大的服務(wù)器優(yōu)先作為Leader
2.如果 ZXID 相同,那么就比較 myid。myid 較大的服務(wù)器作為 Leader 服務(wù)器。
對于 Server1 而言,它的投票是(1, 0),接收 Server2的投票為(2, 0),首先會比較兩者的 ZXID,均為 0,再比較 myid,此時(shí) Server2 的 myid 最大,于是更新自己的投票為(2, 0),然后重新投票。
對于 Server2 而言,它不需要更新自己的投票,只是再次向集群中所有機(jī)器發(fā)出上一次投票信息即可。
此時(shí)更新投票為第二輪,epoch+1
4.統(tǒng)計(jì)投票信息,每次投票后,服務(wù)器都會統(tǒng)計(jì)投票信息,判斷是否已經(jīng)有過半機(jī)器接受到相同的投票信息,對于 Server1、Server2 而言,都統(tǒng)計(jì)出集群中已經(jīng)有兩臺機(jī)器接受了(2, 0)的投票信息,此時(shí)便認(rèn)為已經(jīng)選出了 Leader。
5.改變服務(wù)器狀態(tài)。一旦確定了 Leader,每個服務(wù)器就會更新自己的狀態(tài),如果是 Follower,那么就變更為FOLLOWING,如果是 Leader,就變更為 LEADING。
二、運(yùn)行過程中的 leader 選舉
當(dāng)集群中的 leader 服務(wù)器出現(xiàn)宕機(jī)或者不可用的情況時(shí),那么整個集群將無法對外提供服務(wù),而是進(jìn)入新一輪的Leader 選舉,服務(wù)器運(yùn)行期間的 Leader 選舉和啟動時(shí)期的 Leader 選舉基本過程是一致的。
1.變更狀態(tài)。Leader 掛后,余下的非 Observer 服務(wù)器都會將自己的服務(wù)器狀態(tài)變更為 LOOKING,然后開始進(jìn)入 Leader 選舉過程。
2.每個 Server 會發(fā)出一個投票。在運(yùn)行期間,每個服務(wù)器上的 ZXID 可能不同,此時(shí)假定 Server1 的 ZXID 為123,Server3的ZXID為122;在第一輪投票中,Server1和 Server3 都會投自己,產(chǎn)生投票(1, 123),(3, 122),然后各自將投票發(fā)送給集群中所有機(jī)器。接收來自各個服務(wù)器的投票。與啟動時(shí)過程相同。
3處理投票。與啟動時(shí)過程相同,此時(shí),Server1 將會成為 Leader。
4.統(tǒng)計(jì)投票。與啟動時(shí)過程相同。
5改變服務(wù)器的狀態(tài)。與啟動時(shí)過程相同.