ZooKeeper狀態的每一次改變基本的資訊

2021-08-22 10:08:45 字數 2468 閱讀 1821

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。

每一次監考都是成長

前言 監考前 當然是看文件了。就是那本問題手冊。雖然認真的看來文件,但是想著,應該有不會遇到什麼問題吧。不過看提起了解,防患於未然還是非常好的。考試中 一共監考了三場。第一場很好,沒什麼問題。學校的老師說,咱們做的系統越來越好了。當時聽了心裡還是非常的驕傲的。哈 還聽說現在學校的系統都是咱們大公尺時...

抓住每一次學習的機會

張晗 最近應該是在研究分布式吧,有幸能幫 做一下測試方面的測試,雖然到現在還沒有做出來,但是是一次很好的學習機會。loadrunner,是一種 系統行為和效能的負載 測試工具。通過以模擬上千萬使用者實施併發負載及實時效能監測的方式來確認和查詢問題,loadrunner能夠對整個企業架構進行測試。以前...

自考總結 每一次經歷都是收穫

前言 據公布成績也已經過去了整整一周的時間,這篇總結終於和大家見面了。經過了四次自考覺得學習方法才是最重要的,只要把這些知識和原來學過的內容建立起練習就可以每次都可以輕鬆掌握乙個科目的知識,這也就體現 了i 1的魅力。再有兩門就考完了所有的理論科目,在這個過程中不斷地去體會和總結自己的學習方法,不去...