分佈式概念:分佈式選舉(選舉主節點)

分佈式選舉
主節點,在一個分佈式集羣中負責對其他節點的協調和管理。

分佈式選舉的算法
序號選舉的算法( Bully 算法)

核心思想選取 ID 最大的節點作爲主節點。
在 Bully 算法中,節點的角色有兩種:普通節點和主節點。初始化時,所有節點都是平等的,都是普通節點,並且都有成爲主的權利。但是,當選主成功後,有且僅有一個節點成爲主節點,其他所有節點都是普通節點。當且僅當主節點故障或與其他節點失去聯繫後,纔會重新選主。

Bully 算法在選舉過程中,需要用到以下 3 種消息:
Election 消息,用於發起選舉;
Alive 消息,對 Election 消息的應答;
Victory 消息,競選成功的主節點向其他節點發送的宣誓主權的消息。

具體的選舉過程
1.集羣中每個節點判斷自己的 ID 是否爲當前活着的節點中 ID 最大的,如果是,則直接向其他節點發送 Victory 消息,宣誓自己的主權;
2.如果自己不是當前活着的節點中 ID 最大的,則向比自己 ID 大的所有節點發送 Election 消息,並等待其他節點的回覆;
3.若在給定的時間範圍內,本節點沒有收到其他節點回復的 Alive 消息,則認爲自己成爲主節點,並向其他節點發送 Victory 消息,宣誓自己成爲主節點;
4.若接收到來自比自己 ID 大的節點的 Alive 消息,則等待其他節點發送 Victory 消息;若本節點收到比自己 ID 小的節點發送的 Election 消息,則回覆一個 Alive 消息,告知其他節點,我比你大,重新選舉。

實際應用:
MongoDB 的分佈式選舉中,採用節點的最後操作時間戳來表示 ID,時間戳最新的節點其 ID 最大,也就是說時間戳最新的、活着的節點是主節點。

缺點:
1.需要每個節點有全局的節點信息,因此額外信息存儲較多。
2.任意一個比當前主節點 ID 大的新節點或節點故障後恢復加入集羣的時候,都可能會觸發重新選舉,成爲新的主節點。如果該節點頻繁退出、加入集羣,就會導致頻繁切主。

多數派算法(比如,Raft 算法、ZAB 算法)

Raft 算法

核心思想是“少數服從多數”。
採用 Raft 算法選舉,集羣節點的角色有 3 種:
Leader,即主節點,同一時刻只有一個 Leader,負責協調和管理其他節點;
Candidate,即候選者,每一個節點都可以成爲 Candidate,節點在該角色下纔可以被選爲新的 Leader;
Follower,Leader 的跟隨者,不可以發起選舉。

Raft 選舉的流程:
1.初始化時,所有節點均爲 Follower 狀態。
2.開始選主時,所有節點的狀態由 Follower 轉化爲 Candidate,並向其他節點發送選舉請求。
3.其他節點根據接收到的選舉請求的先後順序,回覆是否同意成爲主。這裏需要注意的是,在每一輪選舉中,一個節點只能投出一張票。
4.若發起選舉請求的節點獲得超過一半的投票,則成爲主節點,其狀態轉化爲 Leader,其他節點的狀態則由 Candidate 降爲 Follower。Leader 節點與 Follower 節點之間會定期發送心跳包,以檢測主節點是否活着。
5.當 Leader 節點的任期到了,即發現其他服務器開始下一輪選主週期時,Leader 節點的狀態由 Leader 降級爲 Follower,進入新一輪選主。

實際應用:
etcd 的集羣管理器 etcds,是一個高可用、強一致性的服務發現存儲倉庫,就是採用了 Raft 算法來實現選主和一致性的。

優點:Raft 算法具有選舉速度快、算法複雜度低、易於實現;
缺點:它要求系統內每個節點都可以相互通信,且需要獲得過半的投票數才能選主成功,因此通信量大。


具有優先級的民主投票:ZAB 算法
ZAB(ZooKeeper Atomic Broadcast)選舉算法是爲 ZooKeeper 實現分佈式協調功能而設計的。核心是“少數服從多數,ID 大的節點優先成爲主”。通過節點 ID 和數據 ID 作爲參考進行選主,節點 ID 和數據 ID 越大,表示數據越新,優先成爲主。

使用 ZAB 算法選舉時,集羣中每個節點擁有 3 種角色:
Leader,主節點;
Follower,跟隨者節點;
Observer,觀察者,無投票權。


選舉過程中,集羣中的節點擁有 4 個狀態:
Looking 狀態,即選舉狀態。當節點處於該狀態時,它會認爲當前集羣中沒有 Leader,因此自己進入選舉狀態。
Leading 狀態,即領導者狀態,表示已經選出主,且當前節點爲 Leader。
Following 狀態,即跟隨者狀態,集羣中已經選出主後,其他非主節點狀態更新爲 Following,表示對 Leader 的追隨。
Observing 狀態,即觀察者狀態,表示當前節點爲 Observer,持觀望態度,沒有投票權和選舉權。

投票過程中,每個節點都有一個唯一的三元組 (server_id, server_zxID, epoch),其中 server_id 表示本節點的唯一 ID;server_zxID 表示本節點存放的數據 ID,數據 ID 越大表示數據越新,選舉權重越大;epoch 表示當前選取輪數,一般用邏輯時鐘表示。

ZAB 算法選主的原則是:server_zxID 最大者成爲 Leader;若 server_zxID 相同,則 server_id 最大者成爲 Leader。

3個節點的選舉過程:
1.當系統剛啓動時,3 個服務器當前投票均爲第一輪投票,即 epoch=1,且 zxID 均爲 0。此時每個服務器都推選自己,並將選票信息 廣播出去。
2.根據判斷規則,由於 3 個 Server 的 epoch、zxID 都相同,因此比較 server_id,較大者即爲推選對象,因此 Server 1 和 Server 2 將 vote_id 改爲 3,更新自己的投票箱並重新廣播自己的投票。
3.此時系統內所有服務器都推選了 Server 3,因此 Server 3 當選 Leader,處於 Leading 狀態,向其他服務器發送心跳包並維護連接;Server1 和 Server2 處於 Following 狀態。


優點:性能高;

缺點:複雜度高,選舉時間長。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章