在zookeeper集群中,節點也有不同的角色,承擔着不同角色。
zookeeper有三種角色:
- 老大:Leader (領導者) : 客戶端提供讀服務和寫服務。
- 老二:Follower(跟隨者) : 為客戶端提供讀服務,參與Leader選舉過程
- 老三:Observer(觀察者) : 為客戶端提供讀服務,不參與Leader選舉過程
其中:Follower 和 Observer 歸類為 Learner(學習者)
集群管理圖如下:
Leader
Leader在集群中只有一個節點,可以說是老大No.1,是zookeeper集群的中心,負責協調集群中的其他節點。從性能的角度考慮,leader可以選擇不接受客戶端的連接。
所有的跟隨者Follower與觀察者Observer節點的寫請求都會轉交給領導者Leader執行。Leader接受到一個寫請求后,首先會發送給所有的Follower,統計Follower寫入成功的數量。當有超過半數的Follower寫入成功后,Leader就會認為這個寫請求提交成功,通知所有的Follower commit這個寫操作,保證事后哪怕是集群崩潰恢復或者重啟,這個寫操作也不會丟失。
Leader的作用
- 在ZAB崩潰恢復之后,消息廣播之前,進行集群中的數據同步;
- 維持與Learner的心跳,接收Learner請求消息,並據不同的消息類型,進行不同的處理;
- Learner處理的消息類型包括:PING消息、REQUEST消息、ACK消息、REVALIDATE消息等。
其中:
- PING消息:指Learner的心跳信息;
- REQUEST消息:是Follower發送的提議信息,包括寫請求及同步請求;
- ACK消息:是Follower的對提議的回復,超過半數的Follower通過,則commit該提議;
- REVALIDATE消息:是用來延長SESSION有效時間。
Leader的工作流程簡圖如下所示,實際上流程要比下圖復雜得多,啟動了三個線程來實現功能:
Follower
Follow在集群中有多個,主要的作用有:
- 與老大Leader保持心跳連接
- 當Leader掛了的時候,經過投票后成為新的leader。leader的重新選舉是由老二Follower們內部投票決定的。
- 向Leader發送請求(PING請求、REQUEST消息、ACK請求、REVALIDATE消息)
- 處理leader發來的消息與請求
- 接收Client的請求,如果為寫請求,發送給Leader進行投票;
- 返回Client請求結果。
Follower的工作流程簡圖:
其中:
- UPTODATE消息:表示同步完成;
- REVALIDATE消息:根據Leader的REVALIDATE結果,關閉待revalidate的session還是允許其接受消息;
- SYNC消息:返回SYNC結果到客戶端,這個消息最初由客戶端發起,用來強制得到最新的數據更新。
Observer
Observer角色除了不參與Leader選舉和Proposal投票外,與Follower的作用相同。
可以說Observer是zookeeper集群中最邊緣的存在。Observer的主要作用是提高zookeeper集群的讀性能。通過leader的介紹我們知道zookeeper的一個寫操作是要經過半數以上的Follower確認才能夠寫成功的。那么當zookeeper集群中的節點越多時,zookeeper的寫性能就 越差。為了在提高zookeeper讀性能(也就是支持更多的客戶端連接)的同時又不影響zookeeper的寫性能,zookeeper集群多了一個兒子Observer,只負責:
- 與leader同步數據
- 不參與leader選舉,沒有投票權。也不參與寫操作的提議過程。
- 數據沒有事務化到硬盤。即Observer只會把數據加載到內存。
參考資料
- https://www.cnblogs.com/DeepInThought/p/11061550.html
- https://blog.csdn.net/lamfang/article/details/109039288