為了徹底搞懂zk選舉leader的過程,需要在windows本地搭建乙個偽集群出來,通過實際操作,觀察集群的節點的變化。但是在實操過程中,發現windows搭建的一些坑,這記錄下。
1.參考此部落格進行搭建,
2.依次啟動,啟動後,無法使用zkserver.cmd status命令,無法觀察哪乙個節點是leader,各種查閱後,發現zkserver.cmd在windows上就是用不了,硬傷啊。google一下後,發現可以使用nc命令去檢視狀態,參考部落格:
3.嘗試後,發現nc命令用不了,window需要安裝nc客戶端,參考部落格:
4.執行nc命令,報錯,解決方案:
5.修改zk節點內zoo.cfg檔案,重啟集群後,生效。
前提條件:以三颱機器為例子,分別是:zk1, zk2, zk3,myid分別是1,2,3
名詞解釋:
myid: 機器服務標識id
myid一般也是數字,用來標識zk的機器,例如在zk1的data目錄下有乙個myid的檔案,裡面寫入乙個數值1,在zk2的data目錄下有乙個myid檔案,裡面寫入乙個數值2,以此類推。同時zoo.cfg的配置檔案內,也是採用server.1=xx,server2=xx。zk集群中的n是根據這裡配置的服務節點數來計算的。這裡配置了三個,n即為3。
ticktime=2000
initlimit=10
synclimit=5
datadir=e:\\aa_new_devlope\\apache_zookeeper_cluster\\zk1\\data
clientport=2181
server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883
4lw.commands.whitelist=*
sid:伺服器idsid是乙個數字,用來唯一標識一台zookeeper集群中的機器,每台機器不能重複,和myid的值一致。
zxid:事務id
zxid是乙個事務id,用來唯一標識一次伺服器狀態的變更。在某乙個時刻,集群中每台機器的zxid值不一定全都一致,這和zookeeper伺服器對於客戶端「更新請求」的處理邏輯有關。
vote:投票
leader 選舉,顧名思義必須通過投票來實現。當集群中的機器發現自己無法檢測到leader機器的時候,就會開始嘗試進行投票。
大概邏輯:
leader選舉的邏輯與人類世界的投票非常相似。從客觀公平的角度來說,投票是投給能力比較強的人,zk中可以通過zxid以及myid來對比出能力較強的節點。假如,在乙個陌生環境內投票,人與人之間都不熟,很有可能,投票一開始是投給自己,這就和zk節點在啟動一開始,會把選票投給自己一樣。但是後來發現,有其他人能力比自己強,這個時候人類世界可能會改票,zk也一樣,對比完zxid以及myid後,會有改票的操作,改完後,再把結果傳送給其他節點。每乙個zk節點都有乙個投票箱,其實就是修改投票箱內的結果,再把修改的結果傳送給其他節點,再次進行對比。最後,根據過半機制,篩選出leader。
詳細流程:
zk集群啟動時選舉
前提:
1、按照順序啟動zk1,zk2,zk3, 假設三颱zk的zxid相同,myid分別是1,2,3,zookeeper的集群規模至少是2臺機器。
2、只有啟動了兩個節點後,兩個節點能夠互相通訊,才進入選舉leader的流程。
3、在集群啟動時,一台伺服器需要去連另外一台伺服器,從而建立socket用來進行選票傳輸。那麼如果現在a伺服器去連b伺服器,同時b伺服器也去連a伺服器,那麼就會導致建立了兩條socket,我們知道socket是雙向的,socket的雙方是可以相互傳送和接收資料的,那麼現在a、b兩台伺服器建立兩條socket是沒有意義的,所以zookeeper在實現時做了限制,只允許伺服器id較大者去連伺服器id較小者,小id伺服器去連大id伺服器會被拒絕。
ps: 只能zk2連線zk1,zk3連線zk2,zk3連線zk1,但是通道是雙向的,既可以接受投票也可以寫入投票
leader宕機時的選舉流程,同以上的流程類似。假如節點在啟動時進行選舉,有可能前兩個節點啟動的速度快,那麼根據前兩個節點就已經選出了leader,後面的節點就不需要參與投票選舉了,即便後面的節點zxid和myid都比leader節點要大,也是會作為乙個follower加入。
例項演示:
zxid都相等,zk1,zk2,zk3的myid分別是1,2,3
埠說明:
218x:客戶端(應用程式)連線 zookeeper 伺服器的埠,zookeeper 會監聽這個端
288x:該伺服器與集群中的 leader 伺服器交換資訊的埠
388x:選舉通訊埠,如果集群中的 leader 伺服器掛了,需要選出乙個新的 leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠
啟動步驟:
第一台節點啟動時,會出現連線不上3883埠的異常,這個是正常的,因為目前只有這乙個節點,還暫時無法同集群內的其他節點進行選舉通訊。
第二台節點啟動完成後,我們使用nc命令,觀察下集群中的狀態:
目前啟動了兩個節點,已經選舉出了leader,第三台機器就不會再參與投票選舉了。
注意:
zookeeper集群在進行領導者選舉的過程中不能對外提供服務,根據網上的說法,最多有30秒不可用時間。這對於高可用的網際網路應用來說是致命的,所以這也是阿里選擇nacos的原因之一吧。
總結:
文章參考《從paxos到zookeeper》以及
對於leader選舉的流程有了乙個大概的認知,zk能夠保持資料一致性的原因,主要是有三點:1)leader選舉機制。2)兩階段的事務。3)過半機制。後面重點研究下zab協議以及兩階段的事務。
Zookeeper系列二 Zookeeper原理
從擴充套件性開始講起,在zk中存在的角色有leader,follower,observer。zk是讀寫分離的,所有的寫都會壓到leader上面,讀操作可以在follower上面完成。只有follower才能選擇,observer比follower級別還低。observer只是為了放大查詢能力。乙個集...
ZooKeeper系列2 ZooKeeper的執行
2 如何啟動集群 1 單機模式 使用者可以通過下面的命令來啟動 zookeeper 服務 zkserver.sh start 複製 這個命令預設情況下執行 zookeeper 的 conf 資料夾下的 zoo.cfg 配置檔案。當執行成功使用者會看到類似如下的提示介面 root ubuntu zks...
大白話系列 zookeeper
zookeeper主要服務於分布式系統,可以看做乙個分布式協調系統,主要是用來解決分布式應用中經常遇到的一些資料管理問題,如 統一命名服務 狀態同步服務 集群管理 分布式應用配置項的管理等。上面的解釋有點抽象,簡單來說zookeeper 檔案系統 監聽通知機制。zookeeper的資料結構,跟uni...