柚子快報邀請碼778899分享:Zookeeper的選主流程
柚子快報邀請碼778899分享:Zookeeper的選主流程
Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現(xiàn)這個機制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復模式(選主)和廣播模式(同步)。當服務啟動或者在領導者崩潰后,Zab就進入了恢復模式,當領導者被選舉出來,且大多數(shù)Server完成了和leader的狀態(tài)同步以后,恢復模式就結束了。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。leader選舉是保證分布式數(shù)據(jù)一致性的關鍵。
出現(xiàn)選舉主要是兩種場景:初始化、leader不可用。
當zk集群中的一臺服務器出現(xiàn)以下兩種情況之一時,就會開始leader選舉: 1: 服務器初始化啟動。 2: 服務器運行期間無法和leader保持連接。
而當一臺機器進入leader選舉流程時,當前集群也可能處于以下兩種狀態(tài): 1: 集群中本來就已經(jīng)存在一個leader。 2: 集群中確實不存在leader。
首先第一種情況,通常是集群中某一臺機器啟動比較晚,在它啟動之前,集群已經(jīng)正常工作,即已經(jīng)存在一臺leader服務器。當該機器試圖去選舉leader時,會被告知當前服務器的leader信息,它僅僅需要和leader機器建立連接,并進行狀態(tài)同步即可。
重點是leader不可用了,此時的選主制度。投票信息中包含兩個最基本的信息。 sid : 即server id,用來標識該機器在集群中的機器序號。 zxid : 即zookeeper事務id號。
ZooKeeper狀態(tài)的每一次改變, 都對應著一個遞增的Transaction id,,該id稱為zxid.,由于zxid的遞增性質(zhì), 如果zxid1小于zxid2,,那么zxid1肯定先于zxid2發(fā)生。創(chuàng)建任意節(jié)點,或者更新任意節(jié)點的數(shù)據(jù), 或者刪除任意節(jié)點,都會導致Zookeeper狀態(tài)發(fā)生改變,從而導致zxid的值增加。
以(sid,zxid)的形式來標識一次投票信息。
例如:如果當前服務器要推舉sid為1,zxid為8的服務器成為leader,那么投票信息可以表示為(1,8)
集群中的每臺機器發(fā)出自己的投票后,也會接受來自集群中其他機器的投票。每臺機器都會根據(jù)一定的規(guī)則,來處理收到的其他機器的投票,以此來決定是否需要變更自己的投票。
規(guī)則如下 : 1: 初始階段,都會給自己投票。 2: 當接收到來自其他服務器的投票時,都需要將別人的投票和自己的投票進行pk,規(guī)則如下: 優(yōu)先檢查zxid。zxid比較大的服務器優(yōu)先作為leader。如果zxid相同的話,就比較sid,sid比較大的服務器作為leader。
所有服務啟動時候的選舉流程: 三臺服務器 server1、server2、server3:
server1 啟動,一臺機器不會選舉。server2 啟動,server1 和 server2 的狀態(tài)改為 looking,廣播投票server3 啟動,狀態(tài)改為 looking,加入廣播投票。初識狀態(tài),互不認識,大家都認為自己是王者,投票也投自己為 Leader。投票信息說明,票信息本來為五元組,這里為了邏輯清晰,簡化下表達。
初識 zxid = 0,sid 是每個節(jié)點的名字,這個 sid 在 zoo.cfg 中配置,不會重復。 1: 初始 zxid=0,server1 投票(1,0),server2 投票(2,0),server3 投票(3,0)
2: server1 收到 投票(2,0)時,會先驗證投票的合法性,然后自己的票進行 pk,pk 的邏輯是先比較 zxid,server1(zxid=server2(zxid)=0,zxid 相等再比較 sid,server1(sid) 3: TODO 這里最終是 2 還是 3,需要做實驗確定。 4: server2 收到 server1 投票,會先驗證投票的合法性,然后 pk,自己的票獲勝,server 不用更新自己的票,pk 后,重新在發(fā)送一次投票。 5: 統(tǒng)計投票,pk 后會統(tǒng)計投票,如果半數(shù)以上的節(jié)點投出相同的票,確定選出了 Leader。 6: 選舉結束,被選中節(jié)點的狀態(tài)由 LOOKING 變成 LEADING,其他參加選舉的節(jié)點由 LOOKING變成 FOLLOWING。如果有 Observer 節(jié)點,如果 Observer 不參與選舉,所以選舉前后它的狀態(tài)一直是 OBSERVING,沒有變化。 簡單地說: 開始投票 ->節(jié)點狀態(tài)變成 LOOKING -> 每個節(jié)點選自己-> 收到票進行 PK -> sid 大的獲勝 -> 更新選票 -> 再次投票 -> 統(tǒng)計選票,選票過半數(shù)選舉結果 -> 節(jié)點狀態(tài)更新為自己的角色狀態(tài)。 柚子快報邀請碼778899分享:Zookeeper的選主流程 參考文章
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。