- 當集羣正在啓動過程中,或 Leader 崩潰後,集羣就進入了恢復模式。對於要恢復的數
據狀態需要遵循三個原則。
(1) Leader 的主動出讓原則
- 若集羣中 Leader 收到的 Follower 心跳數量沒有過半,此時 Leader 會自認爲自己與集羣
的連接已經出現了問題,其會主動修改自己的狀態爲 LOOKING,去查找新的 Leader。爲了防止集羣出現腦裂。
而其它 Server 由於有過半的主機認爲已經丟失了 Leader,所以它們會發起新的 Leader
選舉,選出一個新的 Leader。
(2) 已被處理過的消息不能丟原則
- 當 Leader 收到超過半數 Follower 的 ACKs 後,就向各個 Follower 廣播 COMMIT 消息,批准各個 Server 執行該寫操作事務。當各個 Server 在接收到 Leader 的 COMMIT 消息後就會在本地執行該寫操作,然後會向客戶端響應寫操作成功。
- 但是如果在非全部 Follower 收到 COMMIT 消息之前 Leader 就掛了,這將導致一種後
果:部分 Server 已經執行了該事務,而部分 Server 尚未收到 COMMIT 消息,所以其並沒有
執行該事務。當新的 Leader 被選舉出,集羣經過恢復模式後需要保證所有 Server 上都執行
了那些已經被部分 Server 執行過的事務。
(3) 被丟棄的消息不能再現原則
- 當在 Leader 新事務已經通過,其已經將該事務更新到了本地,但所有 Follower 還都沒
有收到 COMMIT 之前,Leader 宕機了(比前面敘述的宕機更早),此時,所有 Follower 根本就不知道該 Proposal 的存在。當新的 Leader 選舉出來,整個集羣進入正常服務狀態後,之前掛了的 Leader 主機重新啓動並註冊成爲了 Follower。若那個別人根本不知道的 Proposal還保留在那個主機,那麼其數據就會比其它主機多出了內容,導致整個系統狀態的不一致。所以,該 Proposa 應該被丟棄。類似這樣應該被丟棄的事務,是不能再次出現在集羣中的,應該被清除。