zookeeper作為分布式協調工具,具有很廣泛的應用,zookeeper集群選主機制究竟如何實現?下面來進行分析。
在zookeeper集群中,主要分為三者角色,而每乙個節點同時只能扮演一種角色,這三種角色分別是:
(1). leader 接受所有follower的提案請求並統一協調發起提案的投票,負責與所有的follower進行內部的資料交換(同步);
(2). follower 直接為客戶端服務並參與提案的投票,同時與leader進行資料交換(同步);
(3). observer 直接為客戶端服務但並不參與提案的投票,同時也與leader進行資料交換(同步);observer的作用是為了拓展系統,提高讀取速度。
每個server在工作過程中有四種狀態:
looking:競選狀態,當前server不知道leader是誰,正在搜尋。
leading:領導者狀態,表明當前伺服器角色是leader。
following:隨從狀態,表明當前伺服器角色是follower,同步leader狀態,參與投票。
observing,觀察狀態,表明當前伺服器角色是observer,同步leader狀態,不參與投票。
選主機制
zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步。實現這個機制的協議叫做zab協議。zab協議有兩種模式,它們分別是恢復模式(選主)和廣播模式(同步)。當服務啟動或者在領導者崩潰後,zab就進入了恢復模式,當領導者被選舉出來,且大多數server完成了和leader的狀態同步以後,恢復模式就結束了。狀態同步保證了leader和server具有相同的系統狀態。leader選舉是保證分布式資料一致性的關鍵。
當zk集群中的一台伺服器出現以下兩種情況之一時,就會開始leader選舉。
(1)伺服器初始化啟動。
(2)伺服器執行期間無法和leader保持連線。
而當一台機器進入leader選舉流程時,當前集群也可能處於以下兩種狀態。
(1)集群中本來就已經存在乙個leader。
(2)集群中確實不存在leader。
首先第一種情況,通常是集群中某一台機器啟動比較晚,在它啟動之前,集群已經正常工作,即已經存在一台leader伺服器。當該機器試圖去選舉leader時,會被告知當前伺服器的leader資訊,它僅僅需要和leader機器建立連線,並進行狀態同步即可。
下面重點看第二種情況,即集群中leader不存在的情況下如何進行leader選舉。
資料模型
投票資訊中包含兩個最基本的資訊。
sid:即server id,用來標識該機器在集群中的機器序號。
zxid:即zookeeper事務id號。zookeeper狀態的每一次改變, 都對應著乙個遞增的transaction id, 該id稱為zxid. 由於zxid的遞增性質, 如果zxid1小於zxid2, 那麼zxid1肯定先於zxid2發生. 建立任意節點, 或者更新任意節點的資料, 或者刪除任意節點, 都會導致zookeeper狀態發生改變, 從而導致zxid的值增加.
以(sid,zxid)的形式來標識一次投票資訊。例如,如果當前伺服器要推舉sid為1,zxid為8的伺服器成為leader,那麼投票資訊可以表示為(1,8)
規則集群中的每台機器發出自己的投票後,也會接受來自集群中其他機器的投票。每台機器都會根據一定的規則,來處理收到的其他機器的投票,以此來決定是否需要變更自己的投票。
規則如下:
(1)初始階段,都會給自己投票。
(2)當接收到來自其他伺服器的投票時,都需要將別人的投票和自己的投票進行pk,規則如下:
優先檢查zxid。zxid比較大的伺服器優先作為leader。
如果zxid相同的話,就比較sid,sid比較大的伺服器作為leader。
假設當前集群中有5臺機器組成。sid分別為1,2,3,4,5。zxid分別為9,9,9,8,8,並且此時sid為2的機器是leader。某一時刻,1和2的伺服器掛掉了,集群開始進行選主。
在第一次投票中,由於無法檢測到集群中其他機器的狀態資訊,因此每台機器都將自己作為被推舉的物件來進行投票。於是sid為3,4,5的機器,投票情況分別為(3,9),(4,8),(5,8)
每台機器把投票發出後,同時也會接收到來自另外兩台機器的投票。
對於server3來說,接收到(4,8),(5,8)的投票,對比後由於自己的zxid要大於收到的另外兩個投票,因此不需要做任何變更。
對於server4來說,接收到(3,9),(5,8)的投票,對比後由於(3,9)這個投票的zxid大於自己,因此需要變更投票為(3,9),然後繼續將這個投票傳送給另外兩台機器。
對於server5來說,接收到(3,9),(4,8)的投票,對比後由於(3,9)這個投票的zxid大於自己,因此需要變更投票為(3,9),然後繼續將這個投票傳送給另外兩台機器。
經過第二輪投票後,集群中的每台機器都會再次受到其他機器的投票,然後開始統計投票。判斷是否有過半的機器收到相同的投票資訊,如果有,那麼該投票的sid會成為新的leader。
機器總數為5臺,server3,4,5都收到投票(3,9)。因此server3成為leader。
ES的選主機制
es集群中必須 有且只有乙個master節點,如果出現了兩個master節點 腦裂問題 那麼就出問題了,由哪乙個master節點來管理集群呢,傻傻的分不清楚,是不!那麼怎樣來進行master的選舉呢?主要根據以下三個方面來進行es的選舉 對有資格成為master的節點進行nodeid排序,每一次選舉...
17 kafka分割槽選主機制
leader的選擇方法非常多,大資料領域常用的的選舉方法有如下集中 1 zab zookeeper使用 a 快速leader選舉 leader election b 發現或者版本建立 epoch establish c 同步 follower從leader同步資料和狀態 d 廣播 leader廣播資...
zookeeper的選主機制的實現過程以及原理
zookeeper是乙個分布式的,開放原始碼的分布式應用程式協調服務,它包含乙個簡單的原語集,分布式式應用程式可以基於它實現同步服務,配置維護和命名服務等。zookeeper是hadoop的乙個子專案。在分布式應用中,由於部分開發者不能很好的使用鎖機制,以及基於訊息的協調機制不適合在某些應用中使用,...