Redis sentinel基本原理分爲如下幾方面:
- Redis sentinel的三個定時任務
- 主觀下線和客觀下線
- Sentinel領導者選舉
- 故障轉移
sentinel的三個定時任務:完成對各個節點發現和監控
一、每隔10秒,每一個sentinel節點會向主節點和從節點發送info命令得到最新的拓撲結構;
- 經過向主節點執行info命令,得到從節點的信息,這也是爲何sentinel節點不須要顯示配置監控從節點。
- 當有新的從節點加入時均可以當即感知出來
- 節點不可達或者故障轉移後,能夠經過info命令實現更新節點拓撲信息
二、每隔2秒,每一個sentinel節點會向Redis數據節點的__sentinel__:hello頻道上發送該sentinel節點對於主節點的判斷以及當前sentinel節點的信息,同時每一個sentinel節點也會訂閱該頻道,來了解其餘sentinel節點以及他們對主節點的判斷;
- 發現新的sentinel節點,經過訂閱__sentinel__:hello頻道
- sentinel節點之間交換主節點的狀態,做爲後面客觀下線和領導者選舉的依據
三、每隔1秒,每一個sentinel節點會向主節點、從節點、其他sentinel節點發送一條ping命令作一次心跳檢測,來確認這些節點當前是否可達。
客觀下線和主觀下線
一、主觀下線
每隔sentinel節點會每隔1秒對主節點、從節點、其他sentinel節點發送ping命令作心跳檢測,當這些節點超過down-after-milliseconds沒有進行有效回覆,sentinel節點就會對該節點作失敗斷定,這種行爲叫主觀下線。
二、客觀下線
當sentinel主觀下線的節點是主節點時,該sentinel節點會經過sentinel is-master-down-by-addr命令向其餘sentinel節點詢問對主節點的判斷,當超過quorum個數,sentinel節點認爲主節點確實有問題,這時該sentinel節點會作出客觀下線的決定。
領導者sentinel節點選舉
假如sentinel節點對主節點作出了客觀下線,須要在sentinel集羣中選舉出一個領導者進行故障轉移。
Redis使用Raft算法實現領導者選舉,具體步驟:
- 每一個在線的sentinel節點都有資格成爲領導者,當一個sentinel節點確認主節點客觀下線時,會向其餘sentinel節點發送sentinel is-master-down-by-addr命令,要求將本身設置爲領導者
- 收到命令的sentinel節點,若是沒有贊成其餘sentinel節點的sentinel is-master-down-by-addr命令,將贊成該請求,不然拒絕;
- 若是該sentinel及誒單發現本身的票數已經大於max(quorum,num(sentinel)/2+1),那麼它將成爲領導者;
- 若是此過程沒有選舉出領導者,將進行下一次選舉;
- 每一個sentinel節點只有一票;
故障轉移
領導者sentinel節點負責故障轉移步驟:
一、在從節點列表中選出一個節點作爲新的主節點,選擇方式:
- 過濾(主觀下線、斷線)、5秒內沒有回覆過sentinel節點ping響應、與主節點失聯超過down-after-millionseconds*10秒
- 選擇slave-priority(從節點優先級)最高的從節點列表,若是存在則返回,不存在則繼續
- 選擇複製偏移量最大的從節點(複製的最完整),若是存在則返回,不存在則繼續;
二、sentinel領導者節點會第一步選出來的從節點執行slaveof no one命令讓其成爲主節點;
三、sentinel領導者會向剩餘的從節點發送命令,讓它們成爲新主節點的從節點,複製規則和Parallel-syncs參數有關;