ZooKeeper 技术内幕,Leader 选举是一个什么样的过程?
幾個問題,引發思考:
什么時候 leader 選舉?
選舉的過程?
選舉過程中,是否能提供服務?
選舉結果,是否會丟失數據?
服務器角色
2 個小問題:
服務器節點有多少角色?
每個角色的作用?
角色
ZK 集群中,服務器節點,有 3 中角色:
Leader:ZK 集群工作機制的核心,主要工作:
-
調度者:集群內部各個服務節點的調度者
-
事務請求:事務請求的唯一調度和處理者,保證集群事務處理的順序性
Follower:主要職責:
-
非事務請求:Follower 直接處理非事務請求,對于事務請求,轉發給 Leader
-
Proposal 投票:Leader 上執行事務時,需要 Follower 投票,Leader 才真正執行
-
Leader 選舉投票
Observer:ZK?3.3.0+?版本開始引入,提升 ZK 集群的非事務處理能力,主要職責:
-
非事務請求:Follower 直接處理非事務請求,對于事務請求,轉發給 Leader
特別說明:Observer 跟 Follower 的唯一區別:
Follower 參與投票:Leader 選舉、Proposal 提議投票(事務執行確認)
Observer 不參與投票:只用于提供非事務請求的處理
疑問:節點成為 Follower 還是 Observer 是 配置文件中設定的?
Leader 選舉
2 個小問題:
什么時候,進行 Leader 選舉?
Leader 選舉的具體過程,是什么?
時機
下面任何一種情況,都會觸發 Leader 選舉:
啟動時,集群服務器剛啟動
運行時,Leader 崩潰
服務器的狀態流轉:
過程
Leader 選舉過程,本質就是廣播優先級消息的過程,選出數據最新的服務節點,選出優先級最高的服務節點,基本步驟:
各個服務器節點,廣播自己的優先級標識?(sid,zxid)
服務器節點收到其他廣播消息后,跟自己的優先級對比,自己優先級低,則變更當前節點投票的優先級(sid,zxid)?,并廣播變更后的結果
當任意一個服務器節點收到的投票數,超過了法定數量(quorum),則,升級為 Leader,并廣播結果。
疑問:法定數量(quorum),一般設置為集群規模大小的半數以上,quorum 在哪配置的?
特別說明:
服務器節點的優先級標識:(sid,zxid)
優先比較?zxid?(事務 ID),其次比較sid(服務器ID)
sid?(服務器 ID) 是節點配置文件中設定的
當前服務器上的?zxid?是什么時候設定的?是在 Leader 執行事務過程中,向當前服務器同步的?如何活的當前服務器上的?zxid?
具體選舉過程:
補充說明:
由于網絡延時,節點得不到足夠多廣播信息時,會做出錯誤的投票判斷,糾正過程更耗時
選舉過程中,服務器節點會等待一定時間,再廣播投票信息,時間間隔一般設定為?200 ms
上面 Leader 選舉,采取事件觸發?Push 方式?廣播消息,稱為?快速 Leader 選舉,因為之前的 Leader 選舉,采用?Pull 方式,每隔?1s?拉取一次。
疑問:
服務器節點,等待?200ms?的起始時間點是什么?是收到一輪新投票消息,開始計時?
RE:
正常情況下,投票信息是事件觸發,廣播出去的;
當某個服務器節點,判斷支持當前節點的投票數量 >=?法定數量(quorum),則,仍然等待?200ms,確認是否有更優的投票。
真正的投票信息:
| id | 被推舉 Leader 的 sid |
| zxid | 被推舉 Leader 的事務ID |
| electionEpoch | 投票的輪數,約束:同一輪投票,計數有效 |
| peerEpoch | 被推舉 Leader 的 epoch |
| state | 當前服務器的狀態 |
一次 Leader 選舉過程,屬于同一個?electionEpoch,結束時,會選出新的 Leader;服務器節點,在比較?(sid,zxid)?之前,會先比較選舉輪次?electionEpoch,只有同一輪次的 Leader 投票信息才是有效的:
外部投票輪次 > 內部投票輪次,更新內部投票,并且觸發當前節點投票信息的重新廣播
外部投票輪次 < 內部投票輪次,直接忽略當前的外部投票
外部投票輪次 = 內部投票輪次,進一步比較?(sid,zxid)
疑問:Leader 負責執行所有的事務操作,一次事務操作,
Leader 如何將事務操作同步到 Follower 和 Observer ?同步、異步?
如何保證同步過程中,事務一定執行成功?事務失敗的影響?
Leader 上執行的事務狀態,通過?Zab?狀態更新的廣播協議,更新到 Follower 和 Observer。
附錄
分布式系統 Leader 選舉:腦裂
腦裂(split brain):服務器集群的 2 個子集,能夠同時獨立選舉 Leader,并正常運行,形成 2 個集群。
解決辦法:Leader 選舉的法定數量(quorum),超過正常集群的半數。
Leader 選舉的必要條件:節點數量 >?法定數量。
?
來源 |?https://urlify.cn/yqqmum
總結
以上是生活随笔為你收集整理的ZooKeeper 技术内幕,Leader 选举是一个什么样的过程?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于 Spring Boot 的车牌识别
- 下一篇: Spring 常犯的十大错误,打死都不要