談你對Zookeeper 選舉原理的理解
?1.什么是Leader選舉
首先,Zookeeper 集群節點由三種角色組成,分別是:
Leader,負責所有事務請求的處理,以及過半提交的投票發起和決策。
Follower,負責接收客戶端的非事務請求,而事務請求會轉發給 Leader 節點來處理, 另外,Follower 節點還會參與 Leader 選舉的投票。
Observer,負責接收客戶端的非事務請求,事務請求會轉發給 Leader 節點來處理,Observer 節點不參與任何投票,只是為了擴展 Zookeeper 集群來分擔讀操作的壓力。
其次,Zookeeper 集群是一種典型的中心化架構,也就是會有一個 Leader 作為決策節點,專門負責事務請求的處理和數據的同步。這種架構的好處是可以減少集群架構里面數據同步的復雜度,集群管理會更加簡單和穩定。
但是,會帶來 Leader 選舉的一個問題,也就是說,如果 Leader 節點宕機了,為了保證集群繼續提供可靠的服務,Zookeeper 需要從剩下的 Follower 節點里面去選舉一個新的節點作為Leader,也就是所謂的 Leader 選舉。
2.選舉原理
接下來,給大家介紹一下Zookeeper的選舉原理。
首先呢,Zookeeper中的每一個節點都會向集群里面的其他節點發送一個票據 Vote,這個票據有三個屬性。
epoch, 邏輯時鐘,用來表示當前票據是否過期。
zxid,事務 id,表示當前節點最新存儲的數據的事務編號
myid,服務器 id,在 myid 文件里面填寫的數字。
每個節點都會選自己當 Leader,所以第一次投票的時候攜帶的是當前節點的信息。
接下來每個節點用收到的票據和自己節點的票據做比較,根據 epoch、zxid、myid的順序逐一比較,以值最大的一方獲勝。比較結束以后這個節點下次再投票的時候,發送的投票請求就是獲勝的 Vote 信息。
然后,通過多輪投票以后,每個節點都會去統計當前達成一致的票據,以少數服從多數的方式,最終獲得票據最多的節點成為 Leader。
最后我再補充一下,為什么要選擇 epoch/zxid/myid 作為投票評判依據?我是這么理解的。
首先,epoch ,因為網絡通信延遲的可能性,有可能在新一輪的投票里面收到上一輪投票的票據,這種數據應該丟棄,否則會影響投票的結果和效率。
然后,zxid 越大,說明這個節點的數據越接近 leader,所以用 zxid 做判斷條件是為了避免數據丟失的問題
最后,myid是服務器 id,這個是避免投票時間過長,直接用 myid 最大值作為快速終結投票的屬性。
Leader 選舉是一個比較復雜的問題,它涉及到集群節點的數據一致性算法。在很多中間件里面都有涉及到類似的問題,這個思想其實還是很有研究價值的。除此之外,還有 Paxos、raft、等一致性算法。
以上就是我對Zookeeper選舉原理的理解。