(1) 初始化廣播
- 前面我們說過,恢復模式具有兩個階段:Leader 選舉與初始化同步(廣播)。當完成 Leader
選舉後,此時的 Leader 還是一個準 Leader,其要經過初始化同步後才能變爲真正的 Leader。
具體過程如下:
- 爲了保證 Leader 向 Learner 發送提案的有序,Leader 會爲每一個 Learner 服務器準備一個隊列
- Leader 將那些沒有被各個 Learner 同步的事務封裝爲 Proposal
- Leader 將這些 Proposal 逐條發給各個 Learner,並在每一個 Proposal 後都緊跟一COMMIT 消息,表示該事務已經被提交,Learner 可以直接接收並執行
- Learner 接收來自於 Leader 的 Proposal,並將其更新到本地
- 當 Learner 更新成功後,會向準 Leader 發送 ACK 信息
- Leader 服務器在收到來自 Learner 的 ACK 後就會將該 Learner 加入到真正可用的 Follower列表或 Observer 列表。沒有反饋 ACK,或反饋了但 Leader 沒有收到的 Learner,Leader不會將其加入到相應列表。
(2)更新算法廣播
當集羣中的 Learner 完成了初始化狀態同步,那麼整個 zk 集羣就進入到了正常工作模式
了。
如果集羣中的 Learner 節點收到客戶端的事務請求,那麼這些 Learner 會將請求轉發給
Leader 服務器。然後再執行如下的具體過程:
- Leader 接收到事務請求後,爲事務賦予一個全局唯一的 64 位自增 id,即 zxid,通過zxid 的大小比較即可實現事務的有序性管理,然後將事務封裝爲一個 Proposal。
- Leader 根據 Follower 列表獲取到所有 Follower,然後再將 Proposal 通過這些 Follower 的隊列將提案發送給各個 Follower。
- 當 Follower 接收到提案後,會先將提案的 zxid 與本地記錄的事務日誌中的最大的 zxid進行比較。若當前提案的 zxid 大於最大 zxid,則將當前提案記錄到本地事務日誌中,並向 Leader 返回一個 ACK。(提問學員)
- 當 Leader 接收到過半的 ACKs 後,Leader 就會向所有 Follower 的隊列發送 COMMIT消息,向所有 Observer 的隊列發送 Proposal。
- 當 Follower 收到 COMMIT 消息後,就會將日誌中的事務正式更新到本地。當 Observer收到 Proposal 後,會直接將事務更新到本地。
- 無論是 Follower 還是 Observer,在同步完成後都需要向 Leader 發送成功 ACK。