主節點,在乙個分布式集群中負責對其他節點的協調和管理,也就是說,其他節點都必須聽從主節點的安排。主節點的存在,就可以保證其他節點的有序執行,以及資料庫集群中的寫入資料在每個節點上的一致性。這裡的一致性是指,資料在每個集群節點中都是一樣的,不存在不同的情況。下面介紹集中選舉演算法。
bully 演算法在選舉過程中,需要用到以下 3 種訊息:
bully 演算法選舉的原則是「長者為大」,意味著它的假設條件是,集群中每個節點均知道其他節點的 id。在此前提下,其具體的選舉過程是:
集群中每個節點判斷自己的 id 是否為當前活著的節點中 id 最大的,如果是,則直接向其他節點傳送 victory 訊息,宣誓自己的主權;
如果自己不是當前活著的節點中 id 最大的,則向比自己 id 大的所有節點傳送 election 訊息,並等待其他節點的回覆;
若在給定的時間範圍內,本節點沒有收到其他節點回覆的 alive 訊息,則認為自己成為主節點,並向其他節點傳送 victory 訊息,宣誓自己成為主節點;若接收到來自比自己 id 大的節點的 alive 訊息,則等待其他節點傳送 victory 訊息;
若本節點收到比自己 id 小的節點傳送的 election 訊息,則回覆乙個 alive 訊息,告知其他節點,我比你大,重新選舉。
bully 演算法的選擇特別霸道和簡單,誰活著且誰的 id 最大誰就是主節點,其他節點必須無條件服從。這種演算法的優點是,選舉速度快、演算法複雜度低、簡單易實現。
但這種演算法的缺點在於,需要每個節點有全域性的節點資訊,因此額外資訊儲存較多;其次,任意乙個比當前主節點 id 大的新節點或節點故障後恢復加入集群的時候,都可能會觸發重新選舉,成為新的主節點,如果該節點頻繁退出、加入集群,就會導致頻繁切主。
raft 演算法是典型的多數派投票選舉演算法,其選舉機制與我們日常生活中的民主投票機制類似,核心思想是「少數服從多數」。也就是說,raft 演算法中,獲得投票最多的節點成為主。
採用 raft 演算法選舉,集群節點的角色有 3 種:
raft 選舉的流程,可以分為以下幾步:
初始化時,所有節點均為 follower 狀態。
開始選主時,所有節點的狀態由 follower 轉化為 candidate,並向其他節點傳送選舉請求。
其他節點根據接收到的選舉請求的先後順序,回覆是否同意成為主。這裡需要注意的是,在每一輪選舉中,乙個節點只能投出一張票。
若發起選舉請求的節點獲得超過一半的投票,則成為主節點,其狀態轉化為 leader,其他節點的狀態則由 candidate 降為 follower。leader 節點與 follower 節點之間會定期傳送心跳包,以檢測主節點是否活著。
當 leader 節點的任期到了,即發現其他伺服器開始下一輪選主週期時,leader 節點的狀態由 leader 降級為 follower,進入新一輪選主。
raft 演算法具有選舉速度快、演算法複雜度低、易於實現的優點;缺點是,它要求系統內每個節點都可以相互通訊,且需要獲得過半的投票數才能選主成功,因此通訊量大。該演算法選舉穩定性比 bully 演算法好,這是因為當有新節點加入或節點故障恢復後,會觸發選主,但不一定會真正切主,除非新節點或故障後恢復的節點獲得投票數過半,才會導致切主。
zab(zookeeper atomic broadcast)選舉演算法是為 zookeeper 實現分布式協調功能而設計的。相較於 raft 演算法的投票機制,zab 演算法增加了通過節點 id 和資料 id 作為參考進行選主,節點 id 和資料 id 越大,表示資料越新,優先成為主。相比較於 raft 演算法,zab 演算法盡可能保證資料的最新性。所以,zab 演算法可以說是對 raft 演算法的改進。
使用 zab 演算法選舉時,集群中每個節點擁有 3 種角色:
選舉過程中,集群中的節點擁有 4 個狀態:
投票過程中,每個節點都有乙個唯一的三元組 (server_id, server_zxid, epoch),其中 server_id 表示本節點的唯一 id;server_zxid 表示本節點存放的資料 id,資料 id 越大表示資料越新,選舉權重越大;epoch 表示當前選取輪數,一般用邏輯時鐘表示。
zab 選舉演算法的核心是「少數服從多數,id 大的節點優先成為主」,因此選舉過程中通過 (vote_id, vote_zxid) 來表明投票給哪個節點,其中 vote_id 表示被投票節點的 id,vote_zxid 表示被投票節點的伺服器 zxid。zab 演算法選主的原則是:server_zxid 最大者成為 leader;若 server_zxid 相同,則 server_id 最大者成為 leader。
總結zab 演算法效能高,對系統無特殊要求,採用廣播方式傳送資訊,若節點中有 n 個節點,每個節點同時廣播,則集群中資訊量為 n*(n-1) 個訊息,容易出現廣播風暴;且除了投票,還增加了對比節點 id 和資料 id,這就意味著還需要知道所有節點的 id 和資料 id,所以選舉時間相對較長。但該演算法選舉穩定性比較好,當有新節點加入或節點故障恢復後,會觸發選主,但不一定會真正切主,除非新節點或故障後恢復的節點資料 id 和節點 id 最大,且獲得投票數過半,才會導致切主。
此文摘自極客時間聶鵬程老師的《分布式技術原理與演算法解析》,想深入學習可訂閱原文學習。
分布式選舉演算法Paxos
什麼是paxos演算法?paxos演算法是分布式計算領域中乙個非常重要的演算法,主要解決分布式系統如何就某個值 決議 達成一致的問題。乙個典型的場景是分布式資料庫的一致問題 如果分布式資料庫的各個節點初始狀態一致,又能執行相同的操作序列,那麼最後能達到乙個一致的狀態。但是如何保證在每個節點上執行相同...
分布式系統選舉演算法剖析
我們在了解分布式選舉演算法之前,我們需要這樣一種演算法產生的背景。在乙個分布式系統中,因為各種意外的因素,有的伺服器可能會崩潰或變得不可靠,它就不能和其他伺服器達成一致狀態。因而這樣就需要一種consensus協議,來確保伺服器的容錯性,也就是說即使系統中有一兩個伺服器節點crash,也不會影響其處...
分布式系統選舉演算法剖析
我們在了解分布式選舉演算法之前,我們需要這樣一種演算法產生的背景。在乙個分布式系統中,因為各種意外的因素,有的伺服器可能會崩潰或變得不可靠,它就不能和其他伺服器達成一致狀態。因而這樣就需要一種consensus協議,來確保伺服器的容錯性,也就是說即使系統中有一兩個伺服器節點crash,也不會影響其處...