一、哨兵實現原理:三個定時任務,也回答了三個問題:
問題一:sentinel沒有配置從節點信息如何知道從節點信息的?
1、每隔10秒,sentinel進行向主節點發送info命令,用於發現新的slave節點
問題二、如何加入新的sentinel的
2、每隔2秒,向redis數據節點_sentinel_:hello頻道發送本sentinel節點的信息和對主節點的判斷:這是進行對主節點進行客觀下線和領導者選舉的重要依據;也是發現新sentinel節點的重要依據
問題三:如何判斷一個節點的需要主觀下線的?
3、每隔1秒每個sentinel對其他的redis節點(master,slave,sentinel)執行ping操作,對於master來說
若超過down-after-milliseconds內沒有回復,就對該節點進行主觀下線並詢問其他的Sentinel節點是否可以客觀下線
二、對redis節點失敗達成共識
主觀下線:每隔1秒每個sentinel對其他的redis節點(master,slave,sentinel)執行ping操作,若超過down-after-milliseconds內沒有回復,就對該節點進行主觀下線,每個sentinel節點對redis節點失敗的“偏見”
客觀下線:當sentinel主觀下線的節點是主節點時,sentinel會通過命令sentinel is-master-down-by-addr來詢問其sentinel對主節點的判斷,如果超過quorum個數就認為主節點需要客觀下線, 所有sentinel節點對redis節點失敗達成共識
三、選舉sentinel領導者 使用的raft算法(https://raft.github.io),大致思路:
1、每個做主觀下線的sentinel節點像其他sentinel節點發送命令,要求將自己設置為領導者
2、接收到的sentinel可以同意或者拒絕
3、如果該sentinel節點發現自己的票數已經超過半數並且超過了quorum
4、如果此過程選舉出了多個領導者,那么將等待一段時重新進行選舉
四、主節點選舉:選舉出可以代替主節點的slave從節點
1、選擇健康狀態從節點(排除主觀下線、斷線),排除5秒鍾沒有心跳的、排除主節點失聯超過10*down-after-millisecends
2、選擇slave-priority高的從節點優先級列表
4、選擇偏移量大的
5、選擇runid小的
五、進行故障轉移
1、sentinel的領導者從slave中選舉出合適的從節點進行故障轉移
2、對選取的slave執行slave of no one
3、更新應用程序端的鏈接到新的主節點
4、對其他從節點變更master為新的節點
5、修復原來的master並將其設置為新master的slave
六、:sentinel is-master-down-by-addr命令
1、當前sentinel節點如果判斷主節點是主觀下線之后會向其他sentinel發送此命令詢問其他節點對主節點的判斷
sentinel is-master-down-by-addr ip port epoch runid
入參:runid會傳“*” 標識要詢問目標sentinel是否主觀下線主節點 epoch傳入當前紀元
返回參數:down_state:返回目標的判斷,1是下線 0是不下線
leader_runid:返回“*”
2、當進行領導者選舉時每個判斷客觀下線的sentinel都會向其他sentinel發送此命令
sentinel is-master-down-by-addr ip port epoch runid
入參:runid是當前sentinel的runid,標識希望目標節點同意自己成為領導者
返回參數:leader_runid 返回具體的runid表示同意當前節點成為領導者