當前位置:網站首頁>每天進步“億點點”,面試官老愛問適配器模式與外觀模式

每天進步“億點點”,面試官老愛問適配器模式與外觀模式

2021-08-20 06:08:46 代碼席爾瓦

人類選舉的基本原理

講解 Zookeeper 選舉過程前先來介紹一下人類的選舉。

我們每個人或多或少都經曆過幾次選舉,在投票的過程中可能會遇到這樣幾種情况:

情况1:自己與幾個候選人都比較熟,你會將票投給你認為能力比較强的人;

熟人選舉

情况2:自己也是候選人,並且與其他幾個候選人都不熟,這個時候你肯定想著要去拉票,因為覺得自己才是最厲害的人呀,所有人都應該把票投給我。但是遺憾的是在拉票的過程中,你發現別人比你强,你開始自卑了,最終還是把票投給了自己認為最强的人。

自己參與選舉

所有人都投完票之後,最後從投票箱中進行統計,獲得票數最多的人當選。

思維導圖

在整個投票過程中我們可以提煉出四個最核心的概念:

  • 候選人能力:投票的基本原則是選最强的人。
  • 遇强改投:如果後面發現更强的人可以改投票。
  • 投票箱:所有人的票都會放在投票箱。
  • 領導者:得票最多的人即為領導者。

從人類選舉的原理我們來簡單推導一下Zookeeper的選舉原理。

Zookeeper選舉的基本原理

注意如果 Zookeeper 是單機部署是不需要選舉的,集群模式下才需要選舉。

Zookeeper 的選舉原理和人類選舉的邏輯類似,套用一下人類選舉的四個基本概念詳細解釋一下Zookeeper。

  • 個人能力

如何衡量 Zookeeper 節點個人能力?答案是靠數據是否够新,如果節點的數據越新就代錶這個節點的個人能力越强,是不是感覺很奇怪,就是這麼定的!

在 Zookeeper 中通常是以事務id(後面簡稱zxid)來標識數據的新舊程度(版本),節點最新的zxid越大代錶這個節點的數據越新,也就代錶這個節點能力越强。

zxid 的全稱是 ZooKeeper Transaction Id,即 Zookeeper 事務id。

  • 遇强改投

在集群選舉開始時,節點首先認為自己是最强的(即數據是最新的),然後在選票上寫上自己的名字(包括zxid和sid),zxid 是事務id,sid 唯一標識自己。

緊接著會將選票傳遞給其他節點,同時自己也會接收其他節點傳過來的選票。每個節點接收到選票後會做比較,這個人是不是比我强(zxid比我大),如果比較强,那我就需要改票,明明別人比我强,我也不能厚著臉皮對吧。

  • 投票箱

與人類選舉投票箱稍微有點不一樣,Zookeeper 集群會在每個節點的內存中維護一個投票箱。節點會將自己的選票以及其他節點的選票都放在這個投票箱中。由於選票是互相傳閱的,所以最終每個節點投票箱中的選票會是一樣的。

  • 領導者

在投票的過程中會去統計是否有超過一半的選票和自己選擇的是同一個節點,即都認為某個節點是最强的。一旦集群中有超過半數的節點都認為某個節點最强,那該節點就是領導者了,投票也宣告結束。

什麼場景下 Zookeeper 需要選舉?

當 Zookeeper 集群中的一臺服務器出現以下兩種情况之一時,需要進入 Leader 選舉。

(1)服務器初始化啟動。

(2)服務器運行期間 Leader 故障。

啟動時期的 Leader 選舉

假設一個 Zookeeper 集群中有5臺服務器,id從1到5編號,並且它們都是最新啟動的,沒有曆史數據。

集群剛啟動選舉過程

假設服務器依次啟動,我們來分析一下選舉過程:

(1)服務器1啟動

發起一次選舉,服務器1投自己一票,此時服務器1票數一票,不够半數以上(3票),選舉無法完成。

投票結果:服務器1為1票。

服務器1狀態保持為LOOKING。

(2)服務器2啟動

發起一次選舉,服務器1和2分別投自己一票,此時服務器1發現服務器2的id比自己大,更改選票投給服務器2。

投票結果:服務器1為0票,服務器2為2票。

服務器1,2狀態保持LOOKING

(3)服務器3啟動

發起一次選舉,服務器1、2、3先投自己一票,然後因為服務器3的id最大,兩者更改選票投給為服務器3;

投票結果:服務器1為0票,服務器2為0票,服務器3為3票。此時服務器3的票數已經超過半數(3票),服務器3當選Leader

服務器1,2更改狀態為FOLLOWING,服務器3更改狀態為LEADING。

(4)服務器4啟動

發起一次選舉,此時服務器1,2,3已經不是LOOKING 狀態,不會更改選票信息。交換選票信息結果:服務器3為3票,服務器4為1票。此時服務器4服從多數,更改選票信息為服務器3。

服務器4並更改狀態為FOLLOWING。

(5)服務器5啟動

與服務器4一樣投票給3,此時服務器3一共5票,服務器5為0票。

服務器5並更改狀態為FOLLOWING。

最終的結果

服務器3是 Leader,狀態為 LEADING;其餘服務器是 Follower,狀態為 FOLLOWING。

寫在最後

很多人感歎“學習無用”,實際上之所以產生無用論,是因為自己想要的與自己所學的匹配不上,這也就意味著自己學得遠遠不够。無論是學習還是工作,都應該有主動性,所以如果擁有大廠夢,那麼就要自己努力去實現它。

以上學習資料均免費放送,最後祝願各比特身體健康,順利拿到心儀的offer!

由於文章的篇幅有限,所以這次的螞蟻金服和京東面試題答案整理在了PDF文檔裏

資料獲取方式:點贊+評論我的文章,關注我, 然後戳這裏即可免費領取

螞蟻、京東Java崗4面:原理+索引+底層+分布式+優化等,已拿offer

螞蟻、京東Java崗4面:原理+索引+底層+分布式+優化等,已拿offer

螞蟻、京東Java崗4面:原理+索引+底層+分布式+優化等,已拿offer

版權聲明
本文為[代碼席爾瓦]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2021/08/20210820060846243l.html

隨機推薦