Redis哨兵領導者、主節點選舉、故障轉移


一、哨兵實現原理:三個定時任務,也回答了三個問題:

 

問題一: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表示同意當前節點成為領導者


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM