哨兵三個定時監控任務
- 每隔10s每隔sentinel節點會向主節點和從節點發送info命令獲取最新的拓撲結構
- 每隔2S,每個sentinel節點會向redis數據節點的__sentiel__:hellp發送sentinel節點信息,用於了解新節點相關信息,如果是新節點則將其保存下來。並與其建立連接。
- 每隔1S,每隔sentinel節點會向主節點和從節點其余的sentinel節點發送平命令作為心跳監測,來確定這些節點是否可達。
總結
- 每隔10s發送獲取拓撲心跳
- 每隔2S獲取新節點數據
- 每隔1S監測節點和哨兵通信正常
下線規則
- 主觀下線:涉及down-after-millseconds參數,如果某一個哨兵與某一個redis節點在這個參數時間中沒有連接成功,則說明有問題,則下線
- 客觀下線:如果通過主觀下線的是主節點的時候,由於涉及到后面的leader選舉,則需要進行客觀判斷,,通過參數
is-master-down-by-addr向所有的哨兵節點詢問,如果大部分都認為該節點有問題,則進行下線操作。
sentinel選舉
Raft
- 發送
is-master-down-by-addr進行要求將自己設置為leader. - 收到命令的sentinel會判斷,如果其沒有同意過其他的sentinel節點的命令則同意,否則拒絕
- 如果該sentinel發現自己的票數大於等於max(quorum,num(sentinels)/2);則將成為領導者
- 將進入下一次選舉
總結 選舉的過程非常快,基本上誰先完成客觀下線,則誰就是領導者
故障轉移
當sentinel選舉完成后,需要對數據進行同步,則會出現選舉redis主節點
- 過濾(主觀下線,斷線)的節點
- 選擇slave-priority優先級搞的節點列表,如果存在則返回,不存在則繼續
- 選擇復制偏移量最大的從節點,如果存在則返回,不存在則繼續
- 選擇runid最小的從節點
總結 過濾無用節點->選擇優先級高->選擇偏移量大->選擇runid最小
