哨兵三個定時監控任務
- 每隔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最小