一、故障發現node
- 經過ping/pong消息實現故障發現:不須要Sentinel
- 跟Sentinel同樣,有主觀下線和客觀下線
二、主觀下線日誌
定義:某個節點認爲另外一個節點不可用,「偏見」it
主觀下線流程:集羣
![](http://static.javashuo.com/static/loading.gif)
三、客觀下線im
定義:當半數以上持有槽的主節點都標記某節點主觀下線客戶端
客觀下線流程:img
![](http://static.javashuo.com/static/loading.gif)
四、嘗試客觀下線di
- 通知集羣內全部節點標記故障節點爲客觀下線
- 經過故障節點的從節點觸發故障轉移流程
![](http://static.javashuo.com/static/loading.gif)
五、故障恢復時間
(1)資格檢查ping
- 每一個從節點檢查與故障主節點的斷線時間
- 超過 cluster-node-timeout * cluster-slave-validity-factor 取消資格。
- cluster-slave-validity-factor : 默認是10
(2)準備選舉時間
![](http://static.javashuo.com/static/loading.gif)
(3)選舉投票
![](http://static.javashuo.com/static/loading.gif)
(4)替換主節點
- 當前從節點取消複製變爲主節點(slaveof no one)
- 執行clusterDelSlot撤銷故障主節點負責的槽,並執行clusterAddSlot把這些槽分配給本身。
- 向集羣廣播本身的pong消息,代表已經替換了故障從節點
六、故障演練
![](http://static.javashuo.com/static/loading.gif)
七、具體步驟
- 執行kill -9 節點模擬拖機
- 觀察客戶端故障恢復時間
- 觀察各個節點的日誌