Zookeeper分散式過程協同技術 - 群首選舉
Zookeeper分散式過程協同技術 - 群首選舉
群首概念
群首為叢集中伺服器選擇出來的一個伺服器,並被叢集認可。設定群首目的在與對客戶端所發起的狀態變更請求進行排序,包括:create、setData、delete操作。群首將每一個請求轉換為一個事務並將事務傳送給追隨者,確保叢集按照群首確定的順序接受並處理這些事務。
Zookeeper事務
Zookeeper伺服器會在本地處理只讀請求(例如:exists、getData、getChildren)。如果一臺伺服器接收到客戶端的getData請求,伺服器讀取該狀態資訊,並將這些資訊返回客戶端。由於伺服器在本地處理讀請求,所以在處理以只讀請求為主要負載時,效能會比較高。
那些會改變狀態的客戶端請求(create、delete、setData)將會被轉發給群首,由群首執行相應的請求,完成狀態的更新,這就是Zookeeper的事務。
選舉過程
每個伺服器啟動後進入LOOKING狀態,伺服器之間進行通訊來選舉一個群首,通過資訊交換對群首選舉達成共識。在本次選舉中勝出的伺服器將進入LEADING狀態,而叢集中其他伺服器將進入FOLLOWING狀態。
群首選舉訊息(leader election notifications)或簡單的稱為通知。當一個伺服器進入LOOKING狀態就會向叢集中的每一個伺服器傳送一個通知訊息。訊息中包含該伺服器的投票資訊。
投票資訊包含伺服器識別符號(sid)和最近執行的事務的zxid資訊,例如投票資訊(1,5)代表機器ID為1,最近執行的事務zxid為5。
zxid為一個long型(64位)整數,分為2部分:時間戳部分和計數器部分,每個部分為32位。
當一個伺服器收到一個投票資訊,該伺服器將會根據以下規則修改自己的投票資訊:
- 將接受的voteId和voteZxid作為一個識別符號,並獲取接收方當前的投票中的zxid,用myZxid和mySid表示接收方伺服器自己的值。
- 如果(voteZxid > myZxid)或者(voteZxid = myZxid 且 voteId > mySid),保留當前的投票資訊。
- 否則,修改自己的投票資訊,將voteZxid賦值給myZxid,將voteId賦值給mySid。
當一個伺服器收到的仲裁數量的伺服器發來的投票資訊都一樣時,就表示群首選舉成功,如果被選舉的群首為某個伺服器自己,該伺服器將會開始行使群首角色,否則就會成為一個追隨者並嘗試連線被選舉的群首伺服器。一旦連線成功,追隨者和群首之間將會進行狀態同步,在同步完成後,追隨者才可以處理新的請求。
通過例子來演示選舉過程,三臺伺服器在分別傳送出不同的選舉投票資訊,其投票值包含伺服器的識別符號和最新的zxid。每個伺服器都會收到另外兩個伺服器傳送的投票資訊,在第一輪之後,伺服器S2和S3將會改變其投票資訊為(1,6),之後伺服器S2和S3在改變投票資訊之後會發送新的通知訊息,S1伺服器在接收到仲裁數量的通知訊息擁有一樣的投票資訊,最後S1被選舉出為叢集的群